From 9d2d73137e0519268a65d97c9d2f1729635376a4 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 11:10:17 +0530 Subject: [PATCH 01/24] Clean up --- .changeset/README.md | 8 - .changeset/config.json | 11 - .github/FUNDING.yml | 14 - .github/ISSUE_TEMPLATE/bug_report.md | 40 --- .github/ISSUE_TEMPLATE/feature_request.md | 19 -- .github/workflows/publish.yml | 66 ---- .github/workflows/test.yml | 36 --- .gitignore | 43 --- .npmrc | 1 - .prettierignore | 4 - .prettierrc | 9 - .tkb | 36 --- .vscode/extensions.json | 6 - .vscode/settings.json | 32 -- CODE_OF_CONDUCT.md | 53 ---- LICENSE | 21 -- README.md | 144 --------- contributing.md | 90 ------ esbuild-plugin-react18/CHANGELOG.md | 81 ----- .../__tests__/buildReplacePatterns.test.ts | 56 ---- .../__tests__/defaultOptions.test.ts | 29 -- .../__tests__/ignorePatterns.test.ts | 79 ----- .../__tests__/sourceReplacePatterns.test.ts | 57 ---- esbuild-plugin-react18/package.json | 61 ---- esbuild-plugin-react18/scope.js | 23 -- esbuild-plugin-react18/src/constants.ts | 8 - esbuild-plugin-react18/src/index.ts | 200 ------------ esbuild-plugin-react18/touchup.js | 58 ---- esbuild-plugin-react18/tsconfig.json | 14 - esbuild-plugin-react18/vitest.config.ts | 13 - esbuild-react18.jpg | Bin 40727 -> 0 bytes examples/nextjs/.eslintrc.js | 3 - examples/nextjs/.gitignore | 34 -- examples/nextjs/README.md | 28 -- examples/nextjs/app/favicon.ico | Bin 1150 -> 0 bytes examples/nextjs/app/globals.css | 79 ----- examples/nextjs/app/layout.tsx | 28 -- examples/nextjs/app/page.module.css | 290 ------------------ examples/nextjs/app/page.tsx | 58 ---- examples/nextjs/next-env.d.ts | 5 - examples/nextjs/next.config.js | 4 - examples/nextjs/package.json | 28 -- examples/nextjs/tsconfig.json | 8 - examples/vite/.eslintrc.cjs | 15 - examples/vite/.gitignore | 37 --- examples/vite/README.md | 25 -- examples/vite/index.html | 13 - examples/vite/package.json | 32 -- examples/vite/public/vite.svg | 1 - examples/vite/src/App.css | 42 --- examples/vite/src/App.tsx | 37 --- examples/vite/src/assets/react.svg | 1 - examples/vite/src/index.css | 67 ---- examples/vite/src/main.tsx | 10 - examples/vite/src/vite-env.d.ts | 1 - examples/vite/tsconfig.json | 24 -- examples/vite/tsconfig.node.json | 10 - examples/vite/vite.config.ts | 7 - package.json | 18 -- .../.eslintrc.js | 3 - .../esbuild-plugin-react18-example/.gitignore | 2 - .../esbuild-plugin-react18-example/README.md | 33 -- .../package.json | 75 ----- .../src/client/index.ts | 9 - .../src/client/star-me/ignore-me.ts | 5 - .../src/client/star-me/index.ts | 3 - .../src/client/star-me/star-me.test.tsx | 35 --- .../src/client/star-me/star-me.tsx | 22 -- .../src/declaration.d.ts | 1 - .../src/index.ts | 4 - .../src/server/constants.ts | 3 - .../src/server/fork-me/fork-me.module.css | 4 - .../src/server/fork-me/fork-me.test.tsx | 22 -- .../src/server/fork-me/fork-me.tsx | 67 ---- .../src/server/fork-me/index.ts | 1 - .../src/server/index.ts | 8 - .../esbuild-plugin-react18-example/touchup.js | 22 -- .../tsconfig-build.json | 10 - .../tsconfig.json | 5 - .../tsup.config.ts | 13 - .../vitest.config.ts | 18 -- packages/eslint-config-custom/README.md | 3 - packages/eslint-config-custom/library.js | 33 -- packages/eslint-config-custom/next.js | 43 --- packages/eslint-config-custom/package.json | 10 - .../eslint-config-custom/react-internal.js | 40 --- packages/tsconfig/base.json | 21 -- packages/tsconfig/nextjs.json | 21 -- packages/tsconfig/package.json | 9 - packages/tsconfig/react-library.json | 11 - pnpm-workspace.yaml | 4 - tsconfig.json | 6 - turbo.json | 19 -- 93 files changed, 2802 deletions(-) delete mode 100644 .changeset/README.md delete mode 100644 .changeset/config.json delete mode 100644 .github/FUNDING.yml delete mode 100644 .github/ISSUE_TEMPLATE/bug_report.md delete mode 100644 .github/ISSUE_TEMPLATE/feature_request.md delete mode 100644 .github/workflows/publish.yml delete mode 100644 .github/workflows/test.yml delete mode 100644 .gitignore delete mode 100644 .npmrc delete mode 100644 .prettierignore delete mode 100644 .prettierrc delete mode 100644 .tkb delete mode 100644 .vscode/extensions.json delete mode 100644 .vscode/settings.json delete mode 100644 CODE_OF_CONDUCT.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 contributing.md delete mode 100644 esbuild-plugin-react18/CHANGELOG.md delete mode 100644 esbuild-plugin-react18/__tests__/buildReplacePatterns.test.ts delete mode 100644 esbuild-plugin-react18/__tests__/defaultOptions.test.ts delete mode 100644 esbuild-plugin-react18/__tests__/ignorePatterns.test.ts delete mode 100644 esbuild-plugin-react18/__tests__/sourceReplacePatterns.test.ts delete mode 100644 esbuild-plugin-react18/package.json delete mode 100644 esbuild-plugin-react18/scope.js delete mode 100644 esbuild-plugin-react18/src/constants.ts delete mode 100644 esbuild-plugin-react18/src/index.ts delete mode 100644 esbuild-plugin-react18/touchup.js delete mode 100644 esbuild-plugin-react18/tsconfig.json delete mode 100644 esbuild-plugin-react18/vitest.config.ts delete mode 100644 esbuild-react18.jpg delete mode 100644 examples/nextjs/.eslintrc.js delete mode 100644 examples/nextjs/.gitignore delete mode 100644 examples/nextjs/README.md delete mode 100644 examples/nextjs/app/favicon.ico delete mode 100644 examples/nextjs/app/globals.css delete mode 100644 examples/nextjs/app/layout.tsx delete mode 100644 examples/nextjs/app/page.module.css delete mode 100644 examples/nextjs/app/page.tsx delete mode 100644 examples/nextjs/next-env.d.ts delete mode 100644 examples/nextjs/next.config.js delete mode 100644 examples/nextjs/package.json delete mode 100644 examples/nextjs/tsconfig.json delete mode 100644 examples/vite/.eslintrc.cjs delete mode 100644 examples/vite/.gitignore delete mode 100644 examples/vite/README.md delete mode 100644 examples/vite/index.html delete mode 100644 examples/vite/package.json delete mode 100644 examples/vite/public/vite.svg delete mode 100644 examples/vite/src/App.css delete mode 100644 examples/vite/src/App.tsx delete mode 100644 examples/vite/src/assets/react.svg delete mode 100644 examples/vite/src/index.css delete mode 100644 examples/vite/src/main.tsx delete mode 100644 examples/vite/src/vite-env.d.ts delete mode 100644 examples/vite/tsconfig.json delete mode 100644 examples/vite/tsconfig.node.json delete mode 100644 examples/vite/vite.config.ts delete mode 100644 package.json delete mode 100644 packages/esbuild-plugin-react18-example/.eslintrc.js delete mode 100644 packages/esbuild-plugin-react18-example/.gitignore delete mode 100644 packages/esbuild-plugin-react18-example/README.md delete mode 100644 packages/esbuild-plugin-react18-example/package.json delete mode 100644 packages/esbuild-plugin-react18-example/src/client/index.ts delete mode 100644 packages/esbuild-plugin-react18-example/src/client/star-me/ignore-me.ts delete mode 100644 packages/esbuild-plugin-react18-example/src/client/star-me/index.ts delete mode 100644 packages/esbuild-plugin-react18-example/src/client/star-me/star-me.test.tsx delete mode 100644 packages/esbuild-plugin-react18-example/src/client/star-me/star-me.tsx delete mode 100644 packages/esbuild-plugin-react18-example/src/declaration.d.ts delete mode 100644 packages/esbuild-plugin-react18-example/src/index.ts delete mode 100644 packages/esbuild-plugin-react18-example/src/server/constants.ts delete mode 100644 packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.module.css delete mode 100644 packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.test.tsx delete mode 100644 packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.tsx delete mode 100644 packages/esbuild-plugin-react18-example/src/server/fork-me/index.ts delete mode 100644 packages/esbuild-plugin-react18-example/src/server/index.ts delete mode 100644 packages/esbuild-plugin-react18-example/touchup.js delete mode 100644 packages/esbuild-plugin-react18-example/tsconfig-build.json delete mode 100644 packages/esbuild-plugin-react18-example/tsconfig.json delete mode 100644 packages/esbuild-plugin-react18-example/tsup.config.ts delete mode 100644 packages/esbuild-plugin-react18-example/vitest.config.ts delete mode 100644 packages/eslint-config-custom/README.md delete mode 100644 packages/eslint-config-custom/library.js delete mode 100644 packages/eslint-config-custom/next.js delete mode 100644 packages/eslint-config-custom/package.json delete mode 100644 packages/eslint-config-custom/react-internal.js delete mode 100644 packages/tsconfig/base.json delete mode 100644 packages/tsconfig/nextjs.json delete mode 100644 packages/tsconfig/package.json delete mode 100644 packages/tsconfig/react-library.json delete mode 100644 pnpm-workspace.yaml delete mode 100644 tsconfig.json delete mode 100644 turbo.json diff --git a/.changeset/README.md b/.changeset/README.md deleted file mode 100644 index e5b6d8d6..00000000 --- a/.changeset/README.md +++ /dev/null @@ -1,8 +0,0 @@ -# Changesets - -Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works -with multi-package repos, or single-package repos to help you version and publish your code. You can -find the full documentation for it [in our repository](https://github.com/changesets/changesets) - -We have a quick list of common questions to get you started engaging with this project in -[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json deleted file mode 100644 index ab848d1a..00000000 --- a/.changeset/config.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json", - "changelog": "@changesets/cli/changelog", - "commit": false, - "fixed": [], - "linked": [], - "access": "restricted", - "baseBranch": "main", - "updateInternalDependencies": "patch", - "ignore": [] -} diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 95f5d426..00000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,14 +0,0 @@ -# These are supported funding model platforms - -github: [mayank1513] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] -polar: mayank1513 -patreon: # Replace with a single Patreon username -open_collective: # Replace with a single Open Collective username -ko_fi: # Replace with a single Ko-fi username -tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel -community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry -liberapay: # Replace with a single Liberapay username -issuehunt: # Replace with a single IssueHunt username -otechie: # Replace with a single Otechie username -lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry -custom: [https://pages.razorpay.com/mayank1513] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md deleted file mode 100644 index 9b77ea71..00000000 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -name: Bug report -about: Create a report to help us improve -title: "" -labels: "" -assignees: "" ---- - -**Describe the bug** -A clear and concise description of what the bug is. - -**To Reproduce** -Steps to reproduce the behavior: - -1. Go to '...' -2. Click on '....' -3. Scroll down to '....' -4. See error - -**Expected behavior** -A clear and concise description of what you expected to happen. - -**Screenshots** -If applicable, add screenshots to help explain your problem. - -**Desktop (please complete the following information):** - -- OS: [e.g. iOS] -- Browser [e.g. chrome, safari] -- Version [e.g. 22] - -**Smartphone (please complete the following information):** - -- Device: [e.g. iPhone6] -- OS: [e.g. iOS8.1] -- Browser [e.g. stock browser, safari] -- Version [e.g. 22] - -**Additional context** -Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md deleted file mode 100644 index 2bc5d5f7..00000000 --- a/.github/ISSUE_TEMPLATE/feature_request.md +++ /dev/null @@ -1,19 +0,0 @@ ---- -name: Feature request -about: Suggest an idea for this project -title: "" -labels: "" -assignees: "" ---- - -**Is your feature request related to a problem? Please describe.** -A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] - -**Describe the solution you'd like** -A clear and concise description of what you want to happen. - -**Describe alternatives you've considered** -A clear and concise description of any alternative solutions or features you've considered. - -**Additional context** -Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml deleted file mode 100644 index 2c490409..00000000 --- a/.github/workflows/publish.yml +++ /dev/null @@ -1,66 +0,0 @@ -name: Publish to NPM - -# publish only when package json has changed - assuming version upgrade -on: - push: - branches: [main] - paths: "esbuild-plugin-react18/package.json" - -jobs: - publish: - # Don't run just after creating repo from template - # Also avoid running after merging set-up PR - if: github.run_number > 2 - runs-on: ubuntu-latest - permissions: - packages: write - contents: write - id-token: write - - defaults: - run: - working-directory: ./esbuild-plugin-react18 - - steps: - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - - uses: actions/setup-node@v4 - with: - node-version: 20 - registry-url: https://registry.npmjs.org - - run: npm i -g pnpm && pnpm i - name: Install dependencies - - run: pnpm build --filter esbuild-plugin-react18-example - name: build example app to run tests - working-directory: . - # fail and not publish if any of the unit tests are failing - - name: Test - run: pnpm test - - name: Create release and Publish to NPM - run: pnpm publish-package - # continue on error to publish scoped package name <- by default repo is setup for a non-scoped + scoped package name - continue-on-error: true - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} - TOKEN: ${{ secrets.GITHUB_TOKEN }} - OWNER: ${{ github.event.repository.owner.login }} - REPO: ${{ github.event.repository.name }} - - - name: Publish Scoped package to NPM - # continue on error - expecing npm to trow error if scoping is done twice - continue-on-error: true - id: publish_scoped - run: cd dist && node ../scope.js && npm publish --provenance --access public - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} - TOKEN: ${{ secrets.GITHUB_TOKEN }} - OWNER: ${{ github.event.repository.owner.login }} - REPO: ${{ github.event.repository.name }} - - - name: Mark scoped package as deprecated - run: | - npm deprecate @mayank1513/esbuild-plugin-react18 "Please use https://www.npmjs.com/package/esbuild-plugin-react18 instead. We initially created scoped packages to have similarities with the GitHub Public Repository (which requires packages to be scoped). We are no longer using GPR and thus deprecating all scoped packages for which corresponding un-scoped packages exist." - env: - NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index ca50c7d4..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: test - -on: - push: - branches: [main] - pull_request: - schedule: - - cron: "0 */3 * * *" - -jobs: - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - - uses: actions/setup-node@v4 - with: - node-version: 20 - - run: npm i -g pnpm && pnpm i - name: Install dependencies - - run: pnpm build --filter esbuild-plugin-react18-example - name: build example app to run tests - - name: Run unit tests - run: pnpm test - - name: Upload coverage reports to Codecov - uses: codecov/codecov-action@v3 - with: - directory: ./esbuild-plugin-react18 - token: ${{ secrets.CODECOV_TOKEN }} - flags: esbuild-plugin-react18 - - - uses: paambaati/codeclimate-action@v5.0.0 - continue-on-error: true - env: - CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} - with: - coverageLocations: ./esbuild-plugin-react18/coverage/*.xml:clover diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 8a3bd59d..00000000 --- a/.gitignore +++ /dev/null @@ -1,43 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -node_modules -.pnp -.pnp.js - -# testing -coverage - -# next.js -.next/ -out/ -build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env -.env.local -.env.development.local -.env.test.local -.env.production.local - -# turbo -.turbo - -# vercel -.vercel - -# lock files -*lock* - -# build files -dist -test-build diff --git a/.npmrc b/.npmrc deleted file mode 100644 index ded82e2f..00000000 --- a/.npmrc +++ /dev/null @@ -1 +0,0 @@ -auto-install-peers = true diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 7841d3f3..00000000 --- a/.prettierignore +++ /dev/null @@ -1,4 +0,0 @@ -*lock.* - -# ignore hbs files as prettier removes all spaces and makes it ugly -*hbs diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 25fc6e9d..00000000 --- a/.prettierrc +++ /dev/null @@ -1,9 +0,0 @@ -{ - "singleQuote": false, - "printWidth": 100, - "tabWidth": 2, - "arrowParens": "avoid", - "jsxBracketSameLine": true, - "bracketSameLine": true, - "useTabs": true -} diff --git a/.tkb b/.tkb deleted file mode 100644 index 0cab1953..00000000 --- a/.tkb +++ /dev/null @@ -1,36 +0,0 @@ -{ - "scope": "Workspace", - "tasks": { - "task-DLMsMCnSbDOg6Q_qs3XX4": { - "id": "task-DLMsMCnSbDOg6Q_qs3XX4", - "description": "Support Sass\n- CSSPrefix --- default - ''\n- ClassName -> CSSFileName__class", - "columnId": "column-todo" - }, - "QJCiT5pTHTGKydoayOOp8": { - "id": "QJCiT5pTHTGKydoayOOp8", - "description": "Breakdown into smaller functions", - "columnId": "column-done" - } - }, - "columns": [ - { - "id": "column-todo", - "title": "To do", - "tasksIds": [ - "task-DLMsMCnSbDOg6Q_qs3XX4" - ] - }, - { - "id": "column-doing", - "title": "Doing", - "tasksIds": [] - }, - { - "id": "column-done", - "title": "Done", - "tasksIds": [ - "QJCiT5pTHTGKydoayOOp8" - ] - } - ] -} \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json deleted file mode 100644 index 56b26316..00000000 --- a/.vscode/extensions.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "recommendations": [ - "esbenp.prettier-vscode", - "mayank1513.trello-kanban-task-board" - ] -} diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 20d656cd..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - // Formatting using Prettier by default for all languages - "editor.defaultFormatter": "esbenp.prettier-vscode", - // Formatting using Prettier for JavaScript, overrides VSCode default. - "[javascript]": { - "editor.defaultFormatter": "esbenp.prettier-vscode" - }, - - // Ensure enough terminal history is preserved when running tests. - "terminal.integrated.scrollback": 10000, - - // Configure todo-tree to exclude node_modules, dist, and compiled. - "todo-tree.filtering.excludeGlobs": ["**/node_modules", "**/dist", "**/compiled"], - // Match TODO-APP in addition to other TODOs. - "todo-tree.general.tags": ["BUG", "HACK", "FIXME", "TODO", "XXX", "[ ]", "[x]", "TODO-APP"], - - // Disable TypeScript surveys. - "typescript.surveys.enabled": false, - - "grammarly.selectors": [ - { - "language": "markdown", - "scheme": "file" - } - ], - "editor.tabSize": 2, - "editor.wordWrap": "on", - "editor.formatOnSave": true, - "editor.formatOnPaste": true, - "editor.formatOnSaveMode": "file", - "mayank1513.trello-kanban.Workspace.filePath": ".tkb" -} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md deleted file mode 100644 index 3b68e0fa..00000000 --- a/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,53 +0,0 @@ -## Code of Conduct - -### Our Pledge - -We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. - -We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. - -### Our Standards - -Examples of behavior that contributes to a positive environment for our community include: - -- Demonstrating empathy and kindness toward other people -- Being respectful of differing opinions, viewpoints, and experiences -- Giving and gracefully accepting constructive feedback -- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience -- Focusing on what is best not just for us as individuals, but for the overall community - -Examples of unacceptable behavior include: - -- The use of sexualized language or imagery, and sexual attention or advances of any kind -- Trolling, insulting or derogatory comments, and personal or political attacks -- Public or private harassment -- Publishing others’ private information, such as a physical or email address, without their explicit permission -- Other conduct which could reasonably be considered inappropriate in a professional setting - -### Enforcement Responsibilities - -Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. - -### Scope - -This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. - -### Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project team responsible for enforcement at [coc@example.com](mailto:coc@example.com). All complaints will be reviewed and investigated promptly and fairly. - -All project maintainers are obligated to respect the privacy and security of the reporter of any incident. - -Project maintainers who do not follow or enforce the Code of Conduct in good -faith may face temporary or permanent repercussions as determined by other -members of the project's leadership. - -### Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, -available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct/][version] - -[homepage]: http://contributor-covenant.org -[version]: https://www.contributor-covenant.org/version/2/1 diff --git a/LICENSE b/LICENSE deleted file mode 100644 index 78ecd9da..00000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2023 Mayank - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 4247b440..00000000 --- a/README.md +++ /dev/null @@ -1,144 +0,0 @@ -# esbuild-plugin-react18 - -[![test](https://github.com/mayank1513/esbuild-plugin-react18/actions/workflows/test.yml/badge.svg)](https://github.com/mayank1513/esbuild-plugin-react18/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/mayank1513/esbuild-plugin-react18/graph/badge.svg)](https://codecov.io/gh/mayank1513/esbuild-plugin-react18) [![Maintainability](https://api.codeclimate.com/v1/badges/c5e44df548df962f3df5/maintainability)](https://codeclimate.com/github/mayank1513/esbuild-plugin-react18/maintainability) [![Version](https://img.shields.io/npm/v/esbuild-plugin-react18.svg?colorB=green)](https://www.npmjs.com/package/esbuild-plugin-react18) [![Downloads](https://img.jsdelivr.com/img.shields.io/npm/d18m/esbuild-plugin-react18.svg)](https://www.npmjs.com/package/esbuild-plugin-react18) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/esbuild-plugin-react18) - - - -> Build Awesome Libraries using React Server Components and make your Mark! - -This is an `esbuild` plugin for compiling libraries compatible with React 18 server and client component, Nextjs13, Remix, etc. - -## Why? - -✅ Unleash the full power of React18 Server components\ -✅ Build libraries for all build systems/tools/frameworks supporting React18\ -✅ Unleash the power of combining react client and server components in your libraries\ -✅ Full TypeScript support out of the box\ -✅ Supports CJS and ESM builds out of the box -✅ Simple and tiny\ -✅ Easy to use — just add the plugin, and you are good to go\ -✅ All in one plugin for building react18 libraries with `tsup` or `esbuild`\ -✅ add "use client" directive to indicate client component and the plugin will do the rest\ -✅ Automatically ignore test files during build\ -✅ Automatically remove `data-testid` attributes\ -✅ Add `ignorePatterns` and `replacePatterns` to achieve much more control over your build\ -✅ Fully Documented\ -✅ Ready to use [GitHub repository template](https://github.com/mayank1513/turborepo-template.git) to create your next react18 library\ - -Introduction of React server components in React 18 has unlocked immense possibilities. However, library authors are not yet able to fully encash upon this potential. Many libraries, like `chakra-ui`, simply add “use client” for each component. However, much more can be unleashed when we can use both server and client components to build libraries. Also check-out this [blog](https://mayank1513.medium.com/unleash-the-power-of-react-server-components-eb3fe7201231). - -## Compatibility - -- JavaScript/TypeScript React libraries using `tsup` or other builders based on `esbuild` - -This plugin seamlessly integrates with `tsup` and any other builders based on `esbuild`. With this you can have both server and client components in your library and the plugin will take care of the rest. All you need to do is add this plugin and add `"use client";` on top of client components (in your source code). Additionally, test files will be removed automatically from the build resulting in smaller package. Explore more functionalities in the docs. - -## Install - -```bash -yarn add --dev esbuild-react18-useclient -``` - -or - -```bash -pnpm add -D esbuild-react18-useclient -``` - -or - -```bash -npm install -D esbuild-react18-useclient -``` - -> If you are using `monorepo` or `workspaces` you can install this plugin to root using `-w` or to specific workspace using `--filter your-package` or `--scope your-package` for `pnpm` and `yarn` workspaces respectively. - -## use with `tsup` - -```ts -// tsup.config.ts or tsup.config.js -import { defineConfig } from "tsup"; -import react18Plugin from "esbuild-react18-useclient"; - -const react18PluginOptions: React18PluginOptions = {} -export default defineConfig(options => ({ - ... - esbuildPlugins:[react18Plugin(react18PluginOptions)] -})); -``` - -## use with esbuild - -```ts -import react18Plugin from "esbuild-react18-useclient"; - -const react18PluginOptions: React18PluginOptions = {} -esbuild.build({ - ... - plugins: [react18Plugin()], -}); -``` - -## Plugin Options - -```ts -type React18PluginOptions = { - /** to not ignore tese files */ - keepTests?: boolean; - - /** to not remove `data-testid` attributes. If `keepTests` is true, - * `data-testid` attributes will not be removed irrespective of - * `keepTestIds` value. - * This attribute is useful when setting `sourceReplacePatterns` - */ - keepTestIds?: boolean; - - /** - * regExp patterns to match file paths to be ignored. - * If contentPatterns are provided, only the files at matching paths - * containing one or more of the content patterns will be ignored - */ - ignorePatterns?: { pathPattern: RegExp; contentPatterns?: RegExp[] }[]; - - /** - * regExp patterns to find and replace in source files before build - * - * Use with caution! Make sure same file do not match multiple patterns - * to avoid any unexpected results. - * - * Caution! - if you have not enabled `keepTests`, we are already using - * `/.*\.(j|t)s(x)?$/` pattern to remove `data-testid` attributes. If your - * `sourceReplacePatterns` collide with these files, please set `keepTestIds` - * to `true` and handle removing testsids yourself. - */ - sourceReplacePatterns?: { - pathPattern: RegExp; - replaceParams: { pattern: RegExp; substitute: string }[]; - }[]; - - /** - * regExp patterns to find and replace in build files after build - * Use with caution! Make sure same file do not match multiple patterns - * to avoid any unexpected results. - */ - buildReplacePatterns?: { - pathPattern: RegExp; - replaceParams: { pattern: RegExp; substitute: string }[]; - }[]; -}; -``` - -### [🤩 Don't forger to start this repo!](https://github.com/mayank1513/esbuild-plugin-react18) - -[💖](https://github.com/mayank1513/esbuild-plugin-react18) [🌟](https://github.com/mayank1513/esbuild-plugin-react18) -Want handson course for getting started with Turborepo? Check out [React and Next.js with TypeScript](https://www.udemy.com/course/react-and-next-js-with-typescript/?referralCode=7202184A1E57C3DCA8B2) and [The Game of Chess with Next.js, React and TypeScrypt](https://www.udemy.com/course/game-of-chess-with-nextjs-react-and-typescrypt/?referralCode=851A28F10B254A8523FE) - -![Alt](https://repobeats.axiom.co/api/embed/798673e15cf0802fe4e2470f946b64b551b5536d.svg "Repobeats analytics image") - -## License - -Licensed as MIT open source. - -
- -

with 💖 by Mayank Kumar Chaudhari

diff --git a/contributing.md b/contributing.md deleted file mode 100644 index a8bf1006..00000000 --- a/contributing.md +++ /dev/null @@ -1,90 +0,0 @@ -# Contributing to esbuild-plugin-react18 - -## What's inside? - -### Utilities - -This Turborepo has some additional tools already setup for you: - -- [TypeScript](https://www.typescriptlang.org/) for static type checking -- [ESLint](https://eslint.org/) for code linting -- [Prettier](https://prettier.io) for code formatting - -### Apps and Packages - -This Turborepo includes the following packages/examples: - -- `nextjs`: a [Next.js](https://nextjs.org/) app -- `vite`: a [Vite.js](https://vitest.dev) app -- `fork-me`: a React component library shared by both `nextjs` and `vite` examples -- `eslint-config-custom`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) -- `tsconfig`: `tsconfig.json`s used throughout the monorepo - -Each package/example is 100% [TypeScript](https://www.typescriptlang.org/). - -## Automatic file generation - -- just run `yarn turbo gen` and follow the propts to auto generate your new component with test file and dependency linking -- follow best practices automatically - -### Build - -To build all apps and packages, run the following command: - -```bash -# cd esbuild-plugin-react18 -pnpm build -``` - -### Develop - -To develop all apps and packages, run the following command: - -```bash -# cd esbuild-plugin-react18 -pnpm dev -``` - -### Run unit tests - -To run unit tests, run the following command: - -```bash -# cd esbuild-plugin-react18 -pnpm test -``` - -### Linting and formating - -Before creating PR make sure lint is passing and also run formatter to properly format the code. - -```bash -# cd esbuild-plugin-react18 -pnpm lint -``` - -and - -```bash -# cd esbuild-plugin-react18 -pnpm format -``` - -## Useful Links - -Learn more about Turborepo and Next.js: - -- [React and Next.js with TypeScript](https://www.udemy.com/course/react-and-next-js-with-typescript/?referralCode=7202184A1E57C3DCA8B2) - an interactive Next.js course. -- [The Game of Chess with Next.js, React and TypeScrypt](https://www.udemy.com/course/game-of-chess-with-nextjs-react-and-typescrypt/?referralCode=851A28F10B254A8523FE) -- [Tasks](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks) -- [Caching](https://turbo.build/repo/docs/core-concepts/caching) -- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) -- [Filtering](https://turbo.build/repo/docs/core-concepts/monorepos/filtering) -- [Configuration Options](https://turbo.build/repo/docs/reference/configuration) -- [CLI Usage](https://turbo.build/repo/docs/reference/command-line-reference) - -> A quick tip: Delete all stale branches `git branch --merged main | grep -v '^[ *]*main$' | xargs git branch -d` - -
- -

with 💖 by Mayank Kumar Chaudhari

diff --git a/esbuild-plugin-react18/CHANGELOG.md b/esbuild-plugin-react18/CHANGELOG.md deleted file mode 100644 index 14b47b8d..00000000 --- a/esbuild-plugin-react18/CHANGELOG.md +++ /dev/null @@ -1,81 +0,0 @@ -# esbuild-plugin-react18 - -## 0.1.5 - -### Patch Changes - -- Fix: Avoid regexp creating havoc with CSS imports when no empty chunks found. - -## 0.1.4 - -### Patch Changes - -- Fix esm build for non minified cases - -## 0.1.3 - -### Patch Changes - -- Optimise and touch up - -## 0.1.2 - -### Patch Changes - -- Remove empty chunk import instead - -## 0.1.1 - -### Patch Changes - -- Fix ESM default chunks - -## 0.1.0 - -### Minor Changes - -- Support module level "use server" directive - -## 0.0.7 - -### Patch Changes - -- Add provenance - -## 0.0.6 - -### Patch Changes - -- Move repo - -## 0.0.5 - -### Patch Changes - -- Remove test build files from publish artefects - -## 0.0.4 - -### Patch Changes - -- Fix #8 initialise plugin without passing options - -## 0.0.3 - -### Patch Changes - -- e5d3a58: remove data-testid as last item in sourceReplacePatterns. This will reduce the onLoad conflicts significantly as this pattern matches all the js, ts, jsx and tsx files. -- Fix buildReplacePatterns to work on all esbuild setups -- e186209: Fix ignorePatterns with contentPatterns - -## 0.0.2 - -### Patch Changes - -- Update scritps - -## 0.0.1 - -### Patch Changes - -- Update readme diff --git a/esbuild-plugin-react18/__tests__/buildReplacePatterns.test.ts b/esbuild-plugin-react18/__tests__/buildReplacePatterns.test.ts deleted file mode 100644 index c38f2fbb..00000000 --- a/esbuild-plugin-react18/__tests__/buildReplacePatterns.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { describe, test, beforeAll } from "vitest"; -import esbuild from "esbuild"; -import react18Plugin from "../src"; -import glob from "tiny-glob"; - -/** - * buildReplacePatterns could be very helpful in removing unnecessary comments introduced while bundling from other libraries - */ -describe.concurrent("Test plugin with ignorePatterns -- without content pattern", async () => { - const outDir = "build-replace-patterns"; - const exampleBuildDir = path.resolve(process.cwd(), "test-build", outDir); - try { - fs.unlinkSync(path.resolve(exampleBuildDir)); - } catch {} - beforeAll(async () => { - await esbuild.build({ - format: "cjs", - target: "es2019", - sourcemap: false, - bundle: true, - minify: true, - plugins: [ - react18Plugin({ - buildReplacePatterns: [ - { - pathPattern: /constants/, - replaceParams: [ - { pattern: /aaa/, substitute: "3c3c3c" }, - { pattern: /#555/, substitute: "#ccc" }, - ], - }, - ], - }), - ], - entryPoints: await glob("../packages/esbuild-plugin-react18-example/src/**/*.*"), - publicPath: "https://my.domain/static/", - external: ["react", "react-dom"], - outdir: "./test-build/" + outDir, - }); - }); - - test(`"use client"; directive should be present in client components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); - expect(/^"use client";\n/m.test(text)).toBe(true); - }); - test(`"use client"; directive should not be present in server components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "index.js"), "utf-8"); - expect(/^"use client";\n/m.test(text)).toBe(false); - }); - test(`defaultBgColor should be "#3c3c3c" and defaultColor should be "#ccc"`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "constants.js"), "utf-8"); - expect(text.includes("3c3c3c")).toBe(true); - }); -}); diff --git a/esbuild-plugin-react18/__tests__/defaultOptions.test.ts b/esbuild-plugin-react18/__tests__/defaultOptions.test.ts deleted file mode 100644 index f21bc202..00000000 --- a/esbuild-plugin-react18/__tests__/defaultOptions.test.ts +++ /dev/null @@ -1,29 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { describe, test, beforeAll } from "vitest"; - -/** testing tsup example - make sure it is build before running this test suit */ -describe.concurrent("Test plugin with default options in example build with tsup", () => { - const exampleBuildDir = path.resolve( - process.cwd(), - "..", - "packages", - "esbuild-plugin-react18-example", - "dist", - ); - test(`"use client"; directive should be present in client components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); - expect(/^"use client";\n/m.test(text)).toBe(true); - }); - test(`"use client"; directive should not be present in server components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "index.js"), "utf-8"); - expect(/^"use client";\n/m.test(text)).toBe(false); - }); - test(`should not contain data-testid`, ({ expect }) => { - const text = fs.readFileSync( - path.resolve(exampleBuildDir, "client", "star-me", "star-me.js"), - "utf-8", - ); - expect(/data-testid/.test(text)).toBe(false); - }); -}); diff --git a/esbuild-plugin-react18/__tests__/ignorePatterns.test.ts b/esbuild-plugin-react18/__tests__/ignorePatterns.test.ts deleted file mode 100644 index b8515e31..00000000 --- a/esbuild-plugin-react18/__tests__/ignorePatterns.test.ts +++ /dev/null @@ -1,79 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { describe, test, beforeAll } from "vitest"; -import esbuild from "esbuild"; -import react18Plugin from "../src"; -import glob from "tiny-glob"; - -describe.concurrent("Test plugin with ignorePatterns -- without content pattern", async () => { - const outDir = "ignore-patterns-0"; - const exampleBuildDir = path.resolve(process.cwd(), "test-build", outDir); - try { - fs.unlinkSync(path.resolve(exampleBuildDir)); - } catch {} - beforeAll(async () => { - await esbuild.build({ - format: "cjs", - target: "es2019", - sourcemap: false, - bundle: true, - minify: true, - plugins: [react18Plugin({ ignorePatterns: [{ pathPattern: /star-me/ }] })], - entryPoints: await glob("../packages/esbuild-plugin-react18-example/src/**/*.*"), - publicPath: "https://my.domain/static/", - external: ["react", "react-dom"], - outdir: "./test-build/" + outDir, - }); - }); - - test(`"use client"; directive should be present in client components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); - expect(/^"use client";\n/m.test(text)).toBe(true); - }); - test(`"use client"; directive should not be present in server components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "index.js"), "utf-8"); - expect(/^"use client";\n/m.test(text)).toBe(false); - }); - test(`star-me.tsx file should not exist`, ({ expect }) => { - expect(fs.existsSync(path.resolve(exampleBuildDir, "client", "star-me"))).toBe(false); - }); -}); - -/** - * When content pattern is provided only the ignorePattern files having content matching the content pattern will be removed - */ -describe.concurrent("Test plugin with ignorePatterns with content pattern", async () => { - const outDir = "ignore-patterns-1"; - beforeAll(async () => { - await esbuild.build({ - format: "cjs", - target: "es2019", - sourcemap: false, - bundle: true, - minify: true, - plugins: [ - react18Plugin({ - ignorePatterns: [{ pathPattern: /star-me/, contentPatterns: [/ignore-me/] }], - }), - ], - entryPoints: await glob("../packages/esbuild-plugin-react18-example/src/**/*.*"), - publicPath: "https://my.domain/static/", - external: ["react", "react-dom"], - outdir: "./test-build/" + outDir, - }); - }); - - const exampleBuildDir = path.resolve(process.cwd(), "test-build", outDir); - test(`star-me.tsx file should exist`, ({ expect }) => { - expect(fs.existsSync(path.resolve(exampleBuildDir, "client", "star-me", "star-me.js"))).toBe( - true, - ); - }); - test(`ignore-me.ts file should not exist as it contains content "ignore-me" (Note: path pattern is still star-me)`, ({ - expect, - }) => { - expect(fs.existsSync(path.resolve(exampleBuildDir, "client", "star-me", "ignore-me.js"))).toBe( - false, - ); - }); -}); diff --git a/esbuild-plugin-react18/__tests__/sourceReplacePatterns.test.ts b/esbuild-plugin-react18/__tests__/sourceReplacePatterns.test.ts deleted file mode 100644 index 52358dc5..00000000 --- a/esbuild-plugin-react18/__tests__/sourceReplacePatterns.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -import fs from "node:fs"; -import path from "node:path"; -import { describe, test, beforeAll } from "vitest"; -import esbuild from "esbuild"; -import react18Plugin from "../src"; -import glob from "tiny-glob"; - -describe.concurrent("Test plugin with ignorePatterns -- without content pattern", async () => { - const outDir = "source-replace-patterns"; - const exampleBuildDir = path.resolve(process.cwd(), "test-build", outDir); - try { - fs.unlinkSync(path.resolve(exampleBuildDir)); - } catch {} - beforeAll(async () => { - await esbuild.build({ - format: "cjs", - target: "es2019", - sourcemap: false, - bundle: true, - minify: true, - plugins: [ - react18Plugin({ - sourceReplacePatterns: [ - { - pathPattern: /constants/, - replaceParams: [ - { pattern: /aaa/, substitute: "3c3c3c" }, - { pattern: /#555/, substitute: "#ccc" }, - ], - }, - { - pathPattern: /client/, - replaceParams: [], - }, - ], - }), - ], - entryPoints: await glob("../packages/esbuild-plugin-react18-example/src/**/*.*"), - publicPath: "https://my.domain/static/", - external: ["react", "react-dom"], - outdir: "./test-build/" + outDir, - }); - }); - - test(`"use client"; directive should be present in client components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); - expect(/^"use client";\n/m.test(text)).toBe(true); - }); - test(`"use client"; directive should not be present in server components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "index.js"), "utf-8"); - expect(/^"use client";\n/m.test(text)).toBe(false); - }); - test(`defaultBgColor should be "#3c3c3c" and defaultColor should be "#ccc"`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "constants.js"), "utf-8"); - expect(text.includes("3c3c3c")).toBe(true); - }); -}); diff --git a/esbuild-plugin-react18/package.json b/esbuild-plugin-react18/package.json deleted file mode 100644 index 4f432eed..00000000 --- a/esbuild-plugin-react18/package.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "name": "esbuild-plugin-react18", - "author": "Mayank Kumar Chaudhari ", - "private": false, - "version": "0.1.5", - "description": "Unleash the Power of React Server Components! ESBuild plugin to build RSC (React18 Server Components) compatible libraries.", - "main": "dist/index.js", - "types": "dist/index.d.ts", - "scripts": { - "test": "vitest run --coverage", - "build": "tsc && node touchup.js", - "publish-package": "cd dist && npm publish --provenance --access public" - }, - "devDependencies": { - "@types/node": "^20.12.7", - "@vitest/coverage-v8": "^1.5.0", - "esbuild": "^0.20.2", - "octokit": "^3.2.0", - "tiny-glob": "^0.2.9", - "typescript": "^5.4.5", - "vitest": "^1.5.0" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/react18-tools/esbuild-plugin-react18.git" - }, - "license": "MIT", - "bugs": { - "url": "https://github.com/react18-tools/esbuild-plugin-react18/issues" - }, - "homepage": "https://github.com/react18-tools/esbuild-plugin-react18#readme", - "sideEffects": false, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/mayank1513" - }, - "keywords": [ - "react", - "nextjs", - "useclient", - "typescript", - "react18", - "react18-tools", - "use client", - "esbuild", - "esbuild-plugin", - "RSC compatible", - "esbuild-plugin-react18", - "esbuild-plugin-ignoretests", - "esbuild-plugin-ignore-test-files", - "esbuild-plugin-ignore-testfiles", - "esbuild-plugin-ignore", - "ignore", - "ignoretests", - "tsup", - "react-server-components", - "react-client-components", - "javascript", - "mayank1513" - ] -} diff --git a/esbuild-plugin-react18/scope.js b/esbuild-plugin-react18/scope.js deleted file mode 100644 index efdd1927..00000000 --- a/esbuild-plugin-react18/scope.js +++ /dev/null @@ -1,23 +0,0 @@ -/* eslint-disable -- no need - external file */ -"use strict"; - -const fs = require("node:fs"); -const path = require("node:path"); - -const owner = "mayank1513"; -const packageJson = require(path.resolve(process.cwd(), "package.json")); -const ref = packageJson.name; -if (!ref.startsWith(`@${owner}`)) { - packageJson.name = `@${owner}/${packageJson.name}`; - fs.writeFileSync( - path.resolve(process.cwd(), "package.json"), - JSON.stringify(packageJson, null, 2), - ); - const readMePath = path.resolve(process.cwd(), "README.md"); - let readMe = fs.readFileSync(readMePath, { encoding: "utf8" }); - const tmp = "!---!"; - readMe = readMe.replace(new RegExp(`${owner}/${ref}`, "g"), tmp); - readMe = readMe.replace(new RegExp(ref, "g"), packageJson.name); - readMe = readMe.replace(new RegExp(tmp, "g"), `${owner}/${ref}`); - fs.writeFileSync(readMePath, readMe); -} diff --git a/esbuild-plugin-react18/src/constants.ts b/esbuild-plugin-react18/src/constants.ts deleted file mode 100644 index 66cabdbb..00000000 --- a/esbuild-plugin-react18/src/constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -const uuid = () => (Date.now() * Math.random()).toString(36).slice(0, 8); - -/** regExp */ -export const testPathRegExp = /.*\.(test|spec|check)\.(j|t)s(x)?$/i; - -export const name = "esbuild-plugin-react18-" + uuid(); -export const ignoreNamespace = "mayank1513-ignore-" + uuid(); -export const keepNamespace = "mayank1513-keep-" + uuid(); diff --git a/esbuild-plugin-react18/src/index.ts b/esbuild-plugin-react18/src/index.ts deleted file mode 100644 index e16818e3..00000000 --- a/esbuild-plugin-react18/src/index.ts +++ /dev/null @@ -1,200 +0,0 @@ -import type { BuildResult, OnLoadResult, Plugin, PluginBuild } from "esbuild"; -import fs from "node:fs"; -import path from "node:path"; -import { testPathRegExp, name, ignoreNamespace, keepNamespace } from "./constants"; - -interface ignorePattern { - pathPattern: RegExp; - contentPatterns?: RegExp[]; -} - -interface ReplacePattern { - pathPattern: RegExp; - replaceParams: { pattern: RegExp; substitute: string }[]; -} - -interface React18PluginOptions { - /** to not ignore tese files */ - keepTests?: boolean; - - /** to not remove `data-testid` attributes. If `keepTests` is true, - * `data-testid` attributes will not be removed irrespective of - * `keepTestIds` value. - * This attribute is useful when setting `sourceReplacePatterns` - */ - keepTestIds?: boolean; - - /** - * regExp patterns to match file paths to be ignored. - * If contentPatterns are provided, only the files at matching paths - * containing one or more of the content patterns will be ignored - */ - ignorePatterns?: ignorePattern[]; - - /** - * regExp patterns to find and replace in source files before build - * - * Use with caution! Make sure same file do not match multiple patterns - * to avoid any unexpected results. - * - * Caution! - if you have not enabled `keepTests`, we are already using - * `/.*\.(j|t)s(x)?$/` pattern to remove `data-testid` attributes. If your - * `sourceReplacePatterns` collide with these files, please set `keepTestIds` - * to `true` and handle removing testsids yourself. - */ - sourceReplacePatterns?: ReplacePattern[]; - - /** - * regExp patterns to find and replace in build files after build - * Use with caution! Make sure same file do not match multiple patterns - * to avoid any unexpected results. - */ - buildReplacePatterns?: ReplacePattern[]; -} - -function removeTests(build: PluginBuild, options: React18PluginOptions) { - build.onResolve({ filter: testPathRegExp }, args => ({ - path: args.path, - namespace: ignoreNamespace, - })); - if (!options.keepTestIds) { - /** remove data-testid */ - if (!options.sourceReplacePatterns) options.sourceReplacePatterns = []; - options.sourceReplacePatterns.push({ - pathPattern: /.*\.(j|t)s(x)?$/, - replaceParams: [{ pattern: /\s*data-testid="[^"]*"/gm, substitute: " " }], - }); - } -} - -function ignoreFiles(ignorePattern: ignorePattern, build: PluginBuild) { - build.onResolve({ filter: ignorePattern.pathPattern }, args => { - /** remove content to avoid building/transpiling test files unnecessarily*/ - const fullPath = path.resolve(args.resolveDir, args.path); - if (!ignorePattern.contentPatterns?.length || !fs.existsSync(fullPath)) - return { path: args.path, namespace: ignoreNamespace }; - - if (fs.lstatSync(fullPath).isDirectory()) return { path: fullPath, namespace: keepNamespace }; - - const text = fs.readFileSync(fullPath, "utf8"); - for (const contentPattern of ignorePattern.contentPatterns) - if (contentPattern.test(text)) return { path: args.path, namespace: ignoreNamespace }; - - return { path: fullPath, namespace: keepNamespace }; - }); -} - -function replacePatterns({ replaceParams }: ReplacePattern, text: string) { - replaceParams.forEach(({ pattern, substitute }) => { - text = text.replace(pattern, substitute); - }); - return text; -} - -function replaceSource(sourceReplacePattern: ReplacePattern, build: PluginBuild) { - if (sourceReplacePattern.replaceParams.length === 0) return; - /** Add namespace file to avoid conflict with ignored files */ - build.onLoad({ filter: sourceReplacePattern.pathPattern, namespace: "file" }, args => { - let text = fs.readFileSync(args.path, "utf8"); - /** todo: test if loader is a valid OnLoadResult.loader - * If it is not a valid loader error will be thrown - */ - const loader = args.path.slice(args.path.lastIndexOf(".") + 1); - const contents = replacePatterns(sourceReplacePattern, text); - return { contents, loader } as OnLoadResult; - }); -} - -function replaceBuild(buildReplacePattern: ReplacePattern, result: BuildResult) { - result.outputFiles - ?.filter(f => buildReplacePattern.pathPattern.test(f.path)) - .forEach( - f => (f.contents = new TextEncoder().encode(replacePatterns(buildReplacePattern, f.text))), - ); -} - -function onEndCallBack(result: BuildResult, options: React18PluginOptions, write?: boolean) { - /** remove empty file imports */ - const emptyChunkFiles = result.outputFiles - ?.filter(f => f.text.trim() === "" && f.path.includes("chunk")) - .map(f => f.path.split(path.sep).pop()); - - const emptyChunkImportRegExp = new RegExp( - `import *"[^"]*(${emptyChunkFiles?.join("|") || "--no-empty-chunks--"})";[\n\r ]*`, - "g", - ); - - /** fix use client and use server*/ - result.outputFiles - ?.filter(f => !f.path.endsWith(".map")) - .forEach(f => { - let txt = f.text; - txt = txt.replace( - /^(["']use strict["'];)?["']use client["'];?/i, - '"use client";\n"use strict";', - ); - - /** module level use server */ - txt = txt.replace( - /^(["']use strict["'];)?["']use server["'];?/i, - '"use server";\n"use strict";', - ); - - /** remove empty file imports */ - txt = txt.replace(emptyChunkImportRegExp, ""); - - f.contents = new TextEncoder().encode(txt); - }); - - /** handle buildReplacePatterns */ - options.buildReplacePatterns?.forEach(replacePattern => replaceBuild(replacePattern, result)); - - /** Do not generate {empty} test files if keepTests is not set to true */ - if (!options.keepTests) { - result.outputFiles = result.outputFiles?.filter(f => !testPathRegExp.test(f.path)); - } - - /** remove empty files */ - result.outputFiles = result.outputFiles?.filter(f => f.text.trim() !== ""); - /** assume true if undefined */ - if (write === undefined || write) { - result.outputFiles?.forEach(file => { - fs.mkdirSync(path.dirname(file.path), { recursive: true }); - fs.writeFileSync(file.path, file.contents); - }); - } -} - -function setup(build: PluginBuild, options: React18PluginOptions = {}) { - const write = build.initialOptions.write; - build.initialOptions.write = false; - - if (!options.keepTests) removeTests(build, options); - - options.ignorePatterns?.forEach(ignorePattern => ignoreFiles(ignorePattern, build)); - - options.sourceReplacePatterns?.forEach(replacePattern => replaceSource(replacePattern, build)); - - build.onLoad({ filter: /.*/, namespace: ignoreNamespace }, () => { - /** remove content to avoid building/transpiling ignored files*/ - return { contents: "" }; - }); - - build.onLoad({ filter: /.*/, namespace: keepNamespace }, args => { - if (fs.existsSync(args.path) && fs.lstatSync(args.path).isDirectory()) return { contents: "" }; - else { - const loader = args.path.slice(args.path.lastIndexOf(".") + 1); - return { contents: fs.readFileSync(args.path, "utf-8"), loader } as OnLoadResult; - } - }); - - build.onEnd(result => onEndCallBack(result, options, write)); -} - -/** This plugin prevents building test files by esbuild. DTS may still geenrate type files for the tests with only { } as file content*/ -const react18Plugin: (options?: React18PluginOptions) => Plugin = (options = {}) => ({ - name, - setup: build => setup(build, options), -}); - -export = react18Plugin; diff --git a/esbuild-plugin-react18/touchup.js b/esbuild-plugin-react18/touchup.js deleted file mode 100644 index 46cc697d..00000000 --- a/esbuild-plugin-react18/touchup.js +++ /dev/null @@ -1,58 +0,0 @@ -"use strict"; - -const fs = require("fs"); -const path = require("path"); -const packageJson = require(path.resolve(__dirname, "package.json")); - -delete packageJson.devDependencies; -delete packageJson.scripts; - -packageJson.main = "index.js"; -packageJson.types = "index.d.ts"; - -console.log(process.env.TOKEN, process.env.OWNER, process.env.REPO); -if (process.env.TOKEN) { - const { Octokit } = require("octokit"); - // Octokit.js - // https://github.com/octokit/core.js#readme - const octokit = new Octokit({ - auth: process.env.TOKEN, - }); - - const octoOptions = { - owner: process.env.OWNER, - repo: process.env.REPO, - headers: { - "X-GitHub-Api-Version": "2022-11-28", - }, - }; - const tag_name = `v${packageJson.version}`; - const name = `Release ${tag_name}`; - /** Create a release */ - try { - octokit.request("POST /repos/{owner}/{repo}/releases", { - ...octoOptions, - tag_name, - target_commitish: "main", - name, - draft: false, - prerelease: false, - generate_release_notes: true, - headers: { - "X-GitHub-Api-Version": "2022-11-28", - }, - }); - } catch (e) { - console.log("octokit error", e); - } -} - -fs.writeFileSync( - path.resolve(__dirname, "dist", "package.json"), - JSON.stringify(packageJson, null, 2), -); - -fs.copyFileSync( - path.resolve(__dirname, "..", "README.md"), - path.resolve(__dirname, "dist", "README.md"), -); diff --git a/esbuild-plugin-react18/tsconfig.json b/esbuild-plugin-react18/tsconfig.json deleted file mode 100644 index 948e8972..00000000 --- a/esbuild-plugin-react18/tsconfig.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "declaration": true, - "esModuleInterop": true, - "moduleResolution": "node", - "skipLibCheck": true, - "module": "CommonJS", - "strict": true, - "outDir": "dist" - }, - "include": ["src"], - "exclude": ["node_modules", "dist"] -} diff --git a/esbuild-plugin-react18/vitest.config.ts b/esbuild-plugin-react18/vitest.config.ts deleted file mode 100644 index 78f6b204..00000000 --- a/esbuild-plugin-react18/vitest.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "vitest/config"; - -// https://vitejs.dev/config/ -export default defineConfig({ - test: { - globals: true, - setupFiles: [], - coverage: { - include: ["src/**"], - reporter: ["text", "json", "html", "clover"], - }, - }, -}); diff --git a/esbuild-react18.jpg b/esbuild-react18.jpg deleted file mode 100644 index 3ef2c5999e7a53497b71ba418b5708ab5f93e5e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40727 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%0Asmwbxw@<4QT;{&ier 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 G`~Lv&^?h0Z diff --git a/examples/nextjs/.eslintrc.js b/examples/nextjs/.eslintrc.js deleted file mode 100644 index 1d9773ea..00000000 --- a/examples/nextjs/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ["custom/next"], -}; diff --git a/examples/nextjs/.gitignore b/examples/nextjs/.gitignore deleted file mode 100644 index 1437c53f..00000000 --- a/examples/nextjs/.gitignore +++ /dev/null @@ -1,34 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel diff --git a/examples/nextjs/README.md b/examples/nextjs/README.md deleted file mode 100644 index 1626d340..00000000 --- a/examples/nextjs/README.md +++ /dev/null @@ -1,28 +0,0 @@ -## Getting Started - -First, run the development server: - -```bash -yarn dev -``` - -Open [http://localhost:3000](http://localhost:3000) with your browser to see the result. - -You can start editing the page by modifying `app/page.tsx`. The page auto-updates as you edit the file. - -To create [API routes](https://nextjs.org/docs/app/building-your-application/routing/router-handlers) add an `api/` directory to the `app/` directory with a `route.ts` file. For individual endpoints, create a subfolder in the `api` directory, as `api/hello/route.ts` would map to [http://localhost:3000/api/hello](http://localhost:3000/api/hello). - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - Learn about Next.js features and API. -- [Learn Next.js](https://www.udemy.com/course/react-and-next-js-with-typescript/?referralCode=7202184A1E57C3DCA8B2) - an interactive Next.js course. - -You can check out [the Turbo Template GitHub repository](https://github.com/mayank1513/turborepo-template/) - your feedback and contributions are welcome! - -### 🤩 Don't forget to start this repo! - -
- -

with 💖 by Mayank Kumar Chaudhari

diff --git a/examples/nextjs/app/favicon.ico b/examples/nextjs/app/favicon.ico deleted file mode 100644 index 71e4bd7106d802cf01b1218c3ead532a89fe2268..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1150 zcmZ`$drZ?;7`^DMl5N;2FqwN)(8a|WA`2`gbSMgF+OEK4l!la1DqS5!&PJxmr<*`l?A=J(t@)(b1s$}ku8i;u@48gS3SQoq&Pt(J( zW*r^-<9OhwOhTAE0oKksh*KJ&VCzwmDnZzW2xP>cfUZP3EI#^5fBegvu;D2hHa_zt z=%LSo@mw^r51Ns`cM7_r-$M}705MC0%r}ZqnkvPsTVfz&WuaZBcFXglzetUXL{wM^ zA}EA}go6FL2)x8*u)=20wrdFL7!fqwPRKb%s0++^cOMV3cM9Q9>ATE|gdSn)YuLRl z0$VoI5xHqQ@)8ut-dTjVL&xDgU_?jk9_YBAK$50~>Z}P>r(`e|C~&Q=UgNOj8XAia zfwwOj%pH-4+qMe=rU1p86L31pfgcaE;fQBI^=2)k$5bfGRKZYb##Nbi!J)0q`O10W z1-m)7%v^r_+xOBF|KKoVQMx+`??>&0@=zZ<`~nP~VL+11fjUovnhXhA6)lTa)d%17 z7&JSk?zIxY9dxTl67JAurRYjh>n|N<&Zz_vG~JlN*i8pUFYG}TJ8iy6s_*~soaC}a zS$*85lt16(vG~975f65k5sa-`rB=$T+4WwWcm0n3=>@nG6=%9_w)MB{{GcyC zE?bfF54PcHa_7M;t-Nd8C}{r~&bx~knO(xry@&cwYi+B)?)%Pf4am)d_eq=g*R7(? zpC+>P_wo7g-|$Q=VtjsSdh$0M9GhJtzF7p!TAXR*lJhRnxJJ_jmWf5KX%g3l=iwZg zNAJiS+InX++Rk5y);<<6?;YwOwe20mXf+7WHhhL-m2OmgaOM$x#h!EGlvYgxNGvoNqI@> zZ+Tc*r+w+=(ry<2)EU0CaAR&o!E$@RzR$%Yclu8TU9RJXx0;I>H?GTrb=Gn6@OErK a|Nn`V)M9Qeg_o9LJ=On<|Fl0V2>Ay!D%IHl diff --git a/examples/nextjs/app/globals.css b/examples/nextjs/app/globals.css deleted file mode 100644 index 1a2000c4..00000000 --- a/examples/nextjs/app/globals.css +++ /dev/null @@ -1,79 +0,0 @@ -* { - box-sizing: border-box; -} - -:root { - --max-width: 1100px; - --border-radius: 12px; - --font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", "Roboto Mono", "Oxygen Mono", - "Ubuntu Monospace", "Source Code Pro", "Fira Mono", "Droid Sans Mono", "Courier New", monospace; - --bg-color: #fff; - --text-color: #000; - - --primary-glow: conic-gradient( - from 180deg at 50% 50%, - #16abff33 0deg, - #0885ff33 55deg, - #54d6ff33 120deg, - #0071ff33 160deg, - transparent 360deg - ); - --secondary-glow: radial-gradient(rgba(255, 255, 255, 1), rgba(255, 255, 255, 0)); - - --callout-rgb: 238, 240, 241; - --callout-border-rgb: 172, 175, 176; - --card-rgb: 180, 185, 188; - --card-border-rgb: 131, 134, 135; - --tile-border: conic-gradient(#00000080, #00000040, #00000030, #00000020, #00000010, #00000010, #00000080); -} - -/* dark themes */ -[data-theme="dark"] { - --bg-color: #000; - --text-color: #fff; -} - -[data-theme="dark"] { - --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); - --secondary-glow: linear-gradient(to bottom right, rgba(1, 65, 255, 0), rgba(1, 65, 255, 0), rgba(1, 65, 255, 0.3)); - - --callout-rgb: 20, 20, 20; - --callout-border-rgb: 108, 108, 108; - --card-rgb: 100, 100, 100; - --card-border-rgb: 200, 200, 200; - --tile-border: conic-gradient(#ffffff80, #ffffff40, #ffffff30, #ffffff20, #ffffff10, #ffffff10, #ffffff80); -} - -html { - padding: 0; - margin: 0; -} - -body { - padding: 0; - margin: 0; - background: var(--bg-color); - color: var(--text-color); -} - -.container { - max-width: var(--max-width); - min-height: calc(100vh - 100px); - margin: auto; -} - -.container header { - display: flex; - gap: 20px; - align-items: center; -} - -footer { - text-align: center; - padding: 10px; -} - -a { - color: inherit; - text-decoration: none; -} diff --git a/examples/nextjs/app/layout.tsx b/examples/nextjs/app/layout.tsx deleted file mode 100644 index d592fe6e..00000000 --- a/examples/nextjs/app/layout.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { ForkMe } from "esbuild-plugin-react18-example/dist/server"; -import "./globals.css"; -import { ThemeSwitcher } from "nextjs-themes"; -import { ServerSideWrapper } from "nextjs-themes/server/nextjs"; - -export default function RootLayout({ children }: { children: React.ReactNode }) { - return ( - - - -
{children}
- - - -
- ); -} diff --git a/examples/nextjs/app/page.module.css b/examples/nextjs/app/page.module.css deleted file mode 100644 index d93247e1..00000000 --- a/examples/nextjs/app/page.module.css +++ /dev/null @@ -1,290 +0,0 @@ -.main { - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: center; - padding: 3rem 0; - min-height: calc(100vh - 55px); -} - -.description { - display: inherit; - justify-content: inherit; - align-items: inherit; - font-size: 0.85rem; - max-width: var(--max-width); - width: 100%; - z-index: 2; - font-family: var(--font-mono); -} - -.description a { - display: flex; - align-items: center; - justify-content: center; - gap: 0.5rem; -} - -.description p { - position: relative; - margin: 0; - padding: 1rem; - background-color: rgba(var(--callout-rgb), 0.5); - border: 1px solid rgba(var(--callout-border-rgb), 0.3); - border-radius: var(--border-radius); -} - -.code { - font-weight: 700; - font-family: var(--font-mono); -} - -.cards { - display: flex; - justify-content: space-evenly; - width: var(--max-width); -} - -.card { - all: unset; - display: flex; - flex-direction: column; - padding: 1rem 1.2rem; - border-radius: var(--border-radius); - background: rgba(var(--card-rgb), 0); - border: 1px solid rgba(var(--card-border-rgb), 0.1); - cursor: pointer; - transition: - background 200ms, - border 200ms; -} - -.card span { - display: inline-block; - transition: transform 200ms; -} - -.card h2 { - font-weight: 600; - margin-bottom: 0.7rem; - text-align: start; -} - -.card p { - margin: 0; - opacity: 0.6; - font-size: 0.9rem; - line-height: 1.5; - width: 34ch; - text-align: start; -} - -.center { - display: flex; - justify-content: center; - align-items: center; - position: relative; - padding-bottom: 2rem; - gap: 50px; -} - -.prefs { - padding-bottom: 4rem; -} - -.prefs select { - width: 85px; - float: right; - margin-left: 20px; - opacity: 0.3; -} - -select.active, -select.light { - opacity: 1; -} - -.center > div { - position: relative; -} - -.center::before { - background: var(--secondary-glow); - border-radius: 50%; - width: 480px; - height: 360px; - margin-left: -400px; - pointer-events: none; -} - -.center::after { - background: var(--primary-glow); - width: 240px; - height: 180px; - z-index: -1; -} - -.center::before, -.center::after { - content: ""; - left: 50%; - position: absolute; - filter: blur(45px); - transform: translateZ(0); -} - -.logo { - position: relative; - display: flex; - justify-content: center; - align-items: center; - margin-left: 16px; - transform: translateZ(0); - border-radius: var(--border-radius); - overflow: hidden; - box-shadow: 0px 2px 8px -1px #0000001a; - padding: 2px; -} -.logo p { - background: var(--bg-color); -} -.logo::before, -.logo::after { - content: " "; - position: absolute; - z-index: -1; -} - -/* Conic Gradient Animation */ -.logo::before { - animation: 3s rotate infinite linear; - width: 800%; - height: 800%; - background: var(--tile-border); -} - -/* Inner Square */ -.logo::after { - inset: 0; - padding: 1px; - border-radius: var(--border-radius); - background: linear-gradient( - to bottom right, - rgba(var(--tile-start-rgb), 1), - rgba(var(--tile-end-rgb), 1) - ); - background-clip: content-box; -} - -/* Enable hover only on non-touch devices */ -@media (hover: hover) and (pointer: fine) { - .card:hover { - background: rgba(var(--card-rgb), 0.1); - border: 1px solid rgba(var(--card-border-rgb), 0.15); - } - - .card:hover span { - transform: translateX(4px); - } -} - -/* @media (prefers-reduced-motion) { - .logo::before { - animation: none; - } - - .card:hover span { - transform: none; - } -} */ - -/* Mobile and Tablet */ -@media (max-width: 1023px) { - .content { - padding: 4rem; - } - - .grid { - grid-template-columns: 1fr; - margin-bottom: 120px; - max-width: 320px; - text-align: center; - } - - .card { - padding: 1rem 2.5rem; - } - - .card h2 { - margin-bottom: 0.5rem; - } - - .center { - padding: 8rem 0 6rem; - } - - .center::before { - transform: none; - height: 300px; - } - - .description { - font-size: 0.8rem; - } - - .description a { - padding: 1rem; - } - - .description p, - .description div { - display: flex; - justify-content: center; - position: fixed; - width: 100%; - } - - .description p { - align-items: center; - inset: 0 0 auto; - padding: 2rem 1rem 1.4rem; - border-radius: 0; - border: none; - border-bottom: 1px solid rgba(var(--callout-border-rgb), 0.25); - background: linear-gradient( - to bottom, - rgba(var(--background-start-rgb), 1), - rgba(var(--callout-rgb), 0.5) - ); - background-clip: padding-box; - backdrop-filter: blur(24px); - } - - .description div { - align-items: flex-end; - pointer-events: none; - inset: auto 0 0; - padding: 2rem; - height: 200px; - background: linear-gradient(to bottom, transparent 0%, rgb(var(--background-end-rgb)) 40%); - z-index: 1; - } -} - -@media (prefers-color-scheme: dark) { - select.dark { - opacity: 1; - } - select.light { - opacity: 0.3; - } -} - -@keyframes rotate { - from { - transform: rotate(360deg); - } - to { - transform: rotate(0deg); - } -} diff --git a/examples/nextjs/app/page.tsx b/examples/nextjs/app/page.tsx deleted file mode 100644 index 4f347680..00000000 --- a/examples/nextjs/app/page.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { Inter } from "next/font/google"; -import { StarMe } from "esbuild-plugin-react18-example"; -import styles from "./page.module.css"; - -const inter = Inter({ subsets: ["latin"] }); - -export default function Home() { - return ( -
- - -
-
-

- Build with turborepo-template -

-

Unleash the power of React Server Components!

-
-
- -
- -

- Use This Template -> -

-

Explore more on official GitHub Repo.

-
- -

- Star this repo -> -

-

Star this repo for your new library!

-
-
-
- ); -} diff --git a/examples/nextjs/next-env.d.ts b/examples/nextjs/next-env.d.ts deleted file mode 100644 index 4f11a03d..00000000 --- a/examples/nextjs/next-env.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -/// -/// - -// NOTE: This file should not be edited -// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/examples/nextjs/next.config.js b/examples/nextjs/next.config.js deleted file mode 100644 index 7067e0e6..00000000 --- a/examples/nextjs/next.config.js +++ /dev/null @@ -1,4 +0,0 @@ -module.exports = { - reactStrictMode: true, - transpilePackages: ["ui"], -}; diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json deleted file mode 100644 index f24a4be5..00000000 --- a/examples/nextjs/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "nextjs-example", - "version": "0.0.0", - "private": true, - "scripts": { - "dev": "next dev", - "build": "next build", - "start": "next start", - "lint": "next lint" - }, - "dependencies": { - "esbuild-plugin-react18-example": "workspace:*", - "next": "^14.2.2", - "nextjs-themes": "^3.1.0", - "react": "^18.2.0", - "react-dom": "^18.2.0" - }, - "devDependencies": { - "@next/eslint-plugin-next": "^14.2.2", - "@types/node": "^20.12.7", - "@types/react": "^18.2.79", - "@types/react-dom": "^18.2.25", - "esbuild-plugin-react18": "workspace:^", - "eslint-config-custom": "workspace:*", - "tsconfig": "workspace:*", - "typescript": "^5.4.5" - } -} diff --git a/examples/nextjs/tsconfig.json b/examples/nextjs/tsconfig.json deleted file mode 100644 index 644ee04f..00000000 --- a/examples/nextjs/tsconfig.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "extends": "tsconfig/nextjs.json", - "compilerOptions": { - "plugins": [{ "name": "next" }] - }, - "include": ["next-env.d.ts", "**/*.ts", "**/*.tsx", ".next/types/**/*.ts"], - "exclude": ["node_modules"] -} diff --git a/examples/vite/.eslintrc.cjs b/examples/vite/.eslintrc.cjs deleted file mode 100644 index f63fe7dc..00000000 --- a/examples/vite/.eslintrc.cjs +++ /dev/null @@ -1,15 +0,0 @@ -module.exports = { - root: true, - env: { browser: true, es2020: true }, - extends: [ - "eslint:recommended", - "plugin:@typescript-eslint/recommended", - "plugin:react-hooks/recommended", - ], - ignorePatterns: ["dist", ".eslintrc.cjs"], - parser: "@typescript-eslint/parser", - plugins: ["react-refresh"], - rules: { - "react-refresh/only-export-components": ["warn", { allowConstantExport: true }], - }, -}; diff --git a/examples/vite/.gitignore b/examples/vite/.gitignore deleted file mode 100644 index 5a079d55..00000000 --- a/examples/vite/.gitignore +++ /dev/null @@ -1,37 +0,0 @@ -# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. - -# dependencies -/node_modules -/.pnp -.pnp.js - -# testing -/coverage - -# next.js -/.next/ -/out/ - -# production -/build - -# misc -.DS_Store -*.pem - -# debug -npm-debug.log* -yarn-debug.log* -yarn-error.log* - -# local env files -.env.local -.env.development.local -.env.test.local -.env.production.local - -# vercel -.vercel - -# vite -dist diff --git a/examples/vite/README.md b/examples/vite/README.md deleted file mode 100644 index 603a1359..00000000 --- a/examples/vite/README.md +++ /dev/null @@ -1,25 +0,0 @@ -## Getting Started - -First, run the development server: - -```bash -yarn dev -``` - -Open [http://localhost:3001](http://localhost:3001) with your browser to see the result. -Edit `src/App.tsx` and save to test HMR - -## Learn More - -To learn more about Next.js, take a look at the following resources: - -- [Next.js Documentation](https://nextjs.org/docs) - Learn about Next.js features and API. -- [Learn Next.js](https://www.udemy.com/course/react-and-next-js-with-typescript/?referralCode=7202184A1E57C3DCA8B2) - an interactive Next.js course. - -You can check out [the Turbo Template GitHub repository](https://github.com/mayank1513/turborepo-template/) - your feedback and contributions are welcome! - -### 🤩 Don't forget to start this repo! - -
- -

with 💖 by Mayank Kumar Chaudhari

diff --git a/examples/vite/index.html b/examples/vite/index.html deleted file mode 100644 index e4b78eae..00000000 --- a/examples/vite/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React + TS - - -
- - - diff --git a/examples/vite/package.json b/examples/vite/package.json deleted file mode 100644 index a0a9548c..00000000 --- a/examples/vite/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "vite-example", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite --port 3001", - "build": "tsc && vite build", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0", - "preview": "vite preview" - }, - "dependencies": { - "@mayank1513/fork-me": "^2.1.2", - "esbuild-plugin-react18-example": "workspace:*", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react18-themes": "^3.1.0" - }, - "devDependencies": { - "@types/react": "^18.2.79", - "@types/react-dom": "^18.2.25", - "@typescript-eslint/eslint-plugin": "^7.7.0", - "@typescript-eslint/parser": "^7.7.0", - "@vitejs/plugin-react-swc": "^3.6.0", - "esbuild-plugin-react18": "workspace:^", - "eslint": "^9.0.0", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "typescript": "^5.4.5", - "vite": "^5.2.9" - } -} diff --git a/examples/vite/public/vite.svg b/examples/vite/public/vite.svg deleted file mode 100644 index e7b8dfb1..00000000 --- a/examples/vite/public/vite.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/examples/vite/src/App.css b/examples/vite/src/App.css deleted file mode 100644 index b9d355df..00000000 --- a/examples/vite/src/App.css +++ /dev/null @@ -1,42 +0,0 @@ -#root { - max-width: 1280px; - margin: 0 auto; - padding: 2rem; - text-align: center; -} - -.logo { - height: 6em; - padding: 1.5em; - will-change: filter; - transition: filter 300ms; -} -.logo:hover { - filter: drop-shadow(0 0 2em #646cffaa); -} -.logo.react:hover { - filter: drop-shadow(0 0 2em #61dafbaa); -} - -@keyframes logo-spin { - from { - transform: rotate(0deg); - } - to { - transform: rotate(360deg); - } -} - -@media (prefers-reduced-motion: no-preference) { - a:nth-of-type(2) .logo { - animation: logo-spin infinite 20s linear; - } -} - -.card { - padding: 2em; -} - -.read-the-docs { - color: #888; -} diff --git a/examples/vite/src/App.tsx b/examples/vite/src/App.tsx deleted file mode 100644 index 707ba28e..00000000 --- a/examples/vite/src/App.tsx +++ /dev/null @@ -1,37 +0,0 @@ -import { useState } from "react"; -import reactLogo from "./assets/react.svg"; -import viteLogo from "/vite.svg"; -import { ThemeSwitcher } from "react18-themes"; -import { ForkMe } from "@mayank1513/fork-me/server"; -import { StarMe } from "@mayank1513/fork-me"; -import "./App.css"; - -function App() { - const [count, setCount] = useState(0); - - return ( - <> - - -

Vite + React

-
- -

- Edit src/App.tsx and save to test HMR -

-
- -

Click on the Vite and React logos to learn more

- - - ); -} - -export default App; diff --git a/examples/vite/src/assets/react.svg b/examples/vite/src/assets/react.svg deleted file mode 100644 index 6c87de9b..00000000 --- a/examples/vite/src/assets/react.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/examples/vite/src/index.css b/examples/vite/src/index.css deleted file mode 100644 index 306f8825..00000000 --- a/examples/vite/src/index.css +++ /dev/null @@ -1,67 +0,0 @@ -:root { - font-family: Inter, system-ui, Avenir, Helvetica, Arial, sans-serif; - line-height: 1.5; - font-weight: 400; - - color-scheme: light dark; - color: #213547; - background-color: #ffffff; - - font-synthesis: none; - text-rendering: optimizeLegibility; - -webkit-font-smoothing: antialiased; - -moz-osx-font-smoothing: grayscale; - -webkit-text-size-adjust: 100%; -} - -a { - font-weight: 500; - color: #646cff; - text-decoration: inherit; -} -a:hover { - color: #747bff; -} - -body { - margin: 0; - display: flex; - place-items: center; - min-width: 320px; - min-height: 100vh; -} - -h1 { - font-size: 3.2em; - line-height: 1.1; -} - -button { - border-radius: 8px; - border: 1px solid transparent; - padding: 0.6em 1.2em; - font-size: 1em; - font-weight: 500; - font-family: inherit; - background-color: #f9f9f9; - cursor: pointer; - transition: border-color 0.25s; -} -button:hover { - border-color: #646cff; -} -button:focus, -button:focus-visible { - outline: 4px auto -webkit-focus-ring-color; -} -[data-theme="dark"] { - color: rgba(255, 255, 255, 0.87); - background-color: #242424; -} - -[data-theme="dark"] a:hover { - color: #535bf2; -} -[data-theme="dark"] button { - background-color: #1a1a1a; -} diff --git a/examples/vite/src/main.tsx b/examples/vite/src/main.tsx deleted file mode 100644 index 3d7150da..00000000 --- a/examples/vite/src/main.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import React from 'react' -import ReactDOM from 'react-dom/client' -import App from './App.tsx' -import './index.css' - -ReactDOM.createRoot(document.getElementById('root')!).render( - - - , -) diff --git a/examples/vite/src/vite-env.d.ts b/examples/vite/src/vite-env.d.ts deleted file mode 100644 index 11f02fe2..00000000 --- a/examples/vite/src/vite-env.d.ts +++ /dev/null @@ -1 +0,0 @@ -/// diff --git a/examples/vite/tsconfig.json b/examples/vite/tsconfig.json deleted file mode 100644 index 483d7b4d..00000000 --- a/examples/vite/tsconfig.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "compilerOptions": { - "target": "ES2020", - "useDefineForClassFields": true, - "lib": ["ES2020", "DOM", "DOM.Iterable"], - "module": "ESNext", - "skipLibCheck": true, - - /* Bundler mode */ - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "jsx": "react-jsx", - - /* Linting */ - "strict": true, - "noUnusedParameters": true, - "noFallthroughCasesInSwitch": true - }, - "include": ["src"], - "references": [{ "path": "./tsconfig.node.json" }] -} diff --git a/examples/vite/tsconfig.node.json b/examples/vite/tsconfig.node.json deleted file mode 100644 index 42872c59..00000000 --- a/examples/vite/tsconfig.node.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "compilerOptions": { - "composite": true, - "skipLibCheck": true, - "module": "ESNext", - "moduleResolution": "bundler", - "allowSyntheticDefaultImports": true - }, - "include": ["vite.config.ts"] -} diff --git a/examples/vite/vite.config.ts b/examples/vite/vite.config.ts deleted file mode 100644 index 861b04b3..00000000 --- a/examples/vite/vite.config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { defineConfig } from 'vite' -import react from '@vitejs/plugin-react-swc' - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react()], -}) diff --git a/package.json b/package.json deleted file mode 100644 index 48ac8930..00000000 --- a/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "private": true, - "scripts": { - "build": "turbo run build", - "dev": "turbo run dev", - "test": "turbo run test", - "lint": "turbo run lint", - "format": "prettier --write \"**/*.{ts,tsx,js,jsx,md,css,scss}\"" - }, - "devDependencies": { - "@changesets/cli": "^2.27.1", - "eslint": "^9.0.0", - "prettier": "^3.2.5", - "tsconfig": "workspace:*", - "turbo": "^1.13.2" - }, - "name": "esbuild-plugin-react18" -} diff --git a/packages/esbuild-plugin-react18-example/.eslintrc.js b/packages/esbuild-plugin-react18-example/.eslintrc.js deleted file mode 100644 index 05ac2b2b..00000000 --- a/packages/esbuild-plugin-react18-example/.eslintrc.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - extends: ["custom/react-internal"], -}; diff --git a/packages/esbuild-plugin-react18-example/.gitignore b/packages/esbuild-plugin-react18-example/.gitignore deleted file mode 100644 index 06435e20..00000000 --- a/packages/esbuild-plugin-react18-example/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# tsup build -dist diff --git a/packages/esbuild-plugin-react18-example/README.md b/packages/esbuild-plugin-react18-example/README.md deleted file mode 100644 index d5100617..00000000 --- a/packages/esbuild-plugin-react18-example/README.md +++ /dev/null @@ -1,33 +0,0 @@ -# Fork Me React.js component - -A simple fork me component for React.js projects! - -## Install - -```bash -$ pnpm add @mayank1513/fork-me -# or -$ npm install @mayank1513/fork-me -# or -$ yarn add @mayank1513/fork-me -``` - -## Add on your page - -```ts - -// and - -``` - -## Optional parameters - -```ts - text?: string; // replace the Fork me on GitHub text - width?: string | number; // if you need to adjust the width of the ribbon (length) - height?: string | number; // to adjust height of the ribbon - bgColor?: string; // background color - textColor?: string; // text color -``` - -> This package also serves as an example to demonstrate how to build and publish `React.js` library compatible with React Server Components diff --git a/packages/esbuild-plugin-react18-example/package.json b/packages/esbuild-plugin-react18-example/package.json deleted file mode 100644 index 764b26d5..00000000 --- a/packages/esbuild-plugin-react18-example/package.json +++ /dev/null @@ -1,75 +0,0 @@ -{ - "name": "esbuild-plugin-react18-example", - "author": "Mayank Kumar Chaudhari ", - "private": true, - "version": "0.0.0", - "description": "An intuitive React.js fork me ribbon component for promoting open source project forks.", - "main": "./dist/index.js", - "types": "./dist/index.d.ts", - "module": "./dist/esm/index.mjs", - "repository": { - "type": "git", - "url": "git+https://github.com/mayank1513/turborepo-template.git" - }, - "bugs": { - "url": "https://github.com/mayank1513/turborepo-template/issues" - }, - "homepage": "https://github.com/mayank1513/turborepo-template/tree/main/packages/fork-me#readme", - "sideEffects": false, - "license": "MIT", - "scripts": { - "test": "vitest run --coverage", - "build": "tsup src && tsc -p tsconfig-build.json && node touchup.js", - "publish-package": "cd dist && npm publish --provenance --access public", - "lint": "eslint ." - }, - "devDependencies": { - "@testing-library/react": "^15.0.2", - "@types/node": "^20.12.7", - "@types/react": "^18.2.79", - "@types/react-dom": "^18.2.25", - "@vitejs/plugin-react": "^4.2.1", - "@vitest/coverage-v8": "^1.5.0", - "esbuild-plugin-ignoretests": "^0.0.7", - "esbuild-plugin-react18": "workspace:*", - "esbuild-plugin-removetestid": "^0.0.5", - "esbuild-react18-useclient": "^1.0.7", - "eslint-config-custom": "workspace:*", - "jsdom": "^24.0.0", - "octokit": "^3.2.0", - "react": "^18.2.0", - "tsconfig": "workspace:*", - "tsup": "^8.0.2", - "typescript": "^5.4.5", - "vite-tsconfig-paths": "^4.3.2", - "vitest": "^1.5.0" - }, - "peerDependencies": { - "@types/react": "16.8 - 19", - "next": "10 - 15", - "react": "16.8 - 19" - }, - "peerDependenciesMeta": { - "next": { - "optional": true - } - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/mayank1513" - }, - "keywords": [ - "fork-me", - "GitHub", - "nextjs", - "nextjs13", - "react", - "react18", - "react-server-components", - "react-client-components", - "typescript", - "javascript", - "mayank1513", - "turborepo-trmplate" - ] -} diff --git a/packages/esbuild-plugin-react18-example/src/client/index.ts b/packages/esbuild-plugin-react18-example/src/client/index.ts deleted file mode 100644 index 25220c81..00000000 --- a/packages/esbuild-plugin-react18-example/src/client/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -"use client"; -/** - * need to export server components and client components from separate files as - * directive on top of the file from which component is imported takes effect. - * i.e., server component re-exported from file with "use client" will behave as client component - * */ - -// client component exports -export * from "./star-me"; diff --git a/packages/esbuild-plugin-react18-example/src/client/star-me/ignore-me.ts b/packages/esbuild-plugin-react18-example/src/client/star-me/ignore-me.ts deleted file mode 100644 index 2133a155..00000000 --- a/packages/esbuild-plugin-react18-example/src/client/star-me/ignore-me.ts +++ /dev/null @@ -1,5 +0,0 @@ -// ignore-me based on content - -/** ignore with content pattern */ - -export const IamIgnored = true; diff --git a/packages/esbuild-plugin-react18-example/src/client/star-me/index.ts b/packages/esbuild-plugin-react18-example/src/client/star-me/index.ts deleted file mode 100644 index 371f7a8b..00000000 --- a/packages/esbuild-plugin-react18-example/src/client/star-me/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -"use client"; - -export * from "./star-me"; diff --git a/packages/esbuild-plugin-react18-example/src/client/star-me/star-me.test.tsx b/packages/esbuild-plugin-react18-example/src/client/star-me/star-me.test.tsx deleted file mode 100644 index 40e0c330..00000000 --- a/packages/esbuild-plugin-react18-example/src/client/star-me/star-me.test.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { cleanup, fireEvent, render, screen } from "@testing-library/react"; -import { afterEach, describe, test, vi } from "vitest"; -import { StarMe } from "./star-me"; - -describe("star-me", () => { - afterEach(cleanup); - - test("smoke", ({ expect }) => { - render(); - expect(screen.getByTestId("star-me-h1").textContent).toBe("Star Me"); - }); - - test("test custom children", ({ expect }) => { - const text = "Star this repo"; - render({text}); - expect(screen.getByTestId("star-me-h1").textContent).toBe(text); - }); - - test("test custom props", ({ expect }) => { - const className = "my-star-class"; - render( - , - ); - expect(screen.getByTestId("star-me-h1").className).toBe(className); - }); - - test("test popup", ({ expect }) => { - render( - ""} />, - ); - const spy = vi.spyOn(window, "open"); - fireEvent.click(screen.getByTestId("star-me-h1")); - expect(spy).toHaveBeenCalled(); - }); -}); diff --git a/packages/esbuild-plugin-react18-example/src/client/star-me/star-me.tsx b/packages/esbuild-plugin-react18-example/src/client/star-me/star-me.tsx deleted file mode 100644 index b0481678..00000000 --- a/packages/esbuild-plugin-react18-example/src/client/star-me/star-me.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import * as React from "react"; - -interface StarMeProps extends React.HTMLAttributes { - gitHubUrl: string; -} - -/** - * # StarMe - * Star repo in a popup window - * - */ -export function StarMe({ gitHubUrl, onClick, children, ...props }: StarMeProps) { - const starMe = (e: React.MouseEvent) => { - window.open(gitHubUrl, "_blank", "height: 400,width:1200,left:150,top:150"); - onClick?.(e); - }; - return ( - - ); -} diff --git a/packages/esbuild-plugin-react18-example/src/declaration.d.ts b/packages/esbuild-plugin-react18-example/src/declaration.d.ts deleted file mode 100644 index 1eabbb42..00000000 --- a/packages/esbuild-plugin-react18-example/src/declaration.d.ts +++ /dev/null @@ -1 +0,0 @@ -declare module "*.module.css"; diff --git a/packages/esbuild-plugin-react18-example/src/index.ts b/packages/esbuild-plugin-react18-example/src/index.ts deleted file mode 100644 index 1cfa1ecc..00000000 --- a/packages/esbuild-plugin-react18-example/src/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -"use client"; - -/** to make sure import statements remain same for monorepo setup and install via npm */ -export * from "./client"; diff --git a/packages/esbuild-plugin-react18-example/src/server/constants.ts b/packages/esbuild-plugin-react18-example/src/server/constants.ts deleted file mode 100644 index b231c4a2..00000000 --- a/packages/esbuild-plugin-react18-example/src/server/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -/** we will replace default colors to test sourceReplacePatterns */ -export const defaultBgColor = "#aaa"; -export const defaultColor = "#555"; diff --git a/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.module.css b/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.module.css deleted file mode 100644 index 9054e747..00000000 --- a/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.module.css +++ /dev/null @@ -1,4 +0,0 @@ -.fork:hover { - filter: drop-shadow(0 0 5px red); - transition: all 1s; -} diff --git a/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.test.tsx b/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.test.tsx deleted file mode 100644 index ebfe54c9..00000000 --- a/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.test.tsx +++ /dev/null @@ -1,22 +0,0 @@ -import { cleanup, render } from "@testing-library/react"; -import { afterEach, describe, test } from "vitest"; -import { ForkMe } from "./fork-me"; - -describe.concurrent("fork-me", () => { - afterEach(cleanup); - - test("Smoke test", ({ expect }) => { - const component = render( - , - ); - expect(component.container.textContent).toBe("Fork Me on GitHub"); - }); - - test("Custom text", ({ expect }) => { - const text = "Star me on GitHub"; - const component = render( - , - ); - expect(component.container.textContent).toBe(text); - }); -}); diff --git a/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.tsx b/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.tsx deleted file mode 100644 index 0284ca3a..00000000 --- a/packages/esbuild-plugin-react18-example/src/server/fork-me/fork-me.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import * as React from "react"; -import cssClasses from "./fork-me.module.css"; -import { defaultBgColor, defaultColor } from "../constants"; - -interface ForkMeProps { - gitHubUrl: string; - text?: string; - width?: string | number; - height?: string | number; - bgColor?: string; - textColor?: string; - noAutoFork?: boolean; -} - -/** - * # ForkMe - * Fork me ribbon - * - * @param props - ForkMeProps - * @returns React.ReactElement - */ -export function ForkMe({ - gitHubUrl, - text, - width, - height, - bgColor, - textColor, - noAutoFork, -}: ForkMeProps) { - const w = (Number.isNaN(Number(width)) ? width : `${width}px`) || "15em"; - const h = (Number.isNaN(Number(height)) ? height : `${height}px`) || "35px"; - const bgC = bgColor || defaultBgColor; - const tC = textColor || defaultColor; - const style = { - "--w": w, - "--h": h, - position: "fixed" as const, - display: "flex", - alignItems: "center", - justifyContent: "center", - fontWeight: 700, - width: w, - height: h, - transform: "rotate(45deg)", - top: "calc(0.354 * var(--w) - var(--h))", - right: "calc(-0.14 * var(--w) - 0.5 * var(--h))", - color: tC, - backgroundColor: bgC, - textShadow: "0px 1px 0px rgba(255, 255, 255, 0.3), 0px -1px 0px rgba(0, 0, 0, 0.7)", - border: "1px dashed gray", - outline: `4px solid ${bgC}`, - }; - - const url = noAutoFork ? gitHubUrl : gitHubUrl.endsWith("fork") ? gitHubUrl : `${gitHubUrl}/fork`; // eslint-disable-line no-nested-ternary -- inteded - return ( - - {text || "Fork Me on GitHub"} - - ); -} diff --git a/packages/esbuild-plugin-react18-example/src/server/fork-me/index.ts b/packages/esbuild-plugin-react18-example/src/server/fork-me/index.ts deleted file mode 100644 index ab5ebd1f..00000000 --- a/packages/esbuild-plugin-react18-example/src/server/fork-me/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./fork-me"; diff --git a/packages/esbuild-plugin-react18-example/src/server/index.ts b/packages/esbuild-plugin-react18-example/src/server/index.ts deleted file mode 100644 index cc34b95f..00000000 --- a/packages/esbuild-plugin-react18-example/src/server/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * need to export server components and client components from separate files as - * directive on top of the file from which component is imported takes effect. - * i.e., server component re-exported from file with "use client" will behave as client component - * */ - -// server component exports -export * from "./fork-me"; diff --git a/packages/esbuild-plugin-react18-example/touchup.js b/packages/esbuild-plugin-react18-example/touchup.js deleted file mode 100644 index 8a9063ab..00000000 --- a/packages/esbuild-plugin-react18-example/touchup.js +++ /dev/null @@ -1,22 +0,0 @@ -/* eslint-disable -- no need - external file */ -"use strict"; - -const fs = require("fs"); -const path = require("path"); -const packageJson = require(path.resolve(__dirname, "package.json")); - -delete packageJson.devDependencies; -delete packageJson.scripts; - -packageJson.main = "index.js"; -packageJson.types = "index.d.ts"; - -fs.writeFileSync( - path.resolve(__dirname, "dist", "package.json"), - JSON.stringify(packageJson, null, 2), -); - -fs.copyFileSync( - path.resolve(__dirname, "..", "..", "README.md"), - path.resolve(__dirname, "dist", "README.md"), -); diff --git a/packages/esbuild-plugin-react18-example/tsconfig-build.json b/packages/esbuild-plugin-react18-example/tsconfig-build.json deleted file mode 100644 index 3785799b..00000000 --- a/packages/esbuild-plugin-react18-example/tsconfig-build.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "extends": "tsconfig/react-library.json", - "compilerOptions": { - "outDir": "dist", - "emitDeclarationOnly": true, - "sourceMap": false - }, - "include": ["src"], - "exclude": ["dist", "build", "node_modules", "**/*.test.*", "**/*.spec.*"] -} diff --git a/packages/esbuild-plugin-react18-example/tsconfig.json b/packages/esbuild-plugin-react18-example/tsconfig.json deleted file mode 100644 index cd6c94d6..00000000 --- a/packages/esbuild-plugin-react18-example/tsconfig.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "tsconfig/react-library.json", - "include": ["."], - "exclude": ["dist", "build", "node_modules"] -} diff --git a/packages/esbuild-plugin-react18-example/tsup.config.ts b/packages/esbuild-plugin-react18-example/tsup.config.ts deleted file mode 100644 index da5711e1..00000000 --- a/packages/esbuild-plugin-react18-example/tsup.config.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { defineConfig } from "tsup"; -import react18Plugin from "esbuild-plugin-react18"; - -export default defineConfig(options => ({ - format: ["cjs", "esm"], - target: "es2019", - sourcemap: false, - clean: true, - bundle: true, - minify: !options.watch, - esbuildPlugins: [react18Plugin()], - legacyOutput: true, -})); diff --git a/packages/esbuild-plugin-react18-example/vitest.config.ts b/packages/esbuild-plugin-react18-example/vitest.config.ts deleted file mode 100644 index c264278a..00000000 --- a/packages/esbuild-plugin-react18-example/vitest.config.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { defineConfig } from "vitest/config"; -import react from "@vitejs/plugin-react"; -import tsconfigPaths from "vite-tsconfig-paths"; - -// https://vitejs.dev/config/ -export default defineConfig({ - plugins: [react(), tsconfigPaths()], - test: { - environment: "jsdom", - globals: true, - setupFiles: [], - coverage: { - include: ["src/**"], - exclude: ["src/**/index.ts", "src/**/declaration.d.ts"], - reporter: ["text", "json", "clover", "html"], - }, - }, -}); diff --git a/packages/eslint-config-custom/README.md b/packages/eslint-config-custom/README.md deleted file mode 100644 index 8b42d901..00000000 --- a/packages/eslint-config-custom/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# `@turbo/eslint-config` - -Collection of internal eslint configurations. diff --git a/packages/eslint-config-custom/library.js b/packages/eslint-config-custom/library.js deleted file mode 100644 index db32ca2c..00000000 --- a/packages/eslint-config-custom/library.js +++ /dev/null @@ -1,33 +0,0 @@ -const { resolve } = require("node:path"); - -const project = resolve(process.cwd(), "tsconfig.json"); - -/* - * This is a custom ESLint configuration for use with - * typescript packages. - * - * This config extends the Vercel Engineering Style Guide. - * For more information, see https://github.com/vercel/style-guide - * - */ - -module.exports = { - extends: ["@vercel/style-guide/eslint/node", "@vercel/style-guide/eslint/typescript"].map( - require.resolve, - ), - parserOptions: { - project, - }, - globals: { - React: true, - JSX: true, - }, - settings: { - "import/resolver": { - typescript: { - project, - }, - }, - }, - ignorePatterns: ["node_modules/", "dist/"], -}; diff --git a/packages/eslint-config-custom/next.js b/packages/eslint-config-custom/next.js deleted file mode 100644 index 3cee3392..00000000 --- a/packages/eslint-config-custom/next.js +++ /dev/null @@ -1,43 +0,0 @@ -const { resolve } = require("node:path"); - -const project = resolve(process.cwd(), "tsconfig.json"); - -/* - * This is a custom ESLint configuration for use with - * Next.js apps. - * - * This config extends the Vercel Engineering Style Guide. - * For more information, see https://github.com/vercel/style-guide - * - */ - -module.exports = { - extends: [ - "@vercel/style-guide/eslint/node", - "@vercel/style-guide/eslint/typescript", - "@vercel/style-guide/eslint/browser", - "@vercel/style-guide/eslint/react", - "@vercel/style-guide/eslint/next", - "eslint-config-turbo", - ].map(require.resolve), - parserOptions: { - project, - }, - globals: { - React: true, - JSX: true, - }, - settings: { - "import/resolver": { - typescript: { - project, - }, - }, - }, - ignorePatterns: ["node_modules/", "dist/"], - // add rules configurations here - rules: { - "import/no-default-export": "off", - "unicorn/filename-case": "off", - }, -}; diff --git a/packages/eslint-config-custom/package.json b/packages/eslint-config-custom/package.json deleted file mode 100644 index 37138e9f..00000000 --- a/packages/eslint-config-custom/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "eslint-config-custom", - "license": "MIT", - "version": "0.0.0", - "private": true, - "devDependencies": { - "@vercel/style-guide": "^6.0.0", - "eslint-config-turbo": "^1.13.2" - } -} diff --git a/packages/eslint-config-custom/react-internal.js b/packages/eslint-config-custom/react-internal.js deleted file mode 100644 index d944fe95..00000000 --- a/packages/eslint-config-custom/react-internal.js +++ /dev/null @@ -1,40 +0,0 @@ -const { resolve } = require("node:path"); - -const project = resolve(process.cwd(), "tsconfig.json"); - -/* - * This is a custom ESLint configuration for use with - * internal (bundled by their consumer) libraries - * that utilize React. - * - * This config extends the Vercel Engineering Style Guide. - * For more information, see https://github.com/vercel/style-guide - * - */ - -module.exports = { - extends: [ - "@vercel/style-guide/eslint/browser", - "@vercel/style-guide/eslint/typescript", - "@vercel/style-guide/eslint/react", - ].map(require.resolve), - parserOptions: { - project, - }, - globals: { - JSX: true, - }, - settings: { - "import/resolver": { - typescript: { - project, - }, - }, - }, - ignorePatterns: ["node_modules/", "dist/", ".eslintrc.js"], - // add rules configurations here - rules: { - "import/no-default-export": "off", - "@typescript-eslint/explicit-function-return-type": "off", - }, -}; diff --git a/packages/tsconfig/base.json b/packages/tsconfig/base.json deleted file mode 100644 index 837bec34..00000000 --- a/packages/tsconfig/base.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Default", - "compilerOptions": { - "composite": false, - "declaration": true, - "declarationMap": true, - "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, - "inlineSources": false, - "isolatedModules": true, - "moduleResolution": "node", - "noUnusedLocals": false, - "noUnusedParameters": false, - "preserveWatchOutput": true, - "skipLibCheck": true, - "strict": true, - "strictNullChecks": true - }, - "exclude": ["node_modules"] -} diff --git a/packages/tsconfig/nextjs.json b/packages/tsconfig/nextjs.json deleted file mode 100644 index d5010a1b..00000000 --- a/packages/tsconfig/nextjs.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "Next.js", - "extends": "./base.json", - "compilerOptions": { - "plugins": [{ "name": "next" }], - "allowJs": true, - "declaration": false, - "declarationMap": false, - "incremental": true, - "jsx": "preserve", - "lib": ["dom", "dom.iterable", "esnext"], - "module": "esnext", - "noEmit": true, - "resolveJsonModule": true, - "strict": false, - "target": "es5" - }, - "include": ["src", "next-env.d.ts"], - "exclude": ["node_modules"] -} diff --git a/packages/tsconfig/package.json b/packages/tsconfig/package.json deleted file mode 100644 index 6efb83e1..00000000 --- a/packages/tsconfig/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "tsconfig", - "version": "0.0.0", - "private": true, - "license": "MIT", - "publishConfig": { - "access": "public" - } -} diff --git a/packages/tsconfig/react-library.json b/packages/tsconfig/react-library.json deleted file mode 100644 index 36b62be3..00000000 --- a/packages/tsconfig/react-library.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "$schema": "https://json.schemastore.org/tsconfig", - "display": "React Library", - "extends": "./base.json", - "compilerOptions": { - "jsx": "react-jsx", - "lib": ["ES2015", "DOM"], - "module": "ESNext", - "target": "es6" - } -} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml deleted file mode 100644 index 9257adbb..00000000 --- a/pnpm-workspace.yaml +++ /dev/null @@ -1,4 +0,0 @@ -packages: - - "examples/*" - - "packages/*" - - "esbuild-plugin-react18" diff --git a/tsconfig.json b/tsconfig.json deleted file mode 100644 index d7555c61..00000000 --- a/tsconfig.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "compilerOptions": { - "jsx": "react" - }, - "extends": "tsconfig/base.json" -} diff --git a/turbo.json b/turbo.json deleted file mode 100644 index 7e45ad86..00000000 --- a/turbo.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "$schema": "https://turbo.build/schema.json", - "globalDependencies": ["**/.env.*local"], - "pipeline": { - "build": { - "outputs": [".next/**", "!.next/cache/**"], - "dependsOn": ["^build"] - }, - "lint": {}, - "test": { - "dependsOn": ["^build"] - }, - "dev": { - "cache": false, - "persistent": true, - "dependsOn": ["^build"] - } - } -} From df3172c9af0ffce614f7ea4704bc5434ead0c1aa Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 11:15:14 +0530 Subject: [PATCH 02/24] Create from updated turborepo-template --- .changeset/README.md | 8 + .changeset/config.json | 11 + .deepsource.toml | 22 + .github/FUNDING.yml | 14 + .github/ISSUE_TEMPLATE/bug_report.md | 40 + .github/ISSUE_TEMPLATE/feature_request.md | 19 + .github/workflows/docs.yml | 45 + .github/workflows/manual-publish.yml | 44 + .github/workflows/publish.yml | 46 + .github/workflows/setup.yml | 35 + .github/workflows/test.yml | 32 + .gitignore | 16 + .npmrc | 1 + .prettierignore | 6 + .prettierrc | 8 + .vscode/extensions.json | 3 + .vscode/settings.json | 17 + CODE_OF_CONDUCT.md | 53 + FEATURED.md | 11 + LICENSE | 373 + README.md | 86 + SECURITY.md | 23 + TODO.md | 43 + contributing.md | 95 + examples/express/.eslintrc.js | 8 + examples/express/package.json | 40 + examples/express/src/__tests__/server.test.ts | 22 + examples/express/src/index.ts | 9 + examples/express/src/server.ts | 23 + examples/express/tsconfig.json | 9 + examples/express/tsup.config.ts | 8 + examples/express/turbo.json | 8 + examples/nextjs/.eslintrc.js | 8 + examples/nextjs/cache/config.json | 6 + examples/nextjs/next-env.d.ts | 5 + examples/nextjs/next.config.js | 3 + examples/nextjs/package.json | 32 + examples/nextjs/public/favicon.ico | Bin 0 -> 15086 bytes examples/nextjs/src/app/button.module.css | 15 + examples/nextjs/src/app/button.tsx | 21 + examples/nextjs/src/app/layout.tsx | 26 + examples/nextjs/src/app/page.tsx | 17 + examples/nextjs/src/app/styles.css | 13 + examples/nextjs/tsconfig.json | 13 + examples/nextjs/turbo.json | 8 + examples/remix/.eslintrc.js | 8 + examples/remix/.gitignore | 11 + examples/remix/README.md | 34 + examples/remix/app/entry.client.tsx | 23 + examples/remix/app/entry.server.tsx | 14 + examples/remix/app/root.tsx | 38 + examples/remix/app/routes/_index.tsx | 11 + examples/remix/app/styles.css | 67 + examples/remix/package.json | 36 + examples/remix/public/favicon.ico | Bin 0 -> 16958 bytes examples/remix/remix.config.js | 9 + examples/remix/remix.env.d.ts | 2 + examples/remix/server.js | 4 + examples/remix/tsconfig.json | 18 + examples/remix/turbo.json | 8 + examples/vite/.eslintrc.js | 8 + examples/vite/index.html | 12 + examples/vite/package.json | 29 + examples/vite/public/favicon.ico | Bin 0 -> 372526 bytes examples/vite/src/app/index.tsx | 27 + examples/vite/src/app/styles.css | 42 + examples/vite/src/index.css | 22 + examples/vite/src/main.tsx | 16 + examples/vite/tsconfig.json | 9 + examples/vite/turbo.json | 8 + examples/vite/vite.config.ts | 6 + lib/.eslintrc.js | 8 + lib/CHANGELOG.md | 49 + lib/README.md | 112 + lib/package.json | 89 + lib/src/client/index.ts | 10 + lib/src/client/loader-container/index.ts | 3 + .../loader-container.module.scss | 13 + .../loader-container.test.tsx | 11 + .../loader-container/loader-container.tsx | 16 + lib/src/constants.ts | 3 + lib/src/declaration.d.ts | 2 + lib/src/hooks/index.ts | 1 + lib/src/hooks/use-loader.test.tsx | 16 + lib/src/hooks/use-loader.ts | 11 + lib/src/index.ts | 9 + lib/src/server/bars/bars1/bars1.module.scss | 28 + lib/src/server/bars/bars1/bars1.test.tsx | 11 + lib/src/server/bars/bars1/bars1.tsx | 14 + lib/src/server/bars/bars1/index.ts | 1 + lib/src/server/bars/bars2/bars2.module.scss | 45 + lib/src/server/bars/bars2/bars2.test.tsx | 11 + lib/src/server/bars/bars2/bars2.tsx | 14 + lib/src/server/bars/bars2/index.ts | 1 + lib/src/server/bars/index.ts | 4 + lib/src/server/common/base/base.test.tsx | 12 + lib/src/server/common/base/base.tsx | 38 + lib/src/server/common/base/index.ts | 1 + lib/src/server/common/index.ts | 3 + lib/src/server/dots/dots1/dots1.module.scss | 16 + lib/src/server/dots/dots1/dots1.test.tsx | 11 + lib/src/server/dots/dots1/dots1.tsx | 14 + lib/src/server/dots/dots1/index.ts | 1 + lib/src/server/dots/dots2/dots2.module.scss | 37 + lib/src/server/dots/dots2/dots2.test.tsx | 11 + lib/src/server/dots/dots2/dots2.tsx | 19 + lib/src/server/dots/dots2/index.ts | 1 + lib/src/server/dots/index.ts | 4 + lib/src/server/index.ts | 9 + lib/tsconfig-build.json | 12 + lib/tsconfig.json | 9 + lib/tsup.config.ts | 18 + lib/turbo.json | 8 + lib/typedoc.config.js | 20 + lib/vitest.config.ts | 18 + package.json | 35 + packages/config-eslint/README.md | 3 + packages/config-eslint/index.js | 34 + packages/config-eslint/next.js | 43 + packages/config-eslint/package.json | 13 + packages/config-eslint/react.js | 39 + packages/config-eslint/remix.js | 43 + packages/config-eslint/server.js | 46 + packages/config-typescript/base.json | 24 + packages/config-typescript/nextjs.json | 18 + packages/config-typescript/package.json | 9 + packages/config-typescript/react-app.json | 17 + packages/config-typescript/react-library.json | 12 + packages/config-typescript/remix.json | 18 + packages/config-typescript/vite.json | 17 + packages/jest-presets/browser/jest-preset.js | 14 + packages/jest-presets/node/jest-preset.js | 13 + packages/jest-presets/package.json | 16 + packages/logger/.eslintrc.js | 11 + packages/logger/package.json | 30 + packages/logger/src/__tests__/log.test.ts | 11 + packages/logger/src/index.ts | 4 + packages/logger/tsconfig.json | 10 + packages/logger/tsup.config.ts | 9 + packages/logger/turbo.json | 8 + packages/shared/.eslintrc.js | 8 + packages/shared/CHANGELOG.md | 42 + packages/shared/package.json | 48 + .../shared/src/client/demo/demo.module.scss | 29 + packages/shared/src/client/demo/demo.test.tsx | 11 + packages/shared/src/client/demo/demo.tsx | 24 + packages/shared/src/client/demo/index.ts | 4 + .../drawer-button/drawer-button.module.scss | 42 + .../drawer-button/drawer-button.test.tsx | 11 + .../client/drawer-button/drawer-button.tsx | 24 + .../shared/src/client/drawer-button/index.ts | 4 + .../global-loader/global-loader.test.tsx | 11 + .../client/global-loader/global-loader.tsx | 25 + .../shared/src/client/global-loader/index.ts | 4 + .../src/client/header/header.module.scss | 91 + .../shared/src/client/header/header.test.tsx | 11 + packages/shared/src/client/header/header.tsx | 34 + packages/shared/src/client/header/index.ts | 4 + .../shared/src/client/header/theme-switch.tsx | 29 + packages/shared/src/client/index.ts | 13 + packages/shared/src/declaration.d.ts | 2 + packages/shared/src/global.scss | 86 + packages/shared/src/index.ts | 3 + packages/shared/src/server/cards/card.tsx | 19 + .../shared/src/server/cards/cards.module.scss | 76 + .../shared/src/server/cards/cards.test.tsx | 11 + packages/shared/src/server/cards/cards.tsx | 13 + packages/shared/src/server/cards/index.ts | 2 + packages/shared/src/server/index.ts | 11 + .../shared/src/server/landing-page/index.ts | 2 + .../landing-page/landing-page.module.scss | 89 + .../server/landing-page/landing-page.test.tsx | 11 + .../src/server/landing-page/landing-page.tsx | 57 + packages/shared/src/server/layout/index.ts | 2 + .../src/server/layout/layout.module.scss | 12 + .../shared/src/server/layout/layout.test.tsx | 11 + packages/shared/src/server/layout/layout.tsx | 32 + packages/shared/src/server/logo/index.ts | 2 + .../shared/src/server/logo/logo.module.scss | 69 + packages/shared/src/server/logo/logo.tsx | 20 + packages/shared/tsconfig-build.json | 12 + packages/shared/tsconfig.json | 9 + packages/shared/tsup.config.ts | 19 + packages/shared/turbo.json | 8 + packages/shared/vitest.config.ts | 18 + plopfile.js | 204 + pnpm-lock.yaml | 14595 ++++++++++++++++ pnpm-workspace.yaml | 5 + popper.png | Bin 0 -> 125685 bytes scripts/doc.js | 20 + scripts/featured.json | 37 + scripts/manual-publish.js | 68 + scripts/package.json | 7 + scripts/publish.js | 39 + scripts/rebrand.config.json | 6 + scripts/rebrand.js | 136 + templates/component.hbs | 24 + templates/component.module.hbs | 3 + templates/component.test.hbs | 13 + tsconfig.docs.json | 9 + turbo.json | 25 + typedoc.config.js | 20 + 202 files changed, 19324 insertions(+) create mode 100644 .changeset/README.md create mode 100644 .changeset/config.json create mode 100644 .deepsource.toml create mode 100644 .github/FUNDING.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/workflows/docs.yml create mode 100644 .github/workflows/manual-publish.yml create mode 100644 .github/workflows/publish.yml create mode 100644 .github/workflows/setup.yml create mode 100644 .github/workflows/test.yml create mode 100644 .gitignore create mode 100644 .npmrc create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/extensions.json create mode 100644 .vscode/settings.json create mode 100644 CODE_OF_CONDUCT.md create mode 100644 FEATURED.md create mode 100644 LICENSE create mode 100644 README.md create mode 100644 SECURITY.md create mode 100644 TODO.md create mode 100644 contributing.md create mode 100644 examples/express/.eslintrc.js create mode 100644 examples/express/package.json create mode 100644 examples/express/src/__tests__/server.test.ts create mode 100644 examples/express/src/index.ts create mode 100644 examples/express/src/server.ts create mode 100644 examples/express/tsconfig.json create mode 100644 examples/express/tsup.config.ts create mode 100644 examples/express/turbo.json create mode 100644 examples/nextjs/.eslintrc.js create mode 100644 examples/nextjs/cache/config.json create mode 100644 examples/nextjs/next-env.d.ts create mode 100644 examples/nextjs/next.config.js create mode 100644 examples/nextjs/package.json create mode 100644 examples/nextjs/public/favicon.ico create mode 100644 examples/nextjs/src/app/button.module.css create mode 100644 examples/nextjs/src/app/button.tsx create mode 100644 examples/nextjs/src/app/layout.tsx create mode 100644 examples/nextjs/src/app/page.tsx create mode 100644 examples/nextjs/src/app/styles.css create mode 100644 examples/nextjs/tsconfig.json create mode 100644 examples/nextjs/turbo.json create mode 100644 examples/remix/.eslintrc.js create mode 100644 examples/remix/.gitignore create mode 100644 examples/remix/README.md create mode 100644 examples/remix/app/entry.client.tsx create mode 100644 examples/remix/app/entry.server.tsx create mode 100644 examples/remix/app/root.tsx create mode 100644 examples/remix/app/routes/_index.tsx create mode 100644 examples/remix/app/styles.css create mode 100644 examples/remix/package.json create mode 100644 examples/remix/public/favicon.ico create mode 100644 examples/remix/remix.config.js create mode 100644 examples/remix/remix.env.d.ts create mode 100644 examples/remix/server.js create mode 100644 examples/remix/tsconfig.json create mode 100644 examples/remix/turbo.json create mode 100644 examples/vite/.eslintrc.js create mode 100644 examples/vite/index.html create mode 100644 examples/vite/package.json create mode 100644 examples/vite/public/favicon.ico create mode 100644 examples/vite/src/app/index.tsx create mode 100644 examples/vite/src/app/styles.css create mode 100644 examples/vite/src/index.css create mode 100644 examples/vite/src/main.tsx create mode 100644 examples/vite/tsconfig.json create mode 100644 examples/vite/turbo.json create mode 100644 examples/vite/vite.config.ts create mode 100644 lib/.eslintrc.js create mode 100644 lib/CHANGELOG.md create mode 100644 lib/README.md create mode 100644 lib/package.json create mode 100644 lib/src/client/index.ts create mode 100644 lib/src/client/loader-container/index.ts create mode 100644 lib/src/client/loader-container/loader-container.module.scss create mode 100644 lib/src/client/loader-container/loader-container.test.tsx create mode 100644 lib/src/client/loader-container/loader-container.tsx create mode 100644 lib/src/constants.ts create mode 100644 lib/src/declaration.d.ts create mode 100644 lib/src/hooks/index.ts create mode 100644 lib/src/hooks/use-loader.test.tsx create mode 100644 lib/src/hooks/use-loader.ts create mode 100644 lib/src/index.ts create mode 100644 lib/src/server/bars/bars1/bars1.module.scss create mode 100644 lib/src/server/bars/bars1/bars1.test.tsx create mode 100644 lib/src/server/bars/bars1/bars1.tsx create mode 100644 lib/src/server/bars/bars1/index.ts create mode 100644 lib/src/server/bars/bars2/bars2.module.scss create mode 100644 lib/src/server/bars/bars2/bars2.test.tsx create mode 100644 lib/src/server/bars/bars2/bars2.tsx create mode 100644 lib/src/server/bars/bars2/index.ts create mode 100644 lib/src/server/bars/index.ts create mode 100644 lib/src/server/common/base/base.test.tsx create mode 100644 lib/src/server/common/base/base.tsx create mode 100644 lib/src/server/common/base/index.ts create mode 100644 lib/src/server/common/index.ts create mode 100644 lib/src/server/dots/dots1/dots1.module.scss create mode 100644 lib/src/server/dots/dots1/dots1.test.tsx create mode 100644 lib/src/server/dots/dots1/dots1.tsx create mode 100644 lib/src/server/dots/dots1/index.ts create mode 100644 lib/src/server/dots/dots2/dots2.module.scss create mode 100644 lib/src/server/dots/dots2/dots2.test.tsx create mode 100644 lib/src/server/dots/dots2/dots2.tsx create mode 100644 lib/src/server/dots/dots2/index.ts create mode 100644 lib/src/server/dots/index.ts create mode 100644 lib/src/server/index.ts create mode 100644 lib/tsconfig-build.json create mode 100644 lib/tsconfig.json create mode 100644 lib/tsup.config.ts create mode 100644 lib/turbo.json create mode 100644 lib/typedoc.config.js create mode 100644 lib/vitest.config.ts create mode 100644 package.json create mode 100644 packages/config-eslint/README.md create mode 100644 packages/config-eslint/index.js create mode 100644 packages/config-eslint/next.js create mode 100644 packages/config-eslint/package.json create mode 100644 packages/config-eslint/react.js create mode 100644 packages/config-eslint/remix.js create mode 100644 packages/config-eslint/server.js create mode 100644 packages/config-typescript/base.json create mode 100644 packages/config-typescript/nextjs.json create mode 100644 packages/config-typescript/package.json create mode 100644 packages/config-typescript/react-app.json create mode 100644 packages/config-typescript/react-library.json create mode 100644 packages/config-typescript/remix.json create mode 100644 packages/config-typescript/vite.json create mode 100644 packages/jest-presets/browser/jest-preset.js create mode 100644 packages/jest-presets/node/jest-preset.js create mode 100644 packages/jest-presets/package.json create mode 100644 packages/logger/.eslintrc.js create mode 100644 packages/logger/package.json create mode 100644 packages/logger/src/__tests__/log.test.ts create mode 100644 packages/logger/src/index.ts create mode 100644 packages/logger/tsconfig.json create mode 100644 packages/logger/tsup.config.ts create mode 100644 packages/logger/turbo.json create mode 100644 packages/shared/.eslintrc.js create mode 100644 packages/shared/CHANGELOG.md create mode 100644 packages/shared/package.json create mode 100644 packages/shared/src/client/demo/demo.module.scss create mode 100644 packages/shared/src/client/demo/demo.test.tsx create mode 100644 packages/shared/src/client/demo/demo.tsx create mode 100644 packages/shared/src/client/demo/index.ts create mode 100644 packages/shared/src/client/drawer-button/drawer-button.module.scss create mode 100644 packages/shared/src/client/drawer-button/drawer-button.test.tsx create mode 100644 packages/shared/src/client/drawer-button/drawer-button.tsx create mode 100644 packages/shared/src/client/drawer-button/index.ts create mode 100644 packages/shared/src/client/global-loader/global-loader.test.tsx create mode 100644 packages/shared/src/client/global-loader/global-loader.tsx create mode 100644 packages/shared/src/client/global-loader/index.ts create mode 100644 packages/shared/src/client/header/header.module.scss create mode 100644 packages/shared/src/client/header/header.test.tsx create mode 100644 packages/shared/src/client/header/header.tsx create mode 100644 packages/shared/src/client/header/index.ts create mode 100644 packages/shared/src/client/header/theme-switch.tsx create mode 100644 packages/shared/src/client/index.ts create mode 100644 packages/shared/src/declaration.d.ts create mode 100644 packages/shared/src/global.scss create mode 100644 packages/shared/src/index.ts create mode 100644 packages/shared/src/server/cards/card.tsx create mode 100644 packages/shared/src/server/cards/cards.module.scss create mode 100644 packages/shared/src/server/cards/cards.test.tsx create mode 100644 packages/shared/src/server/cards/cards.tsx create mode 100644 packages/shared/src/server/cards/index.ts create mode 100644 packages/shared/src/server/index.ts create mode 100644 packages/shared/src/server/landing-page/index.ts create mode 100644 packages/shared/src/server/landing-page/landing-page.module.scss create mode 100644 packages/shared/src/server/landing-page/landing-page.test.tsx create mode 100644 packages/shared/src/server/landing-page/landing-page.tsx create mode 100644 packages/shared/src/server/layout/index.ts create mode 100644 packages/shared/src/server/layout/layout.module.scss create mode 100644 packages/shared/src/server/layout/layout.test.tsx create mode 100644 packages/shared/src/server/layout/layout.tsx create mode 100644 packages/shared/src/server/logo/index.ts create mode 100644 packages/shared/src/server/logo/logo.module.scss create mode 100644 packages/shared/src/server/logo/logo.tsx create mode 100644 packages/shared/tsconfig-build.json create mode 100644 packages/shared/tsconfig.json create mode 100644 packages/shared/tsup.config.ts create mode 100644 packages/shared/turbo.json create mode 100644 packages/shared/vitest.config.ts create mode 100644 plopfile.js create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml create mode 100644 popper.png create mode 100644 scripts/doc.js create mode 100644 scripts/featured.json create mode 100644 scripts/manual-publish.js create mode 100644 scripts/package.json create mode 100644 scripts/publish.js create mode 100644 scripts/rebrand.config.json create mode 100644 scripts/rebrand.js create mode 100644 templates/component.hbs create mode 100644 templates/component.module.hbs create mode 100644 templates/component.test.hbs create mode 100644 tsconfig.docs.json create mode 100644 turbo.json create mode 100644 typedoc.config.js diff --git a/.changeset/README.md b/.changeset/README.md new file mode 100644 index 00000000..e5b6d8d6 --- /dev/null +++ b/.changeset/README.md @@ -0,0 +1,8 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works +with multi-package repos, or single-package repos to help you version and publish your code. You can +find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in +[our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/.changeset/config.json b/.changeset/config.json new file mode 100644 index 00000000..013fcc2b --- /dev/null +++ b/.changeset/config.json @@ -0,0 +1,11 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": "@changesets/cli/changelog", + "commit": false, + "fixed": [], + "linked": [], + "access": "restricted", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": ["@example/*"] +} diff --git a/.deepsource.toml b/.deepsource.toml new file mode 100644 index 00000000..fe4472e4 --- /dev/null +++ b/.deepsource.toml @@ -0,0 +1,22 @@ +version = 1 + +test_patterns = ["**/.*test.*"] + +exclude_patterns = [ + "docs/**", + "**/.*test.*" +] + +[[analyzers]] +name = "javascript" + + [analyzers.meta] + plugins = ["react"] + environment = [ + "nodejs", + "vitest", + "browser" + ] + +[[transformers]] +name = "prettier" \ No newline at end of file diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..95f5d426 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,14 @@ +# These are supported funding model platforms + +github: [mayank1513] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +polar: mayank1513 +patreon: # Replace with a single Patreon username +open_collective: # Replace with a single Open Collective username +ko_fi: # Replace with a single Ko-fi username +tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel +community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry +liberapay: # Replace with a single Liberapay username +issuehunt: # Replace with a single IssueHunt username +otechie: # Replace with a single Otechie username +lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry +custom: [https://pages.razorpay.com/mayank1513] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 00000000..9b77ea71 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,40 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "" +labels: "" +assignees: "" +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: + +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Desktop (please complete the following information):** + +- OS: [e.g. iOS] +- Browser [e.g. chrome, safari] +- Version [e.g. 22] + +**Smartphone (please complete the following information):** + +- Device: [e.g. iPhone6] +- OS: [e.g. iOS8.1] +- Browser [e.g. stock browser, safari] +- Version [e.g. 22] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 00000000..2bc5d5f7 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,19 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "" +labels: "" +assignees: "" +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..89ed4685 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,45 @@ +name: Update dependencies and Docs + +on: + push: + branches: [main] + schedule: + - cron: "0 */8 * * *" +jobs: + generate-docs: + if: github.event.repository.owner.login == 'react18-tools' + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/setup-node@v4 + with: + registry-url: https://registry.npmjs.org + node-version: 20 + - run: npm i -g pnpm@9.0.5 && pnpm i + name: Install dependencies + - name: Test + run: npm test + - run: git status && git clean -f -d && git status + name: clean up working directory + - run: npx @turbo/codemod update . && pnpm update --latest -r + name: Update dependencies + - run: pnpm build + name: Build all apps to make sure it is not broken due to dependency upgrades + - name: Run unit tests + run: pnpm test + - name: Generate/update docs + run: pnpm doc + - name: Setup Git + run: | + git config --global user.name "mayank1513" + git config --global user.email "mayank.srmu@gmail.com" + git fetch + git checkout main + git pull + - name: Save upgraded packages back to repo + run: git add . && git commit -m "upgrade deps && docs" && git push origin main diff --git a/.github/workflows/manual-publish.yml b/.github/workflows/manual-publish.yml new file mode 100644 index 00000000..7fe9b255 --- /dev/null +++ b/.github/workflows/manual-publish.yml @@ -0,0 +1,44 @@ +name: Manually publish to NPM - Apply changeset in the workflow. + +# publish only when package json has changed - assuming version upgrade +on: + workflow_dispatch: + +jobs: + publish: + if: github.event.repository.owner.login == 'react18-tools' + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/setup-node@v4 + with: + node-version: 20 + registry-url: https://registry.npmjs.org + - run: npm i -g pnpm@9.0.5 && pnpm i + name: Install dependencies + # fail and not publish if any of the unit tests are failing + - name: Test + run: pnpm test + - name: clean up working directory + run: git status && git clean -f -d && git status + - name: Setup Git + run: | + git config --global user.name "mayank1513" + git config --global user.email "mayank.srmu@gmail.com" + # - name: Copy Readme file + # run: cp ../README.md . # todo: uncomment this line while rebranding + - name: Apply changesets, publish and create release, branches and tags + run: node ./scripts/manual-publish.js + env: + BRANCH: ${{ github.ref_name }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..8c774974 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,46 @@ +name: Publish to NPM + +# publish only when package json has changed - assuming version upgrade +on: + push: + branches: [main] + paths: "lib/package.json" + +jobs: + publish: + # Don't run just after creating repo from template + # Also avoid running after merging set-up PR + if: github.run_number > 2 && github.event.repository.owner.login == 'react18-tools' + runs-on: ubuntu-latest + permissions: + contents: write + id-token: write + + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + + - uses: actions/setup-node@v4 + with: + node-version: 20 + registry-url: https://registry.npmjs.org + - run: npm i -g pnpm@9.0.5 && pnpm i + name: Install dependencies + # fail and not publish if any of the unit tests are failing + - name: Test + run: pnpm test + - name: Setup Git + run: | + git config --global user.name "mayank1513" + git config --global user.email "mayank.srmu@gmail.com" + # - name: Copy Readme file + # run: cp ../README.md . # will be uncommented while rebranding + - name: Apply changesets, publish and create release, branches and tags + run: node ./scripts/publish.js + env: + BRANCH: ${{ github.ref_name }} + DEFAULT_BRANCH: ${{ github.event.repository.default_branch }} + NODE_AUTH_TOKEN: ${{ secrets.NPM_AUTH_TOKEN }} + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + token: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/setup.yml b/.github/workflows/setup.yml new file mode 100644 index 00000000..346ec6ef --- /dev/null +++ b/.github/workflows/setup.yml @@ -0,0 +1,35 @@ +name: setup repo + +on: + create: + workflow_dispatch: + +jobs: + setup: + if: github.ref == 'refs/heads/main' + runs-on: ubuntu-latest + permissions: + contents: write + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Setup Git + run: | + git config --global user.name "Mayank Chaudhari" + git config --global user.email "mayank.srmu@gmail.com" + git fetch + git checkout main + - name: Set up repo + run: | + sed -i -e "s/rebrand/postinstall/" package.json + sed -i -e "s/.*owner.*/\t\"owner\": \"${{ github.repository_owner }}\",/" ./scripts/rebrand.config.json + sed -i -e "s/.*npm_user.*/\t\"npm_user\": \"${{ github.repository_owner }}\",/" ./scripts/rebrand.config.json + sed -i -e "s/.*repo.*/\t\"repo\": \"${{ github.event.repository.name }}\",/" ./scripts/rebrand.config.json + sed -i -e "s/.*packageName.*/\t\"packageName\": \"${{ github.event.repository.name }}\"/" ./scripts/rebrand.config.json + git rm .tkb + - name: Push changes back to repo + run: | + git add . + git commit -m 'Craete rebrand config 💖 Mayank Kumar Chaudhari [skip ci]' + git push origin main diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml new file mode 100644 index 00000000..77a908bd --- /dev/null +++ b/.github/workflows/test.yml @@ -0,0 +1,32 @@ +name: test + +on: + push: + pull_request: + schedule: + - cron: "5 */8 * * *" +jobs: + test: + if: github.run_number != 1 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: 20 + - run: npm i -g pnpm@9.0.5 && pnpm i + name: Install dependencies + - name: Run unit tests + run: pnpm test + - name: Upload coverage reports to Codecov + continue-on-error: true + uses: codecov/codecov-action@v4 + with: + directory: ./lib + token: ${{ secrets.CODECOV_TOKEN }} + - uses: paambaati/codeclimate-action@v5.0.0 + continue-on-error: true + env: + CC_TEST_REPORTER_ID: ${{ secrets.CC_TEST_REPORTER_ID }} + with: + coverageLocations: ./lib/coverage/*.xml:clover diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..544fb870 --- /dev/null +++ b/.gitignore @@ -0,0 +1,16 @@ +.DS_Store +node_modules +.turbo +*.log +.next +dist +dist-ssr +*.local +.env +.cache + +# test coverage +coverage + +# temporary files +tsup.config.bundled* diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..ded82e2f --- /dev/null +++ b/.npmrc @@ -0,0 +1 @@ +auto-install-peers = true diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..e58c2191 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,6 @@ +*lock.* + +# ignore hbs files as prettier removes all spaces and makes it ugly +*hbs +docs +.vscode diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..0b48ac1a --- /dev/null +++ b/.prettierrc @@ -0,0 +1,8 @@ +{ + "singleQuote": false, + "printWidth": 100, + "tabWidth": 2, + "arrowParens": "avoid", + "jsxBracketSameLine": true, + "bracketSameLine": true +} diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..6315e5c1 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,3 @@ +{ + "recommendations": ["esbenp.prettier-vscode", "mayank1513.trello-kanban-task-board"] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 00000000..36db13c4 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,17 @@ +{ + // Formatting using Prettier by default for all languages + "editor.defaultFormatter": "esbenp.prettier-vscode", + + // Ensure enough terminal history is preserved when running tests. + "terminal.integrated.scrollback": 10000, + + // Disable TypeScript surveys. + "typescript.surveys.enabled": false, + + "editor.tabSize": 2, + "editor.wordWrap": "on", + "editor.formatOnSave": true, + "editor.formatOnPaste": true, + "editor.formatOnSaveMode": "file", + "mayank1513.trello-kanban.Workspace.filePath": ".tkb" +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 00000000..3b68e0fa --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,53 @@ +## Code of Conduct + +### Our Pledge + +We as members, contributors, and leaders pledge to make participation in our community a harassment-free experience for everyone, regardless of age, body size, visible or invisible disability, ethnicity, sex characteristics, gender identity and expression, level of experience, education, socio-economic status, nationality, personal appearance, race, caste, color, religion, or sexual identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, diverse, inclusive, and healthy community. + +### Our Standards + +Examples of behavior that contributes to a positive environment for our community include: + +- Demonstrating empathy and kindness toward other people +- Being respectful of differing opinions, viewpoints, and experiences +- Giving and gracefully accepting constructive feedback +- Accepting responsibility and apologizing to those affected by our mistakes, and learning from the experience +- Focusing on what is best not just for us as individuals, but for the overall community + +Examples of unacceptable behavior include: + +- The use of sexualized language or imagery, and sexual attention or advances of any kind +- Trolling, insulting or derogatory comments, and personal or political attacks +- Public or private harassment +- Publishing others’ private information, such as a physical or email address, without their explicit permission +- Other conduct which could reasonably be considered inappropriate in a professional setting + +### Enforcement Responsibilities + +Project maintainers are responsible for clarifying and enforcing our standards of acceptable behavior and will take appropriate and fair corrective action in response to any behavior that they deem inappropriate, threatening, offensive, or harmful. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, and will communicate reasons for moderation decisions when appropriate. + +### Scope + +This Code of Conduct applies within all community spaces, and also applies when an individual is officially representing the community in public spaces. Examples of representing our community include using an official e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. + +### Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported to the project team responsible for enforcement at [coc@example.com](mailto:coc@example.com). All complaints will be reviewed and investigated promptly and fairly. + +All project maintainers are obligated to respect the privacy and security of the reporter of any incident. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +### Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 2.1, +available at [https://www.contributor-covenant.org/version/2/1/code_of_conduct/][version] + +[homepage]: http://contributor-covenant.org +[version]: https://www.contributor-covenant.org/version/2/1 diff --git a/FEATURED.md b/FEATURED.md new file mode 100644 index 00000000..97909ff2 --- /dev/null +++ b/FEATURED.md @@ -0,0 +1,11 @@ +# Featured packages built with this template. + +> This file is automatically generated. Please refrain from editing it directly. To add your package, update `scripts/featured.json` in alphabetical order. + +- [esbuild-plugin-react18](https://github.com/react18-tools/esbuild-plugin-react18) - An esbuild plugin for compiling libraries compatible with React 18 server and client component, Nextjs13, and Nextjs14 +- [esbuild-plugin-react18-css](https://github.com/react18-tools/esbuild-plugin-react18-css) - ESBuild plugin to handle CSS/SCSS modules, autoprefixer, etc. +- [Nextjs-Themes](https://github.com/react18-tools/nextjs-themes) - 🤟 👉 Theme with confidence and Unleash the Power of React Server Components +- [Persist-And-Sync](https://github.com/react18-tools/persist-and-sync) - Zustand middleware to easily persist and sync Zustand state between tabs / windows / iframes (Same Origin) +- [React 18 Themes](https://github.com/react18-tools/react18-themes) - 🤟 👉 Unleash the Power of React Server Components +- [React18 Global Store](https://github.com/react18-tools/react18-global-store) - A simple yet elegant, light weight, react18 global store to replace Zustand for better tree shaking. +- [Zustand Sync Tabs](https://github.com/react18-tools/zustand-sync-tabs) - Zustand middleware to easily sync Zustand state between tabs / windows / iframes (Same Origin) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..a612ad98 --- /dev/null +++ b/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/README.md b/README.md new file mode 100644 index 00000000..834e2d8c --- /dev/null +++ b/README.md @@ -0,0 +1,86 @@ +# Turborepo Template + +[![test](https://github.com/react18-tools/turborepo-template/actions/workflows/test.yml/badge.svg)](https://github.com/react18-tools/turborepo-template/actions/workflows/test.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/aa896ec14c570f3bb274/maintainability)](https://codeclimate.com/github/react18-tools/turborepo-template/maintainability) [![codecov](https://codecov.io/gh/react18-tools/turborepo-template/graph/badge.svg)](https://codecov.io/gh/react18-tools/turborepo-template) [![Version](https://img.shields.io/npm/v/react18-loaders.svg?colorB=green)](https://www.npmjs.com/package/react18-loaders) [![Downloads](https://img.jsdelivr.com/img.shields.io/npm/d18m/react18-loaders.svg)](https://www.npmjs.com/package/react18-loaders) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/react18-loaders) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/from-referrer/) + +> [Explore featured packages built with this template.](./FEATURED.md) + +> Exciting news! We've launched a new course to help you master this template: [Craft Next Gen UI Libraries for React 18 and Next.js 14](https://www.udemy.com/course/craft-next-gen-ui-libraries-for-react-18-and-nextjs-14/?referralCode=46B8C7845ECCEA99E0EF) + +## Features + +This template offers the following pre-configured features. Additionally, your repository will automatically be rebranded with the help of workflows and post-install scripts. + +✅ Monorepo powered by Turborepo and GitHub actions for automating building, testing, and deploying your library + +✅ Examples with Next.js, Vite, and Remix to showcase how your library can be utilized (Note: Remix is optional due to instability in monorepo setup and folder imports) + +✅ Examples pre-configured for Light/Dark theme based on user preference + +✅ Examples ready to be deployed to Vercel + +✅ Typedoc setup for automatic documentation generation based on tsdoc comments + +✅ Code of Conduct and contributing files, ready for customization + +✅ Prettier and linter configured according to modern best practices (Feel free to add your flavor) + +✅ Recommended VSCode extensions - Prettier and [Kanban board](https://github.com/mayank1513/vscode-extension-trello-kanban-board) for code formatting and project management directly within your IDE + +✅ Powerful code generators - try `yarn plop` + +✅ Test setup with Vitest - A modern and fast testing framework supporting Jest-like APIs + +✅ Workflows to automate testing on every pull-request or code push event + +✅ Workflow to automatically publish and create GitHub releases when you update your library's `package.json` file. + +✅ Workflow to automatically rebrand the entire template based on your repository name. (Refer [TODO.md](./TODO.md)) + +✅ Plus, this readme file includes a quick checklist for configuring Codecov and other badges, setting up your docs website on GitHub pages, and more. See [Checklist](./TODO.md). + +### Creates a library that is + +✅ Fully Treeshakable (e.g., import {Bars1, Bars2} from `react18-loaders/dist/server/bars`) + +✅ Fully TypeScript Supported + +✅ Leverages the power of React 18 Server components + +✅ Compatible with all React 18 build systems/tools/frameworks + +✅ Documented with [Typedoc](https://react18-tools.github.io/turborepo-template) ([Docs](https://react18-tools.github.io/turborepo-template)) + +## Getting Started: + +This template is based on one of the official Turbo Repo starters but comes with a plethora of additional features specifically designed for developing and publishing JavaScript/TypeScript libraries, especially for React 18. + +To get started, simply click on the `"Use this template"` button to create a new repository based on this template. Customize it according to your requirements for your next JavaScript/TypeScript/React/Next.js library or project. + +For detailed instructions and a checklist, please refer to [TODO.md](./TODO.md). + +## What's Different from Turborepo official templates? + +Compared to the default scaffold from create-turbo, this template offers: + +- Unit tests with `vitest` +- Build setup with `tsup` and `esbuild-plugin-react18` that supports React Server components out of the box +- **Automatic file generation** + - Simply run `yarn plop` and follow the prompts to auto-generate your new component with test files and dependency linking, adhering to best practices automatically +- GitHub actions/workflows to auto-publish your package when the version changes +- GitHub action/workflow + pre-install scripts to automatically rebrand your repo on creation + +### 🤩 Don't forget to star [this repository](https://github.com/react18-tools/turborepo-template)! + +Looking for a hands-on course to get started with Turborepo? Check out [React and Next.js with TypeScript](https://mayank-chaudhari.vercel.app/courses/react-and-next-js-with-typescript) and [The Game of Chess with Next.js, React, and TypeScript](https://www.udemy.com/course/game-of-chess-with-nextjs-react-and-typescript/?referralCode=851A28F10B254A8523FE) + +![Repo Stats](https://repobeats.axiom.co/api/embed/2ef1a24385037998386148afe5a98ded6006f410.svg "Repobeats analytics image") + +## License + +Licensed under the MPL-2.0 open-source license. + +> Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work. + +
+ +

with 💖 by Mayank Kumar Chaudhari

diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..bec03058 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,23 @@ +# Security Policy + +## Version Support + +We provide support for the latest minor version. Pull requests aimed at fixing security vulnerabilities in the version immediately preceding the latest will be considered. Support for versions prior to this relies entirely on community-driven pull requests. + +| Version | Support Status | +| ------- | ------------------ | +| 0.0.x | :white_check_mark: | +| 0.0.x | :warning: | +| < 0.0 | :x: | + +## Patching Long-Term Support (LTS) Versions + +If you rely on a previous minor version of TypeDoc and need to address security issues, kindly submit a pull request to the `lts` branch. Upon merge, your patch will automatically trigger the publication of a new version. + +Ensure to update the version field in `package.json`. + +Note: We only accept pull requests addressing security vulnerabilities. Additional functionalities and bug fixes for older versions are beyond the scope. + +## Reporting Vulnerabilities + +Kindly report vulnerabilities [here](https://github.com/react18-tools/turborepo-template/security/advisories/new). diff --git a/TODO.md b/TODO.md new file mode 100644 index 00000000..a68e00cd --- /dev/null +++ b/TODO.md @@ -0,0 +1,43 @@ +## Step-by-Step Instructions and Checklist + +- [ ] Star [this repository](https://github.com/react18-tools/turborepo-template/) for easy access and to show your support +- [ ] Create a new GitHub repository using this template. + - Click the `Use this template` button at the top right -> `Create a new repository` + - Click `Create repository` and wait for the setup workflow to finish rebranding your repo. +- [ ] Install and set up Node.js and your IDE (VSCode recommended) +- [ ] Install the recommended VSCode extensions: + - [Prettier](https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode) + - [Trello Kanban](https://marketplace.visualstudio.com/items?itemName=mayank1513.trello-kanban-task-board) +- [ ] Update [`sripts/rebrand.config.json`](./scripts/rebrand.config.json) if required. +- [ ] Install `pnpm` using `npm i -g pnpm@9.0.5` +- [ ] Install dependencies using `pnpm` + - Run `pnpm i` to install dependencies; the `rebrand` script will automatically rebrand the repo, adjust workflows, and create a commit +- [ ] Run `yarn plop`, and follow prompts to generate server or client components for your library +- [ ] 🌟 Enable [private vulnerability reporting] +- [ ] Set up `CodeCov` + - Visit Codecov and set up your repo + - Create [repository secret] for `CODECOV_TOKEN` +- [ ] Set up `CodeClimate` + - Visit CodeClimate and set up your repo + - Create [repository secret] for `CC_TEST_REPORTER_ID` + - Add `*.test.*` to ignore patterns on the website + - Update Code Climate badge +- [ ] Add `NPM_AUTH_TOKEN` to repository secrets to automate package publishing + - Log in to your [`npm` account](https://www.npmjs.com/login) and create an automation token + - Create a new repository secret `NPM_AUTH_TOKEN` +- [ ] Update description in `lib/package.json` +- [ ] (Optional) Add Repo Stats by visiting and setting up [repobeats](https://repobeats.axiom.co/) +- [ ] Create your library and update examples +- [ ] Update README as required +- [ ] Set up GitHub pages to deploy docs + - Go to [repo settings] -> pages (On the left panel); Select deploy from a branch; Then Select `main` and `/docs` +- [ ] (Optional) Set up [Deepsource](https://app.deepsource.com/login) for static code analysis +- [ ] Push your changes/Create PR and see your library being automatically tested and published +- [ ] Optionally deploy your examples to Vercel. +- [ ] Feel free to star this template, contribute, and/or sponsor the [`terborepo-template`](https://github.com/react18-tools/turborepo-template) project or my [other open-source work](https://github.com/sponsors/mayank1513) +- [ ] You can also fork the [`terborepo-template`](https://github.com/react18-tools/turborepo-template/fork) and add your package to `scripts/featured.json` + - If approved, your package will be automatically added to FEATURED.md and also published on the home page of this repo. + +
+ +

with 💖 by Mayank Kumar Chaudhari

diff --git a/contributing.md b/contributing.md new file mode 100644 index 00000000..f13085b9 --- /dev/null +++ b/contributing.md @@ -0,0 +1,95 @@ +# Contribution Guidelines + +## Overview + +### Included Utilities + +This template is equipped with pre-configured tools to streamline your development process: + +- Monorepo setup powered by TurboRepo + - TurboRepo is renowned for its efficient builds and caching mechanisms, minimizing unnecessary builds. +- [TypeScript](https://www.typescriptlang.org/) for static type checking +- [ESLint](https://eslint.org/) for code linting +- [Prettier](https://prettier.io) for code formatting +- Plop-based code generator for effortlessly scaffolding new components +- Automatic rebranding functionality for this template +- Workflows facilitating testing, documentation, dependency updates, and deployment of your docs and packages +- Build setup capable of creating appropriate CJS and ESM builds to support React 18 server and client component exports from the same library +- Out-of-the-box support for SCSS modules for `lib` and `packages/shared` + +### Apps and Packages + +This TurboRepo comprises the following packages/examples, all written in [TypeScript](https://www.typescriptlang.org/): + +- `@example/nextjs`: a [Next.js](https://nextjs.org/) app +- `@example/vite`: a [Vite.js](https://vitest.dev) app +- `@example/remix`: a Remix app +- `@repo/eslint-config`: `eslint` configurations (includes `eslint-config-next` and `eslint-config-prettier`) +- `@repo/typescript-config`: `tsconfig.json`s used throughout the monorepo +- `@repo/jest-presets`: Jest presets for unit testing +- `@repo/logger`: A configurable shared logger utility +- `@repo/shared`: An internal library of components utilized by the examples +- `react18-loaders`: a React component library (The core package published to NPM) + +## Automated File Generation + +Simply execute `yarn turbo gen` and follow the prompts to automatically generate your new component along with a test file and dependency linking, adhering to best practices. + +### Build + +To build all apps and packages, execute the following command: + +```bash +pnpm build +``` + +### Development + +For development of all apps and packages, run: + +```bash +pnpm dev +``` + +### Running Unit Tests + +To execute unit tests, use: + +```bash +pnpm test +``` + +### Linting and Formatting + +Before creating a PR, ensure that linting passes and format the code properly with: + +```bash +pnpm lint +``` + +and + +```bash +pnpm format +``` + +## Useful Resources + +Explore more about TurboRepo and Next.js through the following links: + +- [React and Next.js with TypeScript](https://www.udemy.com/course/react-and-next-js-with-typescript/?referralCode=7202184A1E57C3DCA8B2) - an interactive Next.js course. +- [The Game of Chess with Next.js, React, and TypeScript](https://www.udemy.com/course/game-of-chess-with-nextjs-react-and-typescrypt/?referralCode=851A28F10B254A8523FE) +- [Tasks](https://turbo.build/repo/docs/core-concepts/monorepos/running-tasks) +- [Caching](https://turbo.build/repo/docs/core-concepts/caching) +- [Remote Caching](https://turbo.build/repo/docs/core-concepts/remote-caching) +- [Filtering](https://turbo.build/repo/docs/core-concepts/monorepos/filtering) +- [Configuration Options](https://turbo.build/repo/docs/reference/configuration) +- [CLI Usage](https://turbo.build/repo/docs/reference/command-line-reference) + +> Quick tip: Remove all stale branches with `git branch --merged main | grep -v '^[ *]*main$' | xargs git branch -d` + +> Consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work. + +
+ +

with 💖 by Mayank Kumar Chaudhari

diff --git a/examples/express/.eslintrc.js b/examples/express/.eslintrc.js new file mode 100644 index 00000000..c25697c3 --- /dev/null +++ b/examples/express/.eslintrc.js @@ -0,0 +1,8 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["@repo/eslint-config/server.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/examples/express/package.json b/examples/express/package.json new file mode 100644 index 00000000..1b33dd86 --- /dev/null +++ b/examples/express/package.json @@ -0,0 +1,40 @@ +{ + "name": "@example/express", + "version": "0.0.0", + "private": true, + "scripts": { + "start": "node dist/index.js", + "dev": "tsup --watch --onSuccess \"node dist/index.js\"", + "build": "tsup", + "clean": "rm -rf dist", + "typecheck": "tsc --noEmit", + "lint": "eslint src/", + "test": "jest --detectOpenHandles" + }, + "jest": { + "preset": "@repo/jest-presets/node" + }, + "dependencies": { + "@repo/logger": "workspace:*", + "body-parser": "^1.20.2", + "cors": "^2.8.5", + "express": "^4.19.2", + "morgan": "^1.10.0" + }, + "devDependencies": { + "@repo/eslint-config": "workspace:*", + "@repo/jest-presets": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@types/body-parser": "^1.19.5", + "@types/cors": "^2.8.17", + "@types/express": "^4.17.21", + "@types/jest": "^29.5.12", + "@types/morgan": "^1.9.9", + "@types/node": "^20.12.10", + "@types/supertest": "^6.0.2", + "jest": "^29.7.0", + "supertest": "^7.0.0", + "tsup": "^8.0.2", + "typescript": "^5.4.5" + } +} diff --git a/examples/express/src/__tests__/server.test.ts b/examples/express/src/__tests__/server.test.ts new file mode 100644 index 00000000..dbc6a9dc --- /dev/null +++ b/examples/express/src/__tests__/server.test.ts @@ -0,0 +1,22 @@ +import supertest from "supertest"; +import { createServer } from "../server"; + +describe("Server", () => { + it("health check returns 200", async () => { + await supertest(createServer()) + .get("/status") + .expect(200) + .then(res => { + expect(res.ok).toBe(true); + }); + }); + + it("message endpoint says hello", async () => { + await supertest(createServer()) + .get("/message/jared") + .expect(200) + .then(res => { + expect(res.body).toEqual({ message: "hello jared" }); + }); + }); +}); diff --git a/examples/express/src/index.ts b/examples/express/src/index.ts new file mode 100644 index 00000000..e0393743 --- /dev/null +++ b/examples/express/src/index.ts @@ -0,0 +1,9 @@ +import { log } from "@repo/logger"; +import { createServer } from "./server"; + +const port = process.env.PORT || 5001; +const server = createServer(); + +server.listen(port, () => { + log(`api running on ${port}`); +}); diff --git a/examples/express/src/server.ts b/examples/express/src/server.ts new file mode 100644 index 00000000..a144d2a1 --- /dev/null +++ b/examples/express/src/server.ts @@ -0,0 +1,23 @@ +import { json, urlencoded } from "body-parser"; +import express, { type Express } from "express"; +import morgan from "morgan"; +import cors from "cors"; + +/** Create express server. */ +export const createServer = (): Express => { + const app = express(); + app + .disable("x-powered-by") + .use(morgan("dev")) + .use(urlencoded({ extended: true })) + .use(json()) + .use(cors()) + .get("/message/:name", (req, res) => { + return res.json({ message: `hello ${req.params.name}` }); + }) + .get("/status", (_, res) => { + return res.json({ ok: true }); + }); + + return app; +}; diff --git a/examples/express/tsconfig.json b/examples/express/tsconfig.json new file mode 100644 index 00000000..6713bc99 --- /dev/null +++ b/examples/express/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@repo/typescript-config/base.json", + "compilerOptions": { + "lib": ["ES2015"], + "outDir": "./dist" + }, + "exclude": ["node_modules"], + "include": ["."] +} diff --git a/examples/express/tsup.config.ts b/examples/express/tsup.config.ts new file mode 100644 index 00000000..40c9e6eb --- /dev/null +++ b/examples/express/tsup.config.ts @@ -0,0 +1,8 @@ +import { defineConfig, type Options } from "tsup"; + +export default defineConfig((options: Options) => ({ + entryPoints: ["src/index.ts"], + clean: true, + format: ["cjs"], + ...options, +})); diff --git a/examples/express/turbo.json b/examples/express/turbo.json new file mode 100644 index 00000000..1ca1faa8 --- /dev/null +++ b/examples/express/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "pipeline": { + "build": { + "outputs": ["dist/**"] + } + } +} diff --git a/examples/nextjs/.eslintrc.js b/examples/nextjs/.eslintrc.js new file mode 100644 index 00000000..6582db49 --- /dev/null +++ b/examples/nextjs/.eslintrc.js @@ -0,0 +1,8 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["@repo/eslint-config/next.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/examples/nextjs/cache/config.json b/examples/nextjs/cache/config.json new file mode 100644 index 00000000..a544f0f8 --- /dev/null +++ b/examples/nextjs/cache/config.json @@ -0,0 +1,6 @@ +{ + "telemetry": { + "notifiedAt": "1715050199607", + "enabled": false + } +} \ No newline at end of file diff --git a/examples/nextjs/next-env.d.ts b/examples/nextjs/next-env.d.ts new file mode 100644 index 00000000..4f11a03d --- /dev/null +++ b/examples/nextjs/next-env.d.ts @@ -0,0 +1,5 @@ +/// +/// + +// NOTE: This file should not be edited +// see https://nextjs.org/docs/basic-features/typescript for more information. diff --git a/examples/nextjs/next.config.js b/examples/nextjs/next.config.js new file mode 100644 index 00000000..da1bb770 --- /dev/null +++ b/examples/nextjs/next.config.js @@ -0,0 +1,3 @@ +module.exports = { + reactStrictMode: true, +}; diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json new file mode 100644 index 00000000..88971c07 --- /dev/null +++ b/examples/nextjs/package.json @@ -0,0 +1,32 @@ +{ + "name": "@example/nextjs", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "next build", + "clean": "rm -rf .next", + "dev": "next dev -p 3002", + "lint": "next lint", + "typecheck": "tsc --noEmit", + "start": "next start", + "postinstall": "next telemetry disable" + }, + "dependencies": { + "@repo/logger": "workspace:*", + "@repo/shared": "workspace:*", + "next": "^14.2.3", + "nextjs-themes": "^3.1.1", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react18-loaders": "workspace:*" + }, + "devDependencies": { + "@next/eslint-plugin-next": "^14.2.3", + "@repo/eslint-config": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@types/node": "^20.12.10", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", + "typescript": "^5.4.5" + } +} diff --git a/examples/nextjs/public/favicon.ico b/examples/nextjs/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..af98450595e8b8efd9e505cddc5ed705b665a4d8 GIT binary patch literal 15086 zcmdU$XN*0PW5y#)gXL_h{3FkJ#X`oXpI?bB5#G)w~S7Qa+`W<1AB#X3C=?&UhvAO=|S+ zQpCR%R9`2h-z)7_x}fw(>6KDpfVd}*GI-!c2H9UDrKwS>=#NU@Ddj7@Q4*g7FEYrY z16}AW?v$zq+9+i!-B+T1{bG*9hmHqIUn`*-8^w`osM0?vVJi}rWb@IzKnYt#l~PpE zZq^t6O{HGFdQ!P^WzlxPHWGIHcd>D{}x={sTUg9&WW6602m zQnBH6>!yx}4jn2B7A%n2vuDesNt2{;dd zh7B@$^l0CFc@ZrPKrArsz@`@AQzbS#)CVarSbb!I8ty{PH zk}X}jv}9#v$)iV)Gb-#m>4qUO6)cT2PV3 zpI*Is$&Ww&XxZfC$&*s6RxM+zLWK&_s8J(BjQt6=fsGRsIez?@ix)2jvEROZTiUm8 zAGA}oYE|jjv7_)^<8Q|B8-jA4x_+h43HdwG`akQZ{rmR^u|IqEOoj~`7J{KpojS(< z>D#xjnZIoEL8L15HMT(z#WR80C=8eJ6m1l4LW@cu}s8OTj^Upsw@4?*W6SJES z?6iS9&)0pV`lp_$Z=3e*+h^9ZUK>rCG?5uIW|;4L`0(N0^@=YH0qjNg{kCh@PHx@0 zWueQ33l}2#^Q~LAHa;_LgYTK1p6(a3o6pAd+gv_56 zTeSG07MmF9|6)G^Q&#}`NMn_Um~~0isUI6)0h8ZU;`^Lf>f{vqND)`@P9?$9TK1fc;tCyQ6!+t!2dtUtke$_><;tw&q0@ECem?{wl!rS3|>b6OetkXT}@W?k_+rGrYh zl>Vi}m;6*0c#P>*l+@N$%>EBBFmQe{Fc#%OC9f_nmD)f~S=dohhj8vYl zv6`=x&=pVWsLX#+q8mig9W$TUxvt*}bzk7L-lNk`>Y+?Gm163T#zTyXvm=~)sb0N0 zaaweuJ6Zx`(zaEHG-%L3KK=Al6T>DZPhLQGq zy?Yqg@b-sP&7-d+WX~-}jDPy{>9TCuG9i8(A^wLgY}(XWZ-_f3WuJ2&?4j-5yH}Ph zSrTpU9$VNX@qMmWifEgC6yB+S|Ng&-_q*kY6P-PKR*oJ$D&4wui>NOkgH3F=P`Ve$ z3oFArk%&op&JP9oiCbR3eqHX}yJupw-hGKM`tJs8Gp0rz*J9ak*s!6TKY!j}B<@Qe z2xHHihfO=4d&@$equD1uh)vR!D_5jhvt}W(F>o+n#QfeP*=Ky4KYza26Uxue7xt`( zwGs1UFEoa2%CXJd6_q!V{lS9=%abQh(nAuU?8F#8U%^agA*f5vUU zO`A5Rzftd-H*XGp=j=}sgJvHomR>El^LJEU_xn@7oB=$3{5YoN^y$-PoVT`!UrwAj z(d>cRyeL=eJNUAXP0n?!TD8j9&dbY_&Ye4l$oA~n)9gP*+v9QJq3wP5KkQGLGDTj# zd};PI#*Q5uVjI0fh76HSn>LxVdoDY_;0u&tn{OaexyiTnfB*h{;fw|QLCcpf4;xpW zFkyme8_o^J(yQeMlzfjrrqcE2$dM!Fd_g$&SWBkEa^gaG!|Jt={ z=KFH#39++i(IT_Yx^(H%ko++GcKr1<|Ih~0rcI04uj!BQ`Z)V#=O2Y;=E9`s-!ShO zsSe!pFZPSf|L}>y>wkcu$o#Ju7{d8q*e4a4|Eapd)ji*PB>xlpq$2UZRgc#`wqyC< z*e8K8>Gg-|00V0nbj5maWeG|22l`3AlJ{NwJ|l|`ufMHXz7k^tYsg%g=)+?N8;M_9LtdS2KI3UcQZk+)cWFG|X4L^R?nKNgM zJp7#1#y{fx7Zcyn1ijH<*t+zGuIF{p8Z6OUCbF zJuqm{AfqFUdUSJ))2_z+s>OeFWelDY)Ji4$N2uccI^tDkzj4ezJD0s z6WNgVqu%*n4eJGq6%4dL{ { + setLoading(true); + setTimeout(() => { + setLoading(false); + }, 3000); + }, []); + return ( + + ); +} diff --git a/examples/nextjs/src/app/layout.tsx b/examples/nextjs/src/app/layout.tsx new file mode 100644 index 00000000..0dcd350b --- /dev/null +++ b/examples/nextjs/src/app/layout.tsx @@ -0,0 +1,26 @@ +import "./styles.css"; +import "react18-loaders/dist/index.css"; +import { NextJsServerTarget } from "nextjs-themes/server"; +import { ThemeSwitcher } from "nextjs-themes"; +import { Layout } from "@repo/shared/dist/server"; +import { GlobalLoader, Header } from "@repo/shared"; +import { Inter } from "next/font/google"; + +const inter = Inter({ subsets: ["latin"] }); + +/** Root layout. */ +export default function RootLayout({ children }: { children: React.ReactNode }): JSX.Element { + return ( + + + + + +
+ {children} + + + + + ); +} diff --git a/examples/nextjs/src/app/page.tsx b/examples/nextjs/src/app/page.tsx new file mode 100644 index 00000000..19c39eb4 --- /dev/null +++ b/examples/nextjs/src/app/page.tsx @@ -0,0 +1,17 @@ +import MyButton from "./button"; +import { LandingPage } from "@repo/shared/dist/server"; +import { Demo } from "@repo/shared"; + +export const metadata = { + title: "React 18 Loaders", +}; + +/** next.js landing page */ +export default function Page(): JSX.Element { + return ( + + + + + ); +} diff --git a/examples/nextjs/src/app/styles.css b/examples/nextjs/src/app/styles.css new file mode 100644 index 00000000..ce83d476 --- /dev/null +++ b/examples/nextjs/src/app/styles.css @@ -0,0 +1,13 @@ +@import "nextjs-themes/styles.css"; +@import "@repo/shared/dist/global.css"; +@import "@repo/shared/dist"; +@import "react18-loaders/dist"; + +html { + -webkit-text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: transparent; + line-height: 1.5; + tab-size: 4; +} diff --git a/examples/nextjs/tsconfig.json b/examples/nextjs/tsconfig.json new file mode 100644 index 00000000..aaddcaa8 --- /dev/null +++ b/examples/nextjs/tsconfig.json @@ -0,0 +1,13 @@ +{ + "exclude": ["node_modules"], + "extends": "@repo/typescript-config/nextjs.json", + "compilerOptions": { + "outDir": "dist", + "plugins": [ + { + "name": "next" + } + ] + }, + "include": ["src", "next.config.js", "next-env.d.ts", ".next/types/**/*.ts"] +} diff --git a/examples/nextjs/turbo.json b/examples/nextjs/turbo.json new file mode 100644 index 00000000..efbfa99f --- /dev/null +++ b/examples/nextjs/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "pipeline": { + "build": { + "outputs": [".next/**", "!.next/cache/**"] + } + } +} diff --git a/examples/remix/.eslintrc.js b/examples/remix/.eslintrc.js new file mode 100644 index 00000000..b86550f3 --- /dev/null +++ b/examples/remix/.eslintrc.js @@ -0,0 +1,8 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["@repo/eslint-config/remix.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/examples/remix/.gitignore b/examples/remix/.gitignore new file mode 100644 index 00000000..42ec5e40 --- /dev/null +++ b/examples/remix/.gitignore @@ -0,0 +1,11 @@ +node_modules + +.cache +.env +.vercel +.output + +build +public/build +api/index.js* +api/_assets* diff --git a/examples/remix/README.md b/examples/remix/README.md new file mode 100644 index 00000000..944936b3 --- /dev/null +++ b/examples/remix/README.md @@ -0,0 +1,34 @@ +# Welcome to Remix! + +- [Remix Docs](https://remix.run/docs) + +## Deployment + +After having run the `create-remix` command and selected "Vercel" as a deployment target, you only need to [import your Git repository](https://vercel.com/new) into Vercel, and it will be deployed. + +If you'd like to avoid using a Git repository, you can also deploy the directory by running [Vercel CLI](https://vercel.com/cli): + +```sh +npm i -g vercel +vercel +``` + +It is generally recommended to use a Git repository, because future commits will then automatically be deployed by Vercel, through its [Git Integration](https://vercel.com/docs/concepts/git). + +## Development + +To run your Remix app locally, make sure your project's local dependencies are installed: + +```sh +npm install +``` + +Afterwards, start the Remix development server like so: + +```sh +npm run dev +``` + +Open up [http://localhost:3000](http://localhost:3000) and you should be ready to go! + +If you're used to using the `vercel dev` command provided by [Vercel CLI](https://vercel.com/cli) instead, you can also use that, but it's not needed. diff --git a/examples/remix/app/entry.client.tsx b/examples/remix/app/entry.client.tsx new file mode 100644 index 00000000..4a0775b2 --- /dev/null +++ b/examples/remix/app/entry.client.tsx @@ -0,0 +1,23 @@ +import { RemixBrowser } from "@remix-run/react"; +import { startTransition, StrictMode } from "react"; +import { hydrateRoot } from "react-dom/client"; + +/** Hydration */ +function hydrate(): void { + startTransition(() => { + hydrateRoot( + document, + + + , + ); + }); +} + +if (typeof requestIdleCallback === "function") { + requestIdleCallback(hydrate); +} else { + // Safari doesn't support requestIdleCallback + // https://caniuse.com/requestidlecallback + setTimeout(hydrate, 1); +} diff --git a/examples/remix/app/entry.server.tsx b/examples/remix/app/entry.server.tsx new file mode 100644 index 00000000..a66506f8 --- /dev/null +++ b/examples/remix/app/entry.server.tsx @@ -0,0 +1,14 @@ +import handleRequest from "@vercel/remix-entry-server"; +import { RemixServer } from "@remix-run/react"; +import type { EntryContext } from "@remix-run/server-runtime"; + +/** Server entry */ +export default function entry( + request: Request, + responseStatusCode: number, + responseHeaders: Headers, + remixContext: EntryContext, +): Promise { + const remixServer = ; + return handleRequest(request, responseStatusCode, responseHeaders, remixServer); +} diff --git a/examples/remix/app/root.tsx b/examples/remix/app/root.tsx new file mode 100644 index 00000000..ce21f005 --- /dev/null +++ b/examples/remix/app/root.tsx @@ -0,0 +1,38 @@ +import type { MetaFunction, LinksFunction } from "@remix-run/node"; +import { Links, LiveReload, Meta, Outlet, Scripts, ScrollRestoration } from "@remix-run/react"; +import { Analytics } from "@vercel/analytics/react"; +import styles from "./styles.css"; +import { Layout } from "@repo/shared/dist/server"; + +/** Page metadata */ +export const meta: MetaFunction = () => [ + { + charset: "utf-8", + title: "Blog | Kitchen Sink", + viewport: "width=device-width,initial-scale=1", + }, +]; + +/** Add links to head */ +export const links: LinksFunction = () => [{ rel: "stylesheet", href: styles }]; + +/** Remix app root */ +export default function App(): JSX.Element { + return ( + + + + + + + + + + + + + + + + ); +} diff --git a/examples/remix/app/routes/_index.tsx b/examples/remix/app/routes/_index.tsx new file mode 100644 index 00000000..f1fc9dde --- /dev/null +++ b/examples/remix/app/routes/_index.tsx @@ -0,0 +1,11 @@ +/** Remix App */ +export default function Index(): JSX.Element { + return ( +
+

+ Blog
+ Kitchen Sink +

+
+ ); +} diff --git a/examples/remix/app/styles.css b/examples/remix/app/styles.css new file mode 100644 index 00000000..db605746 --- /dev/null +++ b/examples/remix/app/styles.css @@ -0,0 +1,67 @@ +@import "react18-themes/styles.css"; +@import "@repo/shared/dist/global.css"; +@import "@repo/shared/dist"; + +html { + font-family: + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + Segoe UI, + Roboto, + Helvetica Neue, + Arial, + sans-serif; + -webkit-text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: transparent; + line-height: 1.5; + tab-size: 4; +} + +body { + margin: 0; +} + +.container { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 1.5rem; + max-width: 100%; + margin: 0 auto; + padding: 0 16px; + text-align: center; +} + +.title { + font-size: 3rem; + font-weight: 700; + margin: 0; +} + +.title span { + display: inline-block; + background-image: linear-gradient(to right, #3b82f6, #ef4444); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +.description { + color: #9ca3af; + font-weight: 500; +} + +.description a { + color: #3b82f6; + text-decoration: none; +} + +.description a:hover { + text-decoration: underline; +} diff --git a/examples/remix/package.json b/examples/remix/package.json new file mode 100644 index 00000000..f2628c1a --- /dev/null +++ b/examples/remix/package.json @@ -0,0 +1,36 @@ +{ + "name": "@example/remix", + "version": "0.0.0", + "private": true, + "sideEffects": false, + "scripts": { + "build": "remix build", + "dev": "remix dev", + "typecheck": "tsc --noEmit", + "lint": "eslint app/" + }, + "dependencies": { + "@remix-run/node": "^2.9.1", + "@remix-run/react": "^2.9.1", + "@remix-run/serve": "^2.9.1", + "@remix-run/server-runtime": "^2.9.1", + "@vercel/analytics": "^1.2.2", + "@vercel/remix-entry-server": "^0.1.1", + "@repo/shared": "workspace:*", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react18-loaders": "workspace:*", + "react18-themes": "^3.1.0" + }, + "devDependencies": { + "@remix-run/dev": "^2.9.1", + "@repo/eslint-config": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", + "typescript": "^5.4.5" + }, + "engines": { + "node": ">=18" + } +} diff --git a/examples/remix/public/favicon.ico b/examples/remix/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..8830cf6821b354114848e6354889b8ecf6d2bc61 GIT binary patch literal 16958 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 EKbET!0{{R3 literal 0 HcmV?d00001 diff --git a/examples/remix/remix.config.js b/examples/remix/remix.config.js new file mode 100644 index 00000000..5bdbfd78 --- /dev/null +++ b/examples/remix/remix.config.js @@ -0,0 +1,9 @@ +/** @type {import('@remix-run/dev').AppConfig} */ +module.exports = { + ignoredRouteFiles: ["**/.*"], + serverModuleFormat: "cjs", + // appDirectory: "app", + // assetsBuildDirectory: "public/build", + // serverBuildPath: "build/index.js", + // publicPath: "/build/", +}; diff --git a/examples/remix/remix.env.d.ts b/examples/remix/remix.env.d.ts new file mode 100644 index 00000000..5c938f10 --- /dev/null +++ b/examples/remix/remix.env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/examples/remix/server.js b/examples/remix/server.js new file mode 100644 index 00000000..3b02013a --- /dev/null +++ b/examples/remix/server.js @@ -0,0 +1,4 @@ +import { createRequestHandler } from "@remix-run/server-runtime"; +import * as build from "@remix-run/dev/server-build"; + +export default createRequestHandler({ build, mode: process.env.NODE_ENV }); diff --git a/examples/remix/tsconfig.json b/examples/remix/tsconfig.json new file mode 100644 index 00000000..2770e9c0 --- /dev/null +++ b/examples/remix/tsconfig.json @@ -0,0 +1,18 @@ +{ + "extends": "@repo/typescript-config/remix.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist", + "paths": { + "~/*": ["./app/*"] + } + }, + "include": [ + "remix.env.d.ts", + "**/*.ts", + "**/*.tsx", + "server.js", + "remix.config.js" + ], + "exclude": ["node_modules", "build"] +} diff --git a/examples/remix/turbo.json b/examples/remix/turbo.json new file mode 100644 index 00000000..f449b510 --- /dev/null +++ b/examples/remix/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "pipeline": { + "build": { + "outputs": ["build/**", "public/build/**"] + } + } +} diff --git a/examples/vite/.eslintrc.js b/examples/vite/.eslintrc.js new file mode 100644 index 00000000..d83112c0 --- /dev/null +++ b/examples/vite/.eslintrc.js @@ -0,0 +1,8 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["@repo/eslint-config/react.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/examples/vite/index.html b/examples/vite/index.html new file mode 100644 index 00000000..ee64f39b --- /dev/null +++ b/examples/vite/index.html @@ -0,0 +1,12 @@ + + + + + + Admin | Kitchen Sink + + +
+ + + diff --git a/examples/vite/package.json b/examples/vite/package.json new file mode 100644 index 00000000..abc79f80 --- /dev/null +++ b/examples/vite/package.json @@ -0,0 +1,29 @@ +{ + "name": "@example/vite", + "version": "0.0.0", + "private": true, + "scripts": { + "build": "vite build", + "start": "vite serve", + "clean": "rm -rf dist", + "dev": "vite --host 0.0.0.0 --port 3001 --clearScreen false", + "typecheck": "tsc --noEmit", + "lint": "eslint src/" + }, + "dependencies": { + "@repo/shared": "workspace:*", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react18-loaders": "workspace:*", + "react18-themes": "^3.1.0" + }, + "devDependencies": { + "@repo/eslint-config": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.2.1", + "typescript": "^5.4.5", + "vite": "^5.2.11" + } +} diff --git a/examples/vite/public/favicon.ico b/examples/vite/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..3a3c34a2353ab2ce8839a840f162be03d1a9826d GIT binary patch literal 372526 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 sR3p#5vtdZRf19}h=DTmS$7 literal 0 HcmV?d00001 diff --git a/examples/vite/src/app/index.tsx b/examples/vite/src/app/index.tsx new file mode 100644 index 00000000..1fb247d5 --- /dev/null +++ b/examples/vite/src/app/index.tsx @@ -0,0 +1,27 @@ +import React from "react"; +import "./styles.css"; +import { Bars1, Bars2, Dots1, Dots2 } from "react18-loaders/dist/server"; +import { LoaderContainer, useLoader } from "react18-loaders"; + +/** Vite App */ +function App(): JSX.Element { + const { setLoading } = useLoader(); + return ( +
+

+ Admin
+ Kitchen Sink +

+ + + + + + + + +
+ ); +} + +export default App; diff --git a/examples/vite/src/app/styles.css b/examples/vite/src/app/styles.css new file mode 100644 index 00000000..45967eb5 --- /dev/null +++ b/examples/vite/src/app/styles.css @@ -0,0 +1,42 @@ +@import "react18-loaders/dist"; + +.container { + min-height: 100vh; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + gap: 1.5rem; + max-width: 100%; + margin: 0 auto; + padding: 0 16px; + text-align: center; +} + +.title { + font-size: 3rem; + font-weight: 700; + margin: 0; +} + +.title span { + display: inline-block; + background-image: linear-gradient(to right, #3b82f6, #ef4444); + -webkit-background-clip: text; + background-clip: text; + color: transparent; +} + +.description { + color: #9ca3af; + font-weight: 500; +} + +.description a { + color: #3b82f6; + text-decoration: none; +} + +.description a:hover { + text-decoration: underline; +} diff --git a/examples/vite/src/index.css b/examples/vite/src/index.css new file mode 100644 index 00000000..efb82277 --- /dev/null +++ b/examples/vite/src/index.css @@ -0,0 +1,22 @@ +html { + font-family: + ui-sans-serif, + system-ui, + -apple-system, + BlinkMacSystemFont, + Segoe UI, + Roboto, + Helvetica Neue, + Arial, + sans-serif; + -webkit-text-size-adjust: 100%; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + -webkit-tap-highlight-color: transparent; + line-height: 1.5; + tab-size: 4; +} + +body { + margin: 0; +} diff --git a/examples/vite/src/main.tsx b/examples/vite/src/main.tsx new file mode 100644 index 00000000..9657f6dd --- /dev/null +++ b/examples/vite/src/main.tsx @@ -0,0 +1,16 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; +import App from "./app"; +import "./index.css"; + +const el = document.getElementById("root"); +if (el) { + const root = createRoot(el); + root.render( + + + , + ); +} else { + throw new Error("Could not find root element"); +} diff --git a/examples/vite/tsconfig.json b/examples/vite/tsconfig.json new file mode 100644 index 00000000..c64bb08c --- /dev/null +++ b/examples/vite/tsconfig.json @@ -0,0 +1,9 @@ +{ + "exclude": ["node_modules"], + "extends": "@repo/typescript-config/vite.json", + "compilerOptions": { + "rootDir": ".", + "outDir": "dist" + }, + "include": ["src", "vite.config.ts"] +} diff --git a/examples/vite/turbo.json b/examples/vite/turbo.json new file mode 100644 index 00000000..1ca1faa8 --- /dev/null +++ b/examples/vite/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "pipeline": { + "build": { + "outputs": ["dist/**"] + } + } +} diff --git a/examples/vite/vite.config.ts b/examples/vite/vite.config.ts new file mode 100644 index 00000000..58676f78 --- /dev/null +++ b/examples/vite/vite.config.ts @@ -0,0 +1,6 @@ +import react from "@vitejs/plugin-react"; +import { defineConfig } from "vite"; + +export default defineConfig({ + plugins: [react()], +}); diff --git a/lib/.eslintrc.js b/lib/.eslintrc.js new file mode 100644 index 00000000..d83112c0 --- /dev/null +++ b/lib/.eslintrc.js @@ -0,0 +1,8 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["@repo/eslint-config/react.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/lib/CHANGELOG.md b/lib/CHANGELOG.md new file mode 100644 index 00000000..2b9bddde --- /dev/null +++ b/lib/CHANGELOG.md @@ -0,0 +1,49 @@ +# react18-loaders + +## 1.0.0 + +### Minor Changes + +- d80cde0: test minor + +### Patch Changes + +- 6ad42c8: test patch canary + +## 1.0.0-canary.1 + +### Minor Changes + +- d80cde0: test minor + +### Patch Changes + +- 6ad42c8: test patch canary + +## 1.0.0-canary.0 + +### Major Changes + +- b1f029b: test major + +### Minor Changes + +- d80cde0: test minor + +### Patch Changes + +- 6ad42c8: test patch canary + +## 0.0.2 + +### Patch Changes + +- 1d4dec0: debug creation of release and pushing back to the repo +- 52eb814: Test canary +- ea8e4ee: test canary release + +## 0.0.1 + +### Patch Changes + +- 0c17b4a: Fix: add z-index for loader container diff --git a/lib/README.md b/lib/README.md new file mode 100644 index 00000000..582f6c2d --- /dev/null +++ b/lib/README.md @@ -0,0 +1,112 @@ +# React18 Loaders + +[![test](https://github.com/react18-tools/turborepo-template/actions/workflows/test.yml/badge.svg)](https://github.com/react18-tools/turborepo-template/actions/workflows/test.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/aa896ec14c570f3bb274/maintainability)](https://codeclimate.com/github/react18-tools/turborepo-template/maintainability) [![codecov](https://codecov.io/gh/react18-tools/turborepo-template/graph/badge.svg)](https://codecov.io/gh/react18-tools/turborepo-template) [![Version](https://img.shields.io/npm/v/react18-loaders.svg?colorB=green)](https://www.npmjs.com/package/react18-loaders) [![Downloads](https://img.jsdelivr.com/img.shields.io/npm/d18m/react18-loaders.svg)](https://www.npmjs.com/package/react18-loaders) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/react18-loaders) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/from-referrer/) + +React18 Loaders is a comprehensive library designed to unlock the full potential of React 18 server components. It provides customizable loading animation components and a fullscreen loader container, seamlessly integrating with React and Next.js. + +✅ Fully Treeshakable (import from `react18-loaders/client/loader-container`) + +✅ Fully TypeScript Supported + +✅ Leverages the power of React 18 Server components + +✅ Compatible with all React 18 build systems/tools/frameworks + +✅ Documented with [Typedoc](https://react18-tools.github.io/turborepo-template) ([Docs](https://react18-tools.github.io/turborepo-template)) + +✅ Examples for Next.js, Vite, and Remix + +> Please consider starring [this repository](https://github.com/react18-tools/turborepo-template) and sharing it with your friends. + +## Getting Started + +### Installation + +```bash +$ pnpm add react18-loaders +``` + +**_or_** + +```bash +$ npm install react18-loaders +``` + +**_or_** + +```bash +$ yarn add react18-loaders +``` + +### Import Styles + +You can import styles globally or within specific components. + +```css +/* globals.css */ +@import "react18-loaders/dist"; +``` + +```tsx +// layout.tsx +import "react18-loaders/dist/index.css"; +``` + +For selective imports: + +```css +/* globals.css */ +@import "react18-loaders/dist/client"; /** required if you are using LoaderContainer */ +@import "react18-loaders/dist/server/bars/bars1"; +``` + +### Usage + +Using loaders is straightforward. + +```tsx +import { Bars1 } from "react18-loaders/dist/server/bars/bars1"; + +export default function MyComponent() { + return someCondition ? : <>Something else...; +} +``` + +For detailed API and options, refer to [the API documentation](https://react18-tools.github.io/turborepo-template). + +**Using LoaderContainer** + +`LoaderContainer` is a fullscreen component. You can add this component directly in your layout and then use `useLoader` hook to toggle its visibility. + +```tsx +// layout.tsx + + ... +``` + +```tsx +// some other page or component +import { useLoader } from "react18-loaders/dist/hooks"; + +export default MyComponent() { + const { setLoading } = useLoader(); + useCallback(()=>{ + setLoading(true); + ...do some work + setLoading(false); + }, []) + ... +} +``` + +## License + +This library is licensed under the MPL-2.0 open-source license. + +> This package also serves as an example demonstrating how to build and publish a `React.js` library compatible with React Server Components. + +> Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work. + +
+ +

with 💖 by Mayank Kumar Chaudhari

diff --git a/lib/package.json b/lib/package.json new file mode 100644 index 00000000..10734cc7 --- /dev/null +++ b/lib/package.json @@ -0,0 +1,89 @@ +{ + "name": "react18-loaders", + "author": "Mayank Kumar Chaudhari ", + "private": false, + "version": "1.0.0", + "description": "A comprehensive library that unleashes the full potential of React 18 server components, providing customizable loading animation components alongside a fullscreen loader container. Designed to seamlessly integrate with React and Next.js.", + "license": "MPL-2.0", + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "repository": "github:react18-tools/turborepo-template", + "bugs": "https://github.com/react18-tools/turborepo-template/issues", + "homepage": "https://turborepo-template-three.vercel.app/", + "sideEffects": false, + "files": [ + "dist/**" + ], + "scripts": { + "build": "tsup && tsc -p tsconfig-build.json", + "clean": "rm -rf dist", + "dev": "tsup --watch && tsc -p tsconfig-build.json -w", + "typecheck": "tsc --noEmit", + "lint": "eslint src/", + "test": "vitest run --coverage" + }, + "devDependencies": { + "@repo/eslint-config": "workspace:*", + "@repo/jest-presets": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@testing-library/react": "^15.0.7", + "@types/node": "^20.12.10", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.2.1", + "@vitest/coverage-v8": "^1.6.0", + "esbuild-plugin-react18": "^0.1.5", + "esbuild-plugin-react18-css": "^0.0.4", + "jsdom": "^24.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tsup": "^8.0.2", + "typescript": "^5.4.5", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^1.6.0" + }, + "dependencies": { + "r18gs": "^1.0.2" + }, + "peerDependencies": { + "@types/react": "16.8 - 19", + "next": "10 - 14", + "react": "16.8 - 19" + }, + "peerDependenciesMeta": { + "next": { + "optional": true + } + }, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mayank1513" + }, + { + "type": "individual", + "url": "https://pages.razorpay.com/mayank1513" + } + ], + "keywords": [ + "Loading animations", + "Fullscreen loader", + "React", + "React Loaders", + "React 18", + "React 19", + "Next.js", + "Next.js 14", + "React server components", + "Customizable", + "Cutting-edge", + "Compatibility", + "Frontend development", + "UI components", + "Web development", + "Progressive", + "Modern", + "Seamless integration" + ] +} diff --git a/lib/src/client/index.ts b/lib/src/client/index.ts new file mode 100644 index 00000000..e7e26776 --- /dev/null +++ b/lib/src/client/index.ts @@ -0,0 +1,10 @@ +"use client"; + +/** + * Server components and client components need to be exported from separate files as + * directive on top of the file from which component is imported takes effect. + * i.e., server component re-exported from file with "use client" will behave as client component + * */ + +// client component exports +export * from "./loader-container"; diff --git a/lib/src/client/loader-container/index.ts b/lib/src/client/loader-container/index.ts new file mode 100644 index 00000000..f262bb1d --- /dev/null +++ b/lib/src/client/loader-container/index.ts @@ -0,0 +1,3 @@ +"use client"; + +export * from "./loader-container"; diff --git a/lib/src/client/loader-container/loader-container.module.scss b/lib/src/client/loader-container/loader-container.module.scss new file mode 100644 index 00000000..3a6dc2dd --- /dev/null +++ b/lib/src/client/loader-container/loader-container.module.scss @@ -0,0 +1,13 @@ +.container { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + display: flex; + align-items: center; + justify-content: center; + backdrop-filter: blur(3px); + background: #87ceeb85; + z-index: 1000; +} diff --git a/lib/src/client/loader-container/loader-container.test.tsx b/lib/src/client/loader-container/loader-container.test.tsx new file mode 100644 index 00000000..273f42a0 --- /dev/null +++ b/lib/src/client/loader-container/loader-container.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { LoaderContainer } from "./loader-container"; + +describe.concurrent("loader-container", () => { + afterEach(cleanup); + + test("check if renders without erros", () => { + render(); + }); +}); diff --git a/lib/src/client/loader-container/loader-container.tsx b/lib/src/client/loader-container/loader-container.tsx new file mode 100644 index 00000000..9e146548 --- /dev/null +++ b/lib/src/client/loader-container/loader-container.tsx @@ -0,0 +1,16 @@ +import styles from "./loader-container.module.scss"; +import useRGS from "r18gs"; +import { LOADER_RGS_KEY } from "../../constants"; + +interface LoaderContainerProps extends React.HTMLProps { + children?: React.ReactNode; +} + +/** + * # LoaderContainer + * A full screen container for the loading animation. + */ +export function LoaderContainer({ children }: LoaderContainerProps) { + const [loading] = useRGS(LOADER_RGS_KEY, false); + return loading ?
{children}
: null; +} diff --git a/lib/src/constants.ts b/lib/src/constants.ts new file mode 100644 index 00000000..6a07b259 --- /dev/null +++ b/lib/src/constants.ts @@ -0,0 +1,3 @@ +/** generate uuid to avoid conflicting keys */ +const uuid = () => (Date.now() * Math.random()).toString(16).slice(2, 8); +export const LOADER_RGS_KEY = `loader-${uuid()}`; diff --git a/lib/src/declaration.d.ts b/lib/src/declaration.d.ts new file mode 100644 index 00000000..e6c7b7b2 --- /dev/null +++ b/lib/src/declaration.d.ts @@ -0,0 +1,2 @@ +declare module "*.module.css"; +declare module "*.module.scss"; diff --git a/lib/src/hooks/index.ts b/lib/src/hooks/index.ts new file mode 100644 index 00000000..5e7fac64 --- /dev/null +++ b/lib/src/hooks/index.ts @@ -0,0 +1 @@ +export * from "./use-loader"; diff --git a/lib/src/hooks/use-loader.test.tsx b/lib/src/hooks/use-loader.test.tsx new file mode 100644 index 00000000..304d696b --- /dev/null +++ b/lib/src/hooks/use-loader.test.tsx @@ -0,0 +1,16 @@ +import { cleanup, render, renderHook, act } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { LoaderContainer } from "../client"; +import { useLoader } from "./use-loader"; + +describe.concurrent("loader-container", () => { + afterEach(cleanup); + + test("Test hook", ({ expect }) => { + const { result } = renderHook(() => useLoader()); + const { container } = render(); + expect(container.childElementCount).toBe(0); + act(() => result.current.setLoading(true)); + expect(container.childElementCount).toBe(1); + }); +}); diff --git a/lib/src/hooks/use-loader.ts b/lib/src/hooks/use-loader.ts new file mode 100644 index 00000000..c14e7a70 --- /dev/null +++ b/lib/src/hooks/use-loader.ts @@ -0,0 +1,11 @@ +import useRGS from "r18gs"; +import { LOADER_RGS_KEY } from "../constants"; + +/** + * + * @returns + */ +export function useLoader() { + const [loading, setLoading] = useRGS(LOADER_RGS_KEY); + return { loading, setLoading }; +} diff --git a/lib/src/index.ts b/lib/src/index.ts new file mode 100644 index 00000000..db127bb1 --- /dev/null +++ b/lib/src/index.ts @@ -0,0 +1,9 @@ +"use client"; +/** + * Don't export client side components from here. + * + * Hooks are okay to export from here as they do not require "use client" directive. + */ + +export * from "./client"; +export * from "./hooks"; diff --git a/lib/src/server/bars/bars1/bars1.module.scss b/lib/src/server/bars/bars1/bars1.module.scss new file mode 100644 index 00000000..9e896efb --- /dev/null +++ b/lib/src/server/bars/bars1/bars1.module.scss @@ -0,0 +1,28 @@ +/* HTML:
*/ +.loader { + width: 45px; + aspect-ratio: 1; + --c: #000; + --b: no-repeat repeating-linear-gradient(90deg, var(--c) 0 calc(100% / 7), #0000 0 calc(200% / 7)); + background: var(--b), var(--b), var(--b), var(--b); + background-size: 140% 26%; + animation: l27 0.75s infinite linear; +} +@keyframes l27 { + 0%, + 20% { + background-position: + 0 calc(0 * 100% / 3), + 100% calc(1 * 100% / 3), + 0 calc(2 * 100% / 3), + 100% calc(3 * 100% / 3); + } + 80%, + 100% { + background-position: + 100% calc(0 * 100% / 3), + 0 calc(1 * 100% / 3), + 100% calc(2 * 100% / 3), + 0 calc(3 * 100% / 3); + } +} diff --git a/lib/src/server/bars/bars1/bars1.test.tsx b/lib/src/server/bars/bars1/bars1.test.tsx new file mode 100644 index 00000000..a840b77d --- /dev/null +++ b/lib/src/server/bars/bars1/bars1.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Bars1 } from "./bars1"; + +describe.concurrent("bars1", () => { + afterEach(cleanup); + + test("check if renders without errors", () => { + render(); + }); +}); diff --git a/lib/src/server/bars/bars1/bars1.tsx b/lib/src/server/bars/bars1/bars1.tsx new file mode 100644 index 00000000..f4ffd57b --- /dev/null +++ b/lib/src/server/bars/bars1/bars1.tsx @@ -0,0 +1,14 @@ +import styles from "./bars1.module.scss"; +import { Base, BaseProps } from "../../common"; + +/** + * A simple loader with 3 dots. + * + * @example + * + * + * @source + */ +export function Bars1(props: BaseProps) { + return ; +} diff --git a/lib/src/server/bars/bars1/index.ts b/lib/src/server/bars/bars1/index.ts new file mode 100644 index 00000000..451cb05b --- /dev/null +++ b/lib/src/server/bars/bars1/index.ts @@ -0,0 +1 @@ +export * from "./bars1"; diff --git a/lib/src/server/bars/bars2/bars2.module.scss b/lib/src/server/bars/bars2/bars2.module.scss new file mode 100644 index 00000000..dc655553 --- /dev/null +++ b/lib/src/server/bars/bars2/bars2.module.scss @@ -0,0 +1,45 @@ +/* HTML:
*/ +.loader { + width: 45px; + aspect-ratio: 1; + --c: #000; + --b: no-repeat linear-gradient(var(--c) 0 0); + background: + var(--b) 0% 50%, + var(--b) 50% 50%, + var(--b) 100% 50%; + background-size: 20% 100%; + animation: l1 1s infinite linear; +} +@keyframes l1 { + 0% { + background-size: + 20% 100%, + 20% 100%, + 20% 100%; + } + 33% { + background-size: + 20% 10%, + 20% 100%, + 20% 100%; + } + 50% { + background-size: + 20% 100%, + 20% 10%, + 20% 100%; + } + 66% { + background-size: + 20% 100%, + 20% 100%, + 20% 10%; + } + 100% { + background-size: + 20% 100%, + 20% 100%, + 20% 100%; + } +} diff --git a/lib/src/server/bars/bars2/bars2.test.tsx b/lib/src/server/bars/bars2/bars2.test.tsx new file mode 100644 index 00000000..8372373c --- /dev/null +++ b/lib/src/server/bars/bars2/bars2.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Bars2 } from "./bars2"; + +describe.concurrent("bars2", () => { + afterEach(cleanup); + + test("check if renders without errors", () => { + render(); + }); +}); diff --git a/lib/src/server/bars/bars2/bars2.tsx b/lib/src/server/bars/bars2/bars2.tsx new file mode 100644 index 00000000..775640ee --- /dev/null +++ b/lib/src/server/bars/bars2/bars2.tsx @@ -0,0 +1,14 @@ +import styles from "./bars2.module.scss"; +import { Base, BaseProps } from "../../common"; + +/** + * A simple loader with 3 dots. + * + * @example + * + * + * @source + */ +export function Bars2(props: BaseProps) { + return ; +} diff --git a/lib/src/server/bars/bars2/index.ts b/lib/src/server/bars/bars2/index.ts new file mode 100644 index 00000000..9781c2d9 --- /dev/null +++ b/lib/src/server/bars/bars2/index.ts @@ -0,0 +1 @@ +export * from "./bars2"; diff --git a/lib/src/server/bars/index.ts b/lib/src/server/bars/index.ts new file mode 100644 index 00000000..71c72f95 --- /dev/null +++ b/lib/src/server/bars/index.ts @@ -0,0 +1,4 @@ +// bars component exports + +export * from "./bars1"; +export * from "./bars2"; diff --git a/lib/src/server/common/base/base.test.tsx b/lib/src/server/common/base/base.test.tsx new file mode 100644 index 00000000..a39e7763 --- /dev/null +++ b/lib/src/server/common/base/base.test.tsx @@ -0,0 +1,12 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Base } from "./base"; + +describe.concurrent("base", () => { + afterEach(cleanup); + + test("check if h1 heading exists", ({ expect }) => { + const { container } = render(); + expect(container.children[0].classList).toContain("my-clx"); + }); +}); diff --git a/lib/src/server/common/base/base.tsx b/lib/src/server/common/base/base.tsx new file mode 100644 index 00000000..bf276433 --- /dev/null +++ b/lib/src/server/common/base/base.tsx @@ -0,0 +1,38 @@ +import { HTMLProps } from "react"; + +/** Interface declaring the common properties of the loaders */ +export interface BaseProps extends HTMLProps { + /** width of the loader element in pixels or a string with a length unit. */ + width?: number | string; + /** height of the loader element in pixels or a string with a length unit. */ + height?: number | string; + /** Color of the dots - CSS compatible color */ + color?: string; +} + +/** Other props - loaderClass is included here as we will extend BaseProps for other loaders */ +interface OtherProps { + /** Loader class name */ + loaderClass: string; + dotRadius?: number | string; +} + +/** + * Base component to avoid code duplication + * + * default values should be specified in css files - so no need to set them in JSX + */ +export function Base({ + width, + height, + color, + loaderClass, + dotRadius, + ...props +}: BaseProps & OtherProps) { + const style = { ...props.style, width, height, "--c": color }; + // @ts-expect-error -- it is intensional + if (dotRadius) style["--r"] = dotRadius; + const className = [props.className, loaderClass].filter(Boolean).join(" "); + return
; +} diff --git a/lib/src/server/common/base/index.ts b/lib/src/server/common/base/index.ts new file mode 100644 index 00000000..955fdd14 --- /dev/null +++ b/lib/src/server/common/base/index.ts @@ -0,0 +1 @@ +export * from "./base"; diff --git a/lib/src/server/common/index.ts b/lib/src/server/common/index.ts new file mode 100644 index 00000000..40b78e78 --- /dev/null +++ b/lib/src/server/common/index.ts @@ -0,0 +1,3 @@ +// common component exports + +export * from "./base"; diff --git a/lib/src/server/dots/dots1/dots1.module.scss b/lib/src/server/dots/dots1/dots1.module.scss new file mode 100644 index 00000000..c84414f9 --- /dev/null +++ b/lib/src/server/dots/dots1/dots1.module.scss @@ -0,0 +1,16 @@ +/* HTML:
*/ +.loader { + --c: #000; + width: 60px; + aspect-ratio: 4; + background: radial-gradient(circle closest-side, var(--c) 90%, #0000) 0 / calc(100% / 3) 100% + space; + clip-path: inset(0 100% 0 0); + animation: anim 1s steps(4) infinite; +} + +@keyframes anim { + to { + clip-path: inset(0 -34% 0 0); + } +} diff --git a/lib/src/server/dots/dots1/dots1.test.tsx b/lib/src/server/dots/dots1/dots1.test.tsx new file mode 100644 index 00000000..91aae611 --- /dev/null +++ b/lib/src/server/dots/dots1/dots1.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Dots1 } from "./dots1"; + +describe.concurrent("dots1", () => { + afterEach(cleanup); + + test("check if renders without erros", () => { + render(); + }); +}); diff --git a/lib/src/server/dots/dots1/dots1.tsx b/lib/src/server/dots/dots1/dots1.tsx new file mode 100644 index 00000000..ed048956 --- /dev/null +++ b/lib/src/server/dots/dots1/dots1.tsx @@ -0,0 +1,14 @@ +import styles from "./dots1.module.scss"; +import { Base, BaseProps } from "../../common"; + +/** + * A simple loader with 3 dots. + * + * @example + * + * + * @source + */ +export function Dots1(props: BaseProps) { + return ; +} diff --git a/lib/src/server/dots/dots1/index.ts b/lib/src/server/dots/dots1/index.ts new file mode 100644 index 00000000..277e40de --- /dev/null +++ b/lib/src/server/dots/dots1/index.ts @@ -0,0 +1 @@ +export * from "./dots1"; diff --git a/lib/src/server/dots/dots2/dots2.module.scss b/lib/src/server/dots/dots2/dots2.module.scss new file mode 100644 index 00000000..8933d160 --- /dev/null +++ b/lib/src/server/dots/dots2/dots2.module.scss @@ -0,0 +1,37 @@ +/* HTML:
*/ +.loader { + width: 32px; + aspect-ratio: 1; + --c: #000; + --dot-radius: 20%; + --_g: no-repeat radial-gradient(farthest-side, var(--c) 90%, #0000); + background: var(--_g), var(--_g), var(--_g), var(--_g); + background-size: calc(2 * var(--dot-radius)) calc(2 * var(--dot-radius)); + animation: anim 1s infinite; +} + +@keyframes anim { + 0% { + background-position: + 0 0, + 100% 0, + 100% 100%, + 0 100%; + } + 40%, + 50% { + background-position: + 100% 100%, + 100% 0, + 0 0, + 0 100%; + } + 90%, + 100% { + background-position: + 100% 100%, + 0 100%, + 0 0, + 100% 0; + } +} diff --git a/lib/src/server/dots/dots2/dots2.test.tsx b/lib/src/server/dots/dots2/dots2.test.tsx new file mode 100644 index 00000000..87f0284e --- /dev/null +++ b/lib/src/server/dots/dots2/dots2.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Dots2 } from "./dots2"; + +describe.concurrent("dots2", () => { + afterEach(cleanup); + + test("check if renders without errors", () => { + render(); + }); +}); diff --git a/lib/src/server/dots/dots2/dots2.tsx b/lib/src/server/dots/dots2/dots2.tsx new file mode 100644 index 00000000..d911fa2b --- /dev/null +++ b/lib/src/server/dots/dots2/dots2.tsx @@ -0,0 +1,19 @@ +import styles from "./dots2.module.scss"; +import { Base, BaseProps } from "../../common"; + +interface Dots2Props extends BaseProps { + /** Radius of the dots in pixels or a string with a length unit. */ + dotRadius?: number | string; +} + +/** + * A simple loader with 3 dots. + * + * @example + * + * + * @source + */ +export function Dots2(props: Dots2Props) { + return ; +} diff --git a/lib/src/server/dots/dots2/index.ts b/lib/src/server/dots/dots2/index.ts new file mode 100644 index 00000000..e7f74741 --- /dev/null +++ b/lib/src/server/dots/dots2/index.ts @@ -0,0 +1 @@ +export * from "./dots2"; diff --git a/lib/src/server/dots/index.ts b/lib/src/server/dots/index.ts new file mode 100644 index 00000000..b7857aaa --- /dev/null +++ b/lib/src/server/dots/index.ts @@ -0,0 +1,4 @@ +// dots component exports + +export * from "./dots1"; +export * from "./dots2"; diff --git a/lib/src/server/index.ts b/lib/src/server/index.ts new file mode 100644 index 00000000..58b74bca --- /dev/null +++ b/lib/src/server/index.ts @@ -0,0 +1,9 @@ +/** + * need to export server components and client components from separate files as + * directive on top of the file from which component is imported takes effect. + * i.e., server component re-exported from file with "use client" will behave as client component + * */ + +// server component exports +export * from "./dots"; +export * from "./bars"; diff --git a/lib/tsconfig-build.json b/lib/tsconfig-build.json new file mode 100644 index 00000000..66cc4082 --- /dev/null +++ b/lib/tsconfig-build.json @@ -0,0 +1,12 @@ +{ + // using tsc for type declarations as "Note that declaration files generated by any tool other than tsc are not guaranteed to be error-free, so it's a good idea to test the output with tsc" - https://tsup.egoist.dev/#generate-declaration-file + "extends": "@repo/typescript-config/react-library.json", + "compilerOptions": { + "outDir": "dist", + "noEmit": false, + "emitDeclarationOnly": true, + "declarationMap": false + }, + "include": ["src"], + "exclude": ["dist", "node_modules", "**/*.test.*", "**/*.spec.*"] +} diff --git a/lib/tsconfig.json b/lib/tsconfig.json new file mode 100644 index 00000000..9430b2f8 --- /dev/null +++ b/lib/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@repo/typescript-config/react-library.json", + "compilerOptions": { + "lib": ["dom", "ES2015"], + "types": ["vitest", "node"] + }, + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} diff --git a/lib/tsup.config.ts b/lib/tsup.config.ts new file mode 100644 index 00000000..c09a8bc1 --- /dev/null +++ b/lib/tsup.config.ts @@ -0,0 +1,18 @@ +import { defineConfig, type Options } from "tsup"; +import react18Plugin from "esbuild-plugin-react18"; +import cssPlugin from "esbuild-plugin-react18-css"; + +export default defineConfig( + (options: Options) => + ({ + format: ["cjs", "esm"], + target: "es2019", + entry: ["./src"], + sourcemap: false, + clean: !options.watch, + bundle: true, + minify: !options.watch, + esbuildPlugins: [react18Plugin(), cssPlugin({ generateScopedName: "[folder]__[local]" })], + ...options, + }) as Options, +); diff --git a/lib/turbo.json b/lib/turbo.json new file mode 100644 index 00000000..1ca1faa8 --- /dev/null +++ b/lib/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "pipeline": { + "build": { + "outputs": ["dist/**"] + } + } +} diff --git a/lib/typedoc.config.js b/lib/typedoc.config.js new file mode 100644 index 00000000..5662460b --- /dev/null +++ b/lib/typedoc.config.js @@ -0,0 +1,20 @@ +/** @type {import('typedoc').TypeDocOptions} */ +module.exports = { + name: "React18 Loaders", + entryPoints: ["./src"], + entryPointStrategy: "Expand", + exclude: ["**/*.test.tsx", "**/index.ts"], + out: "../docs", + commentStyle: "all", + searchInComments: true, + includeVersion: true, + excludeExternals: true, + plugin: [ + "typedoc-plugin-mdn-links", + "typedoc-plugin-rename-defaults", + "typedoc-plugin-missing-exports", + "typedoc-plugin-zod", + "typedoc-plugin-inline-sources", + // "typedoc-plugin-extras", + ], +}; diff --git a/lib/vitest.config.ts b/lib/vitest.config.ts new file mode 100644 index 00000000..18196779 --- /dev/null +++ b/lib/vitest.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "vitest/config"; +import react from "@vitejs/plugin-react"; +import tsconfigPaths from "vite-tsconfig-paths"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), tsconfigPaths()], + test: { + environment: "jsdom", + globals: true, + setupFiles: [], + coverage: { + include: ["src/**"], + exclude: ["src/**/index.ts", "src/**/declaration.d.ts"], + reporter: ["text", "json", "clover", "html"], + }, + }, +}); diff --git a/package.json b/package.json new file mode 100644 index 00000000..56aeabcc --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "private": true, + "scripts": { + "build": "turbo build", + "clean": "turbo clean", + "dev": "turbo dev", + "doc": "node scripts/doc.js && typedoc", + "format": "prettier --write \"**/*.{ts,tsx,md,css,scss}\"", + "lint": "turbo lint", + "test": "turbo test", + "typecheck": "turbo typecheck", + "postinstall": "node scripts/rebrand.js" + }, + "devDependencies": { + "@changesets/cli": "^2.27.1", + "@repo/typescript-config": "workspace:*", + "plop": "^4.0.1", + "prettier": "^3.2.5", + "turbo": "^1.13.3", + "typedoc": "^0.25.13", + "typedoc-plugin-extras": "^3.0.0", + "typedoc-plugin-inline-sources": "^1.0.2", + "typedoc-plugin-mdn-links": "^3.1.24", + "typedoc-plugin-missing-exports": "^2.2.0", + "typedoc-plugin-rename-defaults": "^0.7.0", + "typedoc-plugin-zod": "^1.1.2" + }, + "packageManager": "pnpm@9.0.5", + "engines": { + "node": ">=18" + }, + "dependencies": { + "@types/node": "^20.12.10" + } +} diff --git a/packages/config-eslint/README.md b/packages/config-eslint/README.md new file mode 100644 index 00000000..8b42d901 --- /dev/null +++ b/packages/config-eslint/README.md @@ -0,0 +1,3 @@ +# `@turbo/eslint-config` + +Collection of internal eslint configurations. diff --git a/packages/config-eslint/index.js b/packages/config-eslint/index.js new file mode 100644 index 00000000..c667cd10 --- /dev/null +++ b/packages/config-eslint/index.js @@ -0,0 +1,34 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["eslint:recommended", "prettier", "eslint-config-turbo"], + plugins: ["only-warn"], + globals: { + React: true, + JSX: true, + }, + env: { + node: true, + }, + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [ + // Ignore dotfiles + ".*.js", + "node_modules/", + "dist/", + ], + overrides: [ + { + files: ["*.js?(x)", "*.ts?(x)"], + }, + ], +}; diff --git a/packages/config-eslint/next.js b/packages/config-eslint/next.js new file mode 100644 index 00000000..e2ca3886 --- /dev/null +++ b/packages/config-eslint/next.js @@ -0,0 +1,43 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/* + * This is a custom ESLint configuration for use with + * Next.js apps. + * + * This config extends the Vercel Engineering Style Guide. + * For more information, see https://github.com/vercel/style-guide + * + */ + +module.exports = { + extends: [ + "@vercel/style-guide/eslint/node", + "@vercel/style-guide/eslint/typescript", + "@vercel/style-guide/eslint/browser", + "@vercel/style-guide/eslint/react", + "@vercel/style-guide/eslint/next", + "eslint-config-turbo", + ].map(require.resolve), + parserOptions: { + project, + }, + globals: { + React: true, + JSX: true, + }, + plugins: ["only-warn"], + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: [".*.js", "node_modules/", "dist/"], + // add rules configurations here + rules: { + "import/no-default-export": "off", + }, +}; diff --git a/packages/config-eslint/package.json b/packages/config-eslint/package.json new file mode 100644 index 00000000..65eaef13 --- /dev/null +++ b/packages/config-eslint/package.json @@ -0,0 +1,13 @@ +{ + "name": "@repo/eslint-config", + "license": "MIT", + "version": "0.0.0", + "private": true, + "devDependencies": { + "@vercel/style-guide": "^6.0.0", + "eslint-config-turbo": "^1.13.3", + "eslint-plugin-mdx": "^3.1.5", + "eslint-plugin-only-warn": "^1.1.0", + "eslint-plugin-storybook": "^0.8.0" + } +} diff --git a/packages/config-eslint/react.js b/packages/config-eslint/react.js new file mode 100644 index 00000000..16f46ee9 --- /dev/null +++ b/packages/config-eslint/react.js @@ -0,0 +1,39 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/* + * This is a custom ESLint configuration for use a library + * that utilizes React. + * + * This config extends the Vercel Engineering Style Guide. + * For more information, see https://github.com/vercel/style-guide + * + */ + +module.exports = { + extends: [ + "@vercel/style-guide/eslint/browser", + "@vercel/style-guide/eslint/typescript", + "@vercel/style-guide/eslint/react", + ].map(require.resolve), + parserOptions: { + project, + }, + globals: { + JSX: true, + }, + plugins: ["only-warn"], + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: ["node_modules/", "dist/", ".eslintrc.js", "**/*.css"], + // add rules configurations here + rules: { + "import/no-default-export": "off", + }, +}; diff --git a/packages/config-eslint/remix.js b/packages/config-eslint/remix.js new file mode 100644 index 00000000..bd351154 --- /dev/null +++ b/packages/config-eslint/remix.js @@ -0,0 +1,43 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/* + * This is a custom ESLint configuration for use a library + * that utilizes React. + * + * This config extends the Vercel Engineering Style Guide. + * For more information, see https://github.com/vercel/style-guide + * + */ + +module.exports = { + extends: [ + "@vercel/style-guide/eslint/browser", + "@vercel/style-guide/eslint/typescript", + "@vercel/style-guide/eslint/react", + ].map(require.resolve), + parserOptions: { + project, + }, + env: { + browser: true, + node: true, + }, + plugins: ["only-warn"], + globals: { + JSX: true, + }, + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + ignorePatterns: ["node_modules/", "dist/", ".eslintrc.js", "**/*.css"], + // add rules configurations here + rules: { + "import/no-default-export": "off", + }, +}; diff --git a/packages/config-eslint/server.js b/packages/config-eslint/server.js new file mode 100644 index 00000000..f84343f2 --- /dev/null +++ b/packages/config-eslint/server.js @@ -0,0 +1,46 @@ +const { resolve } = require("node:path"); + +const project = resolve(process.cwd(), "tsconfig.json"); + +/* + * This is a custom ESLint configuration for use server side + * typescript packages. + * + * This config extends the Vercel Engineering Style Guide. + * For more information, see https://github.com/vercel/style-guide + * + */ + +module.exports = { + extends: ["@vercel/style-guide/eslint/node", "@vercel/style-guide/eslint/typescript"].map( + require.resolve, + ), + parserOptions: { + project, + }, + env: { + node: true, + es6: true, + }, + plugins: ["only-warn"], + settings: { + "import/resolver": { + typescript: { + project, + }, + }, + }, + overrides: [ + { + files: ["**/__tests__/**/*"], + env: { + jest: true, + }, + }, + ], + ignorePatterns: [".*.js", "node_modules/", "dist/"], + // add rules configurations here + rules: { + "import/no-default-export": "off", + }, +}; diff --git a/packages/config-typescript/base.json b/packages/config-typescript/base.json new file mode 100644 index 00000000..56d01edd --- /dev/null +++ b/packages/config-typescript/base.json @@ -0,0 +1,24 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Default", + "compilerOptions": { + "composite": false, + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "allowImportingTsExtensions": true, + "inlineSources": false, + "isolatedModules": true, + "module": "ESNext", + "moduleResolution": "Bundler", + "noUnusedLocals": false, + "noUnusedParameters": false, + "preserveWatchOutput": true, + "skipLibCheck": true, + "strict": true, + "noEmit": true, + "strictNullChecks": true + }, + "exclude": ["node_modules"] +} diff --git a/packages/config-typescript/nextjs.json b/packages/config-typescript/nextjs.json new file mode 100644 index 00000000..b6ef83f8 --- /dev/null +++ b/packages/config-typescript/nextjs.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Next.js", + "extends": "./base.json", + "compilerOptions": { + "plugins": [{ "name": "next" }], + "allowJs": true, + "declaration": false, + "declarationMap": false, + "incremental": true, + "jsx": "preserve", + "lib": ["dom", "dom.iterable", "esnext"], + "module": "esnext", + "noEmit": true, + "resolveJsonModule": true, + "target": "es5" + } +} diff --git a/packages/config-typescript/package.json b/packages/config-typescript/package.json new file mode 100644 index 00000000..27c0e604 --- /dev/null +++ b/packages/config-typescript/package.json @@ -0,0 +1,9 @@ +{ + "name": "@repo/typescript-config", + "version": "0.0.0", + "private": true, + "license": "MIT", + "publishConfig": { + "access": "public" + } +} diff --git a/packages/config-typescript/react-app.json b/packages/config-typescript/react-app.json new file mode 100644 index 00000000..6af13474 --- /dev/null +++ b/packages/config-typescript/react-app.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Next.js", + "extends": "./base.json", + "compilerOptions": { + "allowJs": true, + "declaration": false, + "declarationMap": false, + "incremental": true, + "jsx": "preserve", + "lib": ["dom", "dom.iterable", "esnext"], + "module": "esnext", + "noEmit": true, + "resolveJsonModule": true, + "target": "es5" + } +} diff --git a/packages/config-typescript/react-library.json b/packages/config-typescript/react-library.json new file mode 100644 index 00000000..819df5ae --- /dev/null +++ b/packages/config-typescript/react-library.json @@ -0,0 +1,12 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "React Library", + "extends": "./base.json", + "compilerOptions": { + "lib": ["ES2015"], + "module": "ESNext", + "target": "ES6", + "jsx": "react-jsx", + "noEmit": true + } +} diff --git a/packages/config-typescript/remix.json b/packages/config-typescript/remix.json new file mode 100644 index 00000000..a4b843ea --- /dev/null +++ b/packages/config-typescript/remix.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "display": "Remix", + "extends": "./base.json", + "compilerOptions": { + "lib": ["DOM", "DOM.Iterable", "ES2019"], + "isolatedModules": true, + "esModuleInterop": true, + "jsx": "react-jsx", + "moduleResolution": "Bundler", + "resolveJsonModule": true, + "target": "ES2019", + "strict": true, + "allowJs": true, + "forceConsistentCasingInFileNames": true, + "baseUrl": "." + } +} diff --git a/packages/config-typescript/vite.json b/packages/config-typescript/vite.json new file mode 100644 index 00000000..46c2e55b --- /dev/null +++ b/packages/config-typescript/vite.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "./base.json", + "Display": "Vite", + "compilerOptions": { + "allowJs": false, + "esModuleInterop": false, + "jsx": "react", + "lib": ["dom", "dom.iterable", "esnext"], + "module": "ESNext", + "noEmit": true, + "resolveJsonModule": true, + "skipLibCheck": false, + "target": "ESNext", + "types": ["vite/client"] + } +} diff --git a/packages/jest-presets/browser/jest-preset.js b/packages/jest-presets/browser/jest-preset.js new file mode 100644 index 00000000..3173ffd6 --- /dev/null +++ b/packages/jest-presets/browser/jest-preset.js @@ -0,0 +1,14 @@ +module.exports = { + roots: [""], + testEnvironment: "jsdom", + transform: { + "^.+\\.tsx?$": "ts-jest", + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], + modulePathIgnorePatterns: [ + "/test/__fixtures__", + "/node_modules", + "/dist", + ], + preset: "ts-jest", +}; diff --git a/packages/jest-presets/node/jest-preset.js b/packages/jest-presets/node/jest-preset.js new file mode 100644 index 00000000..b6c25930 --- /dev/null +++ b/packages/jest-presets/node/jest-preset.js @@ -0,0 +1,13 @@ +module.exports = { + roots: [""], + transform: { + "^.+\\.tsx?$": "ts-jest", + }, + moduleFileExtensions: ["ts", "tsx", "js", "jsx", "json", "node"], + modulePathIgnorePatterns: [ + "/test/__fixtures__", + "/node_modules", + "/dist", + ], + preset: "ts-jest", +}; diff --git a/packages/jest-presets/package.json b/packages/jest-presets/package.json new file mode 100644 index 00000000..3086e410 --- /dev/null +++ b/packages/jest-presets/package.json @@ -0,0 +1,16 @@ +{ + "name": "@repo/jest-presets", + "version": "0.0.0", + "private": true, + "license": "MIT", + "files": [ + "browser/jest-preset.js", + "node/jest-preset.js" + ], + "dependencies": { + "ts-jest": "^29.1.2" + }, + "devDependencies": { + "jest-environment-jsdom": "^29.7.0" + } +} \ No newline at end of file diff --git a/packages/logger/.eslintrc.js b/packages/logger/.eslintrc.js new file mode 100644 index 00000000..49f67f37 --- /dev/null +++ b/packages/logger/.eslintrc.js @@ -0,0 +1,11 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["@repo/eslint-config/index.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, + env: { + jest: true, + }, +}; diff --git a/packages/logger/package.json b/packages/logger/package.json new file mode 100644 index 00000000..64771b42 --- /dev/null +++ b/packages/logger/package.json @@ -0,0 +1,30 @@ +{ + "name": "@repo/logger", + "version": "0.0.0", + "private": true, + "main": "./dist/index.js", + "types": "./dist/index.d.ts", + "files": [ + "dist/**" + ], + "scripts": { + "build": "tsup", + "dev": "tsup --watch", + "lint": "eslint src/", + "typecheck": "tsc --noEmit", + "test": "jest" + }, + "jest": { + "preset": "@repo/jest-presets/node" + }, + "devDependencies": { + "@repo/eslint-config": "workspace:*", + "@repo/jest-presets": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@types/jest": "^29.5.12", + "@types/node": "^20.12.10", + "jest": "^29.7.0", + "tsup": "^8.0.2", + "typescript": "^5.4.5" + } +} \ No newline at end of file diff --git a/packages/logger/src/__tests__/log.test.ts b/packages/logger/src/__tests__/log.test.ts new file mode 100644 index 00000000..e196fcc9 --- /dev/null +++ b/packages/logger/src/__tests__/log.test.ts @@ -0,0 +1,11 @@ +import { log } from ".."; + +jest.spyOn(global.console, "log"); + +describe("@repo/logger", () => { + it("prints a message", () => { + log("hello"); + // eslint-disable-next-line no-console -- testing console + expect(console.log).toBeCalledWith("LOGGER: ", "hello"); + }); +}); diff --git a/packages/logger/src/index.ts b/packages/logger/src/index.ts new file mode 100644 index 00000000..d573ddf4 --- /dev/null +++ b/packages/logger/src/index.ts @@ -0,0 +1,4 @@ +export const log = (...args: unknown[]): void => { + // eslint-disable-next-line no-console -- logger + console.log("LOGGER: ", ...args); +}; diff --git a/packages/logger/tsconfig.json b/packages/logger/tsconfig.json new file mode 100644 index 00000000..a7f4e490 --- /dev/null +++ b/packages/logger/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "@repo/typescript-config/base.json", + "compilerOptions": { + "lib": ["ES2015"], + "outDir": "./dist", + "types": ["jest", "node"] + }, + "include": ["."], + "exclude": ["node_modules", "dist"], +} diff --git a/packages/logger/tsup.config.ts b/packages/logger/tsup.config.ts new file mode 100644 index 00000000..be508ff5 --- /dev/null +++ b/packages/logger/tsup.config.ts @@ -0,0 +1,9 @@ +import { defineConfig, type Options } from "tsup"; + +export default defineConfig((options: Options) => ({ + entryPoints: ["src/index.ts"], + clean: true, + dts: true, + format: ["cjs"], + ...options, +})); diff --git a/packages/logger/turbo.json b/packages/logger/turbo.json new file mode 100644 index 00000000..1ca1faa8 --- /dev/null +++ b/packages/logger/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "pipeline": { + "build": { + "outputs": ["dist/**"] + } + } +} diff --git a/packages/shared/.eslintrc.js b/packages/shared/.eslintrc.js new file mode 100644 index 00000000..d83112c0 --- /dev/null +++ b/packages/shared/.eslintrc.js @@ -0,0 +1,8 @@ +/** @type {import("eslint").Linter.Config} */ +module.exports = { + extends: ["@repo/eslint-config/react.js"], + parser: "@typescript-eslint/parser", + parserOptions: { + project: true, + }, +}; diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md new file mode 100644 index 00000000..a7f246d0 --- /dev/null +++ b/packages/shared/CHANGELOG.md @@ -0,0 +1,42 @@ +# @repo/shared + +## 0.0.3 + +### Patch Changes + +- Updated dependencies [6ad42c8] +- Updated dependencies [d80cde0] + - react18-loaders@1.0.0 + +## 0.0.3-canary.1 + +### Patch Changes + +- Updated dependencies [6ad42c8] +- Updated dependencies [d80cde0] + - react18-loaders@1.0.0-canary.1 + +## 0.0.3-canary.0 + +### Patch Changes + +- Updated dependencies [6ad42c8] +- Updated dependencies [d80cde0] +- Updated dependencies [b1f029b] + - react18-loaders@1.0.0-canary.0 + +## 0.0.2 + +### Patch Changes + +- Updated dependencies [1d4dec0] +- Updated dependencies [52eb814] +- Updated dependencies [ea8e4ee] + - react18-loaders@0.0.2 + +## 0.0.1 + +### Patch Changes + +- Updated dependencies [0c17b4a] + - react18-loaders@0.0.1 diff --git a/packages/shared/package.json b/packages/shared/package.json new file mode 100644 index 00000000..aef398a0 --- /dev/null +++ b/packages/shared/package.json @@ -0,0 +1,48 @@ +{ + "name": "@repo/shared", + "version": "0.0.3", + "private": true, + "sideEffects": false, + "main": "./dist/index.js", + "module": "./dist/index.mjs", + "types": "./dist/index.d.ts", + "files": [ + "dist/**" + ], + "scripts": { + "build": "tsup && tsc -p tsconfig-build.json", + "clean": "rm -rf dist", + "dev": "tsup --watch && tsc -p tsconfig-build.json -w", + "typecheck": "tsc --noEmit", + "lint": "eslint src/", + "test": "vitest run --coverage" + }, + "devDependencies": { + "@repo/eslint-config": "workspace:*", + "@repo/jest-presets": "workspace:*", + "@repo/typescript-config": "workspace:*", + "@testing-library/react": "^15.0.7", + "@types/node": "^20.12.10", + "@types/react": "^18.3.1", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.2.1", + "@vitest/coverage-v8": "^1.6.0", + "esbuild-plugin-react18": "^0.1.5", + "esbuild-plugin-react18-css": "^0.0.4", + "jsdom": "^24.0.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "tsup": "^8.0.2", + "typescript": "^5.4.5", + "vite-tsconfig-paths": "^4.3.2", + "vitest": "^1.6.0" + }, + "dependencies": { + "@mayank1513/fork-me": "^2.1.2", + "@repo/scripts": "workspace:*", + "nextjs-themes": "^3.1.1", + "r18gs": "^1.0.2", + "react-live": "^4.1.6", + "react18-loaders": "workspace:*" + } +} diff --git a/packages/shared/src/client/demo/demo.module.scss b/packages/shared/src/client/demo/demo.module.scss new file mode 100644 index 00000000..d519e9d1 --- /dev/null +++ b/packages/shared/src/client/demo/demo.module.scss @@ -0,0 +1,29 @@ +.demo { + width: var(--max-width); + max-width: 95vw; + display: flex; + margin: auto; + margin-bottom: 3rem; + border-radius: 1rem; + overflow: hidden; + box-shadow: 0 0 8px -2px var(--text-color); + & > * { + flex-grow: 1; + } +} + +.preview { + padding: 10px; +} + +.center { + display: flex; + align-items: center; + justify-content: center; + height: 100%; + width: 100%; +} + +.code { + font-family: var(--font-mono); +} diff --git a/packages/shared/src/client/demo/demo.test.tsx b/packages/shared/src/client/demo/demo.test.tsx new file mode 100644 index 00000000..ff21ac54 --- /dev/null +++ b/packages/shared/src/client/demo/demo.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Demo } from "./demo"; + +describe.concurrent("demo", () => { + afterEach(cleanup); + + test("Dummy test - test if renders without errors", () => { + render(); + }); +}); diff --git a/packages/shared/src/client/demo/demo.tsx b/packages/shared/src/client/demo/demo.tsx new file mode 100644 index 00000000..10f8ebdf --- /dev/null +++ b/packages/shared/src/client/demo/demo.tsx @@ -0,0 +1,24 @@ +"use client"; + +import styles from "./demo.module.scss"; +import { LiveProvider, LiveEditor, LivePreview } from "react-live"; +import { Dots1, Dots2, Bars1, Bars2 } from "react18-loaders/dist/server"; + +const code = ` +// available components Dots1, Dots2, Bars1, Bars2 +
+ +
+`; + +/** React live demo */ +export function Demo() { + return ( + +
+ + +
+
+ ); +} diff --git a/packages/shared/src/client/demo/index.ts b/packages/shared/src/client/demo/index.ts new file mode 100644 index 00000000..14920cfb --- /dev/null +++ b/packages/shared/src/client/demo/index.ts @@ -0,0 +1,4 @@ +"use client"; + +// component exports +export * from "./demo"; diff --git a/packages/shared/src/client/drawer-button/drawer-button.module.scss b/packages/shared/src/client/drawer-button/drawer-button.module.scss new file mode 100644 index 00000000..7141cf74 --- /dev/null +++ b/packages/shared/src/client/drawer-button/drawer-button.module.scss @@ -0,0 +1,42 @@ +$tr: 5px; +.drawerBtn { + all: unset; + height: 32px; + width: 45px; + display: inline-flex; + flex-flow: column nowrap; + justify-content: space-evenly; + padding: 0 5px; + margin: 5px; + cursor: pointer; + * { + height: 4px; + background: var(--text-color); + border-radius: 50%; + border: 1px solid #5555; + } + :first-child, + :last-child { + transform: none; + margin: 0 7px; + } + :nth-child(2) { + opacity: 1; + } + + &.open { + transform: rotate(-180deg); + * { + // background: black; + &:first-child { + transform: rotate(45deg) translate($tr, $tr); + } + &:last-child { + transform: rotate(-45deg) translate($tr, -$tr); + } + &:nth-child(2) { + opacity: 0; + } + } + } +} diff --git a/packages/shared/src/client/drawer-button/drawer-button.test.tsx b/packages/shared/src/client/drawer-button/drawer-button.test.tsx new file mode 100644 index 00000000..7f9424cf --- /dev/null +++ b/packages/shared/src/client/drawer-button/drawer-button.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { DrawerButton } from "./drawer-button"; + +describe.concurrent("drawer-button", () => { + afterEach(cleanup); + + test("check if h1 heading exists", () => { + render( {}} />); + }); +}); diff --git a/packages/shared/src/client/drawer-button/drawer-button.tsx b/packages/shared/src/client/drawer-button/drawer-button.tsx new file mode 100644 index 00000000..8e02d559 --- /dev/null +++ b/packages/shared/src/client/drawer-button/drawer-button.tsx @@ -0,0 +1,24 @@ +"use client"; +import { Dispatch, SetStateAction } from "react"; +import styles from "./drawer-button.module.scss"; + +interface DrawerButtonProps { + open: boolean; + setOpen: Dispatch>; +} + +/** + * # DrawerButton + * Drawer button to toggle side navigation on mobile devices. + */ +export function DrawerButton({ open, setOpen }: DrawerButtonProps) { + return ( + + ); +} diff --git a/packages/shared/src/client/drawer-button/index.ts b/packages/shared/src/client/drawer-button/index.ts new file mode 100644 index 00000000..cfe25116 --- /dev/null +++ b/packages/shared/src/client/drawer-button/index.ts @@ -0,0 +1,4 @@ +"use client"; + +// component exports +export * from "./drawer-button"; diff --git a/packages/shared/src/client/global-loader/global-loader.test.tsx b/packages/shared/src/client/global-loader/global-loader.test.tsx new file mode 100644 index 00000000..5c83e943 --- /dev/null +++ b/packages/shared/src/client/global-loader/global-loader.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { GlobalLoader } from "./global-loader"; + +describe.concurrent("global-loader", () => { + afterEach(cleanup); + + test("check if renders", () => { + render(); + }); +}); diff --git a/packages/shared/src/client/global-loader/global-loader.tsx b/packages/shared/src/client/global-loader/global-loader.tsx new file mode 100644 index 00000000..11ff718d --- /dev/null +++ b/packages/shared/src/client/global-loader/global-loader.tsx @@ -0,0 +1,25 @@ +import { LoaderContainer } from "react18-loaders"; +import { Bars1 } from "react18-loaders/dist/server/bars/bars1"; + +/** + * # GlobalLoader + * LoaderContainer with a Loader. + * + * We can't add this directly inside layout if we want to build this shared package and use the generated code from `dist` directory. + * + * Why can't we do this? because doing so will add client side functionality without "use client" directive. And that will fail with Next.js + * + * Why do we want to build this package? + * Remix does not support scss out of the box. All SCSS code in this package will be converted to CSS. + * + * Alternative solution, + * + * Import from `src` directory for use with Next.js and from `dist` for Remix. + */ +export function GlobalLoader() { + return ( + + + + ); +} diff --git a/packages/shared/src/client/global-loader/index.ts b/packages/shared/src/client/global-loader/index.ts new file mode 100644 index 00000000..d0911045 --- /dev/null +++ b/packages/shared/src/client/global-loader/index.ts @@ -0,0 +1,4 @@ +"use client"; + +// component exports +export * from "./global-loader"; diff --git a/packages/shared/src/client/header/header.module.scss b/packages/shared/src/client/header/header.module.scss new file mode 100644 index 00000000..cfc45e18 --- /dev/null +++ b/packages/shared/src/client/header/header.module.scss @@ -0,0 +1,91 @@ +.header { + position: sticky; + top: 0; + width: 100%; + height: 76px; + box-shadow: 0 3px 8px -6px var(--text-color); + backdrop-filter: blur(3px); + z-index: 100; + & > div { + display: flex; + align-items: center; + flex-wrap: nowrap !important; + font-size: 0.85rem; + max-width: var(--max-width); + width: 100%; + height: 100%; + z-index: 2; + padding: 0 10px; + margin: auto; + } + nav { + position: fixed; + top: 76px; + height: calc(100vh - 76px); + left: -300px; + width: 300px; + box-shadow: 0 0 8px -5px var(--text-color); + overflow: auto; + display: flex; + flex-direction: column-reverse; + gap: 20px; + justify-content: space-between; + background: var(--bg-color); + } + .open { + left: 0; + } +} + +.author, +.themeswitch { + all: unset; + box-shadow: 0 1px 8px -5px var(--text-color); + padding: 15px 20px; + gap: 20px; + display: flex; + text-transform: capitalize; + cursor: pointer; + margin: 0; +} +.author { + font-weight: 700; + font-size: 1rem; + justify-content: center; + text-shadow: 0 1px 5px orange; +} + +@media screen and (min-width: 800px) { + .header { + & > div { + justify-content: space-between; + } + nav { + position: relative; + flex-direction: row; + align-items: center; + height: 100%; + width: auto; + top: 0; + left: auto; + background: transparent; + } + nav, + .author, + .themeswitch { + box-shadow: none; + text-shadow: none; + font-weight: 500; + gap: 0; + } + } + .themeswitch { + margin-right: 130px; + } +} + +@media screen and (min-width: 1200px) { + .themeswitch { + margin-right: 80px; + } +} diff --git a/packages/shared/src/client/header/header.test.tsx b/packages/shared/src/client/header/header.test.tsx new file mode 100644 index 00000000..06f305fe --- /dev/null +++ b/packages/shared/src/client/header/header.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Header } from "./header"; + +describe.concurrent("header", () => { + afterEach(cleanup); + + test("check if h1 heading exists", () => { + render(
); + }); +}); diff --git a/packages/shared/src/client/header/header.tsx b/packages/shared/src/client/header/header.tsx new file mode 100644 index 00000000..2c5ab43a --- /dev/null +++ b/packages/shared/src/client/header/header.tsx @@ -0,0 +1,34 @@ +import { useState } from "react"; +import styles from "./header.module.scss"; +import ThemeSwitch from "./theme-switch"; +import { DrawerButton } from "../drawer-button"; +import { Logo } from "../../server"; + +/** + * # Header + * Header and navigation drawer - creating as client component + * + * This could be a server component with leaf nodes being client components. + * However, we want to reuse as much code as possible across different examples and also optimize for the best use of bleading edge features. + */ +export function Header() { + const [open, setOpen] = useState(false); + return ( +
+ +
+ ); +} diff --git a/packages/shared/src/client/header/index.ts b/packages/shared/src/client/header/index.ts new file mode 100644 index 00000000..809a9a69 --- /dev/null +++ b/packages/shared/src/client/header/index.ts @@ -0,0 +1,4 @@ +"use client"; + +// component exports +export * from "./header"; diff --git a/packages/shared/src/client/header/theme-switch.tsx b/packages/shared/src/client/header/theme-switch.tsx new file mode 100644 index 00000000..39d4439b --- /dev/null +++ b/packages/shared/src/client/header/theme-switch.tsx @@ -0,0 +1,29 @@ +"use client"; + +import { ColorSwitch, useTheme } from "nextjs-themes"; +import styles from "./header.module.scss"; +import { useCallback } from "react"; + +/** This is a wrapper around `nextjs-themes's ColorSwitch component to improve mobile view. */ +export default function ThemeSwitch() { + const { colorSchemePref, setColorSchemePref } = useTheme(); + const toggle = useCallback(() => { + switch (colorSchemePref) { + case "dark": + setColorSchemePref("light"); + break; + case "light": + setColorSchemePref("system"); + break; + case "system": + default: + setColorSchemePref("dark"); + } + }, [colorSchemePref]); + return ( + + ); +} diff --git a/packages/shared/src/client/index.ts b/packages/shared/src/client/index.ts new file mode 100644 index 00000000..9ae49861 --- /dev/null +++ b/packages/shared/src/client/index.ts @@ -0,0 +1,13 @@ +"use client"; + +/** + * Server components and client components need to be exported from separate files as + * directive on top of the file from which component is imported takes effect. + * i.e., server component re-exported from file with "use client" will behave as client component + */ + +// client component exports +export * from "./demo"; +export * from "./header"; +export * from "./global-loader"; +export * from "./drawer-button"; diff --git a/packages/shared/src/declaration.d.ts b/packages/shared/src/declaration.d.ts new file mode 100644 index 00000000..e6c7b7b2 --- /dev/null +++ b/packages/shared/src/declaration.d.ts @@ -0,0 +1,2 @@ +declare module "*.module.css"; +declare module "*.module.scss"; diff --git a/packages/shared/src/global.scss b/packages/shared/src/global.scss new file mode 100644 index 00000000..69783de7 --- /dev/null +++ b/packages/shared/src/global.scss @@ -0,0 +1,86 @@ +@import "@mayank1513/fork-me/index.css"; + +* { + box-sizing: border-box; + transition: all 0.3s; +} + +:root { + --max-width: 1100px; + --border-radius: 12px; + --font-mono: ui-monospace, Menlo, Monaco, "Cascadia Mono", "Segoe UI Mono", "Roboto Mono", + "Oxygen Mono", "Ubuntu Monospace", "Source Code Pro", "Fira Mono", "Droid Sans Mono", + "Courier New", monospace; + --tile-border: conic-gradient(#f008, #f004, #f003, #f002, #f001, #f001, #f001); + + --callout-rgb: 238, 240, 241; + --callout-border-rgb: 172, 175, 176; + --card-rgb: 180, 185, 188; + --card-border-rgb: 131, 134, 135; +} + +/* dark themes */ +.dark, +.dark ~ * { + --bg-color: #000; + --text-color: #9ca3af; + --primary-glow: radial-gradient(rgba(1, 65, 255, 0.4), rgba(1, 65, 255, 0)); + --secondary-glow: linear-gradient( + to bottom right, + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0), + rgba(1, 65, 255, 0.3) + ); + + --callout-rgb: 20, 20, 20; + --callout-border-rgb: 108, 108, 108; + --card-rgb: 100, 100, 100; + --card-border-rgb: 200, 200, 200; +} + +/* light themes */ + +.light, +.light ~ * { + --bg-color: #fff; + --text-color: #534c40; + --primary-glow: conic-gradient( + from 180deg at 50% 50%, + #b916ff83 0deg, + #ff08bd53 55deg, + #ff54b583 120deg, + #ff006683 160deg + ); + --secondary-glow: radial-gradient(#aaf5, #f0f0, #f0f0); +} + +html { + padding: 0; + margin: 0; +} + +body, +#root /** root element of vite */ { + padding: 0; + margin: 0; + min-height: 100vh; + display: flex; + flex-direction: column; + background: var(--bg-color); +} + +a { + color: inherit; + text-decoration: none; +} + +// utils +.grow { + flex-grow: 1; +} + +@media screen and (min-width: 800px) { + .mb { + display: none !important; + } +} diff --git a/packages/shared/src/index.ts b/packages/shared/src/index.ts new file mode 100644 index 00000000..eee12947 --- /dev/null +++ b/packages/shared/src/index.ts @@ -0,0 +1,3 @@ +"use client"; + +export * from "./client"; diff --git a/packages/shared/src/server/cards/card.tsx b/packages/shared/src/server/cards/card.tsx new file mode 100644 index 00000000..d051eed0 --- /dev/null +++ b/packages/shared/src/server/cards/card.tsx @@ -0,0 +1,19 @@ +import styles from "./cards.module.scss"; + +export interface CardProps { + href: string; + title: string; + description: string; +} + +/** Display component */ +export function Card({ href, title, description }: CardProps) { + return ( + +

+ {title} -> +

+

{description}

+
+ ); +} diff --git a/packages/shared/src/server/cards/cards.module.scss b/packages/shared/src/server/cards/cards.module.scss new file mode 100644 index 00000000..5a19cfb8 --- /dev/null +++ b/packages/shared/src/server/cards/cards.module.scss @@ -0,0 +1,76 @@ +.cards { + display: flex; + justify-content: space-evenly; + flex-wrap: wrap; + gap: 25px; + width: var(--max-width); + max-width: 95vw; + margin: auto; +} + +.card { + all: unset; + display: flex; + flex-direction: column; + padding: 1rem 1.2rem; + border-radius: var(--border-radius); + background: rgba(var(--card-rgb), 0); + border: 1px solid rgba(var(--card-border-rgb), 0.1); + cursor: pointer; + transition: + background 200ms, + border 200ms; +} + +.card span { + display: inline-block; + transition: transform 200ms; +} + +.card h2 { + font-weight: 600; + margin-top: 0; + text-align: start; +} + +.card p { + margin: 0; + opacity: 0.6; + font-size: 0.9rem; + line-height: 1.5; + width: 34ch; + text-align: justify; +} + +.card nav { + display: flex; + gap: 15px; + padding-top: 10px; +} + +.card nav select { + flex-grow: 1; +} + +/* Enable hover only on non-touch devices */ +@media (hover: hover) and (pointer: fine) { + .card:hover { + background: rgba(var(--card-rgb), 0.1); + border: 1px solid rgba(var(--card-border-rgb), 0.15); + } + + .card:hover span { + transform: translateX(4px); + } +} + +/* Mobile and Tablet */ +@media (max-width: 1023px) { + .card { + padding: 1rem 2.5rem; + } + + .card h2 { + margin-bottom: 0.5rem; + } +} diff --git a/packages/shared/src/server/cards/cards.test.tsx b/packages/shared/src/server/cards/cards.test.tsx new file mode 100644 index 00000000..45532c5b --- /dev/null +++ b/packages/shared/src/server/cards/cards.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Cards } from "./cards"; + +describe.concurrent("cards", () => { + afterEach(cleanup); + + test("check if renders without errors", () => { + render(); + }); +}); diff --git a/packages/shared/src/server/cards/cards.tsx b/packages/shared/src/server/cards/cards.tsx new file mode 100644 index 00000000..382cc17a --- /dev/null +++ b/packages/shared/src/server/cards/cards.tsx @@ -0,0 +1,13 @@ +import styles from "./cards.module.scss"; +import { Card, CardProps } from "./card"; + +/** Component to render cards */ +export function Cards({ cards }: { cards: CardProps[] }) { + return ( +
+ {cards.map(card => ( + + ))} +
+ ); +} diff --git a/packages/shared/src/server/cards/index.ts b/packages/shared/src/server/cards/index.ts new file mode 100644 index 00000000..56f6f9cf --- /dev/null +++ b/packages/shared/src/server/cards/index.ts @@ -0,0 +1,2 @@ +// component exports +export * from "./cards"; diff --git a/packages/shared/src/server/index.ts b/packages/shared/src/server/index.ts new file mode 100644 index 00000000..2af43515 --- /dev/null +++ b/packages/shared/src/server/index.ts @@ -0,0 +1,11 @@ +/** + * Server components and client components need to be exported from separate files as + * directive on top of the file from which component is imported takes effect. + * i.e., server component re-exported from file with "use client" will behave as client component + */ + +// server component exports +export * from "./landing-page"; +export * from "./logo"; +export * from "./cards"; +export * from "./layout"; diff --git a/packages/shared/src/server/landing-page/index.ts b/packages/shared/src/server/landing-page/index.ts new file mode 100644 index 00000000..bf589bdb --- /dev/null +++ b/packages/shared/src/server/landing-page/index.ts @@ -0,0 +1,2 @@ +// component exports +export * from "./landing-page"; diff --git a/packages/shared/src/server/landing-page/landing-page.module.scss b/packages/shared/src/server/landing-page/landing-page.module.scss new file mode 100644 index 00000000..d03d4c58 --- /dev/null +++ b/packages/shared/src/server/landing-page/landing-page.module.scss @@ -0,0 +1,89 @@ +.center { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + text-align: center; + position: relative; + flex-wrap: wrap; + padding: 3rem; + gap: 20px 50px; + z-index: 2; + a { + transform: scale(1.25); + &::after { + padding: 2px; + } + } +} + +.center::before { + background: var(--secondary-glow); + border-radius: 50%; + width: 480px; + height: 360px; + margin-left: -400px; + pointer-events: none; +} + +.center::after { + background: var(--primary-glow); + width: 240px; + height: 180px; +} + +.center::before, +.center::after { + content: " "; + left: 50%; + position: absolute; + filter: blur(45px); + z-index: -1; +} + +.hero { + h2, + strong { + font-style: italic; + } +} + +.title { + border-radius: var(--border-radius); + background: linear-gradient(to right, #3b82f6, #ef4444); + background-clip: text; + color: transparent; + width: fit-content; + margin: auto; + margin-top: 3rem; + font-size: 3rem; + text-shadow: none; +} + +.featured { + margin: auto; + margin-bottom: 3rem; + width: calc(var(--max-width) + 3rem); + max-width: 95vw; + box-shadow: 0 0 8px -2px var(--text-color); + text-align: center; + border-radius: 20px; + padding: 1rem 0; + hr { + margin: 0 3rem; + margin-bottom: 2rem; + box-shadow: 0 0 8px var(--text-color); + } + & > div { + width: auto; + max-height: calc(100vh - 300px); + overflow: auto; + padding: 20px; + } +} + +@media screen and (min-width: 1000px) { + .featured > div { + padding: 20px 4rem; + } +} diff --git a/packages/shared/src/server/landing-page/landing-page.test.tsx b/packages/shared/src/server/landing-page/landing-page.test.tsx new file mode 100644 index 00000000..50ba06a7 --- /dev/null +++ b/packages/shared/src/server/landing-page/landing-page.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { LandingPage } from "./landing-page"; + +describe.concurrent("landing-page", () => { + afterEach(cleanup); + + test("check if renders without errors", () => { + render(); + }); +}); diff --git a/packages/shared/src/server/landing-page/landing-page.tsx b/packages/shared/src/server/landing-page/landing-page.tsx new file mode 100644 index 00000000..aaef858d --- /dev/null +++ b/packages/shared/src/server/landing-page/landing-page.tsx @@ -0,0 +1,57 @@ +import { ReactNode } from "react"; +import styles from "./landing-page.module.scss"; +import { Cards } from "../cards"; +import { Logo } from "../logo"; +import featured from "@repo/scripts/featured.json"; +import rebrandingConfig from "@repo/scripts/rebrand.config.json"; + +interface LandingPageProps { + title: string; + children?: ReactNode; +} + +const { owner, repo } = rebrandingConfig; + +const cards = [ + { + href: `https://${owner}.github.io/${repo}/`, + title: "Docs", + description: "Check out the official documentation for more information.", + }, + { + href: `https://github.com/${owner}/${repo}/tree/main/examples`, + title: "More Examples", + description: + "Check out more examples on the official GitHub Repo. Feel free to suggest additional examples in the discussions section.", + }, + { + href: `https://github.com/${owner}/${repo}`, + title: "Star this repo", + description: + "Star this repo for your new library! This also motivates us and helps us understand that community is interested in this work.", + }, +]; + +/** + * # LandingPage + * library's landing page + */ +export function LandingPage({ title, children }: LandingPageProps) { + return ( +
+

{title}

+
+

Craft your next amazing library using

+ + Harness the full potential of React 18 Server Components! +
+ {children} +
+

Featured packages built with this template.

+
+ +
+ +
+ ); +} diff --git a/packages/shared/src/server/layout/index.ts b/packages/shared/src/server/layout/index.ts new file mode 100644 index 00000000..4810a4eb --- /dev/null +++ b/packages/shared/src/server/layout/index.ts @@ -0,0 +1,2 @@ +// component exports +export * from "./layout"; diff --git a/packages/shared/src/server/layout/layout.module.scss b/packages/shared/src/server/layout/layout.module.scss new file mode 100644 index 00000000..a0c308a4 --- /dev/null +++ b/packages/shared/src/server/layout/layout.module.scss @@ -0,0 +1,12 @@ +.container { + padding-top: 1rem; + background: var(--bg-color); + color: var(--text-color); + footer { + text-align: center; + padding: 10px; + padding-top: 8px; + margin-top: 2rem; + box-shadow: 0 -2px 8px -6px var(--text-color); + } +} diff --git a/packages/shared/src/server/layout/layout.test.tsx b/packages/shared/src/server/layout/layout.test.tsx new file mode 100644 index 00000000..ef7a58d5 --- /dev/null +++ b/packages/shared/src/server/layout/layout.test.tsx @@ -0,0 +1,11 @@ +import { cleanup, render } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Layout } from "./layout"; + +describe.concurrent("layout", () => { + afterEach(cleanup); + + test("check if renders without errors", () => { + render(); + }); +}); diff --git a/packages/shared/src/server/layout/layout.tsx b/packages/shared/src/server/layout/layout.tsx new file mode 100644 index 00000000..f49ffe89 --- /dev/null +++ b/packages/shared/src/server/layout/layout.tsx @@ -0,0 +1,32 @@ +import { ReactNode } from "react"; +import styles from "./layout.module.scss"; +import { ForkMe } from "@mayank1513/fork-me/server"; +import config from "@repo/scripts/rebrand.config.json"; + +const { owner, repo } = config; +interface LayoutProps { + children?: ReactNode; +} + +/** + * # Layout + * The default layout shared by all examples. + */ +export function Layout({ children }: LayoutProps) { + return ( +
+ {children} + + +
+ ); +} diff --git a/packages/shared/src/server/logo/index.ts b/packages/shared/src/server/logo/index.ts new file mode 100644 index 00000000..ef37ca02 --- /dev/null +++ b/packages/shared/src/server/logo/index.ts @@ -0,0 +1,2 @@ +// component exports +export * from "./logo"; diff --git a/packages/shared/src/server/logo/logo.module.scss b/packages/shared/src/server/logo/logo.module.scss new file mode 100644 index 00000000..75a2e8d5 --- /dev/null +++ b/packages/shared/src/server/logo/logo.module.scss @@ -0,0 +1,69 @@ +.logo { + position: relative; + display: flex; + justify-content: center; + align-items: center; + transform: translateZ(0); + border-radius: var(--border-radius); + overflow: hidden; + box-shadow: 0px 2px 8px -1px #0000001a; + padding: 2px; + width: 180px; + span { + font-weight: 700; + font-family: var(--font-mono); + padding: 0.75rem 1rem; + border-radius: var(--border-radius); + background: linear-gradient(to right, #3b82f6, #3b82f6, #ef4444, #ef4444); + background-size: 200%; + background-clip: text; + color: transparent; + animation: 4s txt infinite linear; + } + &::before, + &::after { + content: " "; + position: absolute; + z-index: -1; + } + /* Conic Gradient Animation */ + &::before { + animation: 3s rotate infinite linear; + width: 800%; + height: 800%; + background: var(--tile-border); + } + + /* Inner Square */ + &::after { + inset: 0; + padding: 1px; + border-radius: var(--border-radius); + background: var(--bg-color); + background-clip: content-box; + } +} + +@keyframes rotate { + from { + transform: rotate(360deg); + } + to { + transform: rotate(0deg); + } +} + +@keyframes txt { + from { + background-position: 100% 50%; + } + to { + background-position: -100% 50%; + } +} + +@media screen and (min-width: 800px) { + .logo { + width: 210px; + } +} diff --git a/packages/shared/src/server/logo/logo.tsx b/packages/shared/src/server/logo/logo.tsx new file mode 100644 index 00000000..d50ea923 --- /dev/null +++ b/packages/shared/src/server/logo/logo.tsx @@ -0,0 +1,20 @@ +import styles from "./logo.module.scss"; +import rebrandingConfig from "@repo/scripts/rebrand.config.json"; + +const { repo } = rebrandingConfig; + +interface LogoProps { + href?: string; +} + +/** + * # Logo + * + */ +export function Logo({ href }: LogoProps) { + return ( + + {repo} + + ); +} diff --git a/packages/shared/tsconfig-build.json b/packages/shared/tsconfig-build.json new file mode 100644 index 00000000..66cc4082 --- /dev/null +++ b/packages/shared/tsconfig-build.json @@ -0,0 +1,12 @@ +{ + // using tsc for type declarations as "Note that declaration files generated by any tool other than tsc are not guaranteed to be error-free, so it's a good idea to test the output with tsc" - https://tsup.egoist.dev/#generate-declaration-file + "extends": "@repo/typescript-config/react-library.json", + "compilerOptions": { + "outDir": "dist", + "noEmit": false, + "emitDeclarationOnly": true, + "declarationMap": false + }, + "include": ["src"], + "exclude": ["dist", "node_modules", "**/*.test.*", "**/*.spec.*"] +} diff --git a/packages/shared/tsconfig.json b/packages/shared/tsconfig.json new file mode 100644 index 00000000..9430b2f8 --- /dev/null +++ b/packages/shared/tsconfig.json @@ -0,0 +1,9 @@ +{ + "extends": "@repo/typescript-config/react-library.json", + "compilerOptions": { + "lib": ["dom", "ES2015"], + "types": ["vitest", "node"] + }, + "include": ["."], + "exclude": ["dist", "build", "node_modules"] +} diff --git a/packages/shared/tsup.config.ts b/packages/shared/tsup.config.ts new file mode 100644 index 00000000..562de8d6 --- /dev/null +++ b/packages/shared/tsup.config.ts @@ -0,0 +1,19 @@ +import { defineConfig, type Options } from "tsup"; +import react18Plugin from "esbuild-plugin-react18"; +import cssPlugin from "esbuild-plugin-react18-css"; + +export default defineConfig( + (options: Options) => + ({ + format: ["cjs", "esm"], + target: "es2019", + entry: ["./src"], + sourcemap: false, + clean: !options.watch, + bundle: true, + minify: !options.watch, + esbuildPlugins: [react18Plugin(), cssPlugin({ generateScopedName: "[folder]__[local]" })], + external: ["react"], + ...options, + }) as Options, +); diff --git a/packages/shared/turbo.json b/packages/shared/turbo.json new file mode 100644 index 00000000..1ca1faa8 --- /dev/null +++ b/packages/shared/turbo.json @@ -0,0 +1,8 @@ +{ + "extends": ["//"], + "pipeline": { + "build": { + "outputs": ["dist/**"] + } + } +} diff --git a/packages/shared/vitest.config.ts b/packages/shared/vitest.config.ts new file mode 100644 index 00000000..18196779 --- /dev/null +++ b/packages/shared/vitest.config.ts @@ -0,0 +1,18 @@ +import { defineConfig } from "vitest/config"; +import react from "@vitejs/plugin-react"; +import tsconfigPaths from "vite-tsconfig-paths"; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [react(), tsconfigPaths()], + test: { + environment: "jsdom", + globals: true, + setupFiles: [], + coverage: { + include: ["src/**"], + exclude: ["src/**/index.ts", "src/**/declaration.d.ts"], + reporter: ["text", "json", "clover", "html"], + }, + }, +}); diff --git a/plopfile.js b/plopfile.js new file mode 100644 index 00000000..7dc59e47 --- /dev/null +++ b/plopfile.js @@ -0,0 +1,204 @@ +const fs = require("fs"); +const path = require("path"); + +/** + * @typedef {Object} InquirerDataType + * @property {boolean} isClient - Indicates whether a client component should be created. + * @property {string} name - Component name along with the relative path from either the client or server directory. + * @property {string} pkgPath - Package path. + */ + +/** + * Updates index files if needed based on the provided parameters. + * @param {import('plop').ActionType} nestedRouteActions - Nested route actions. + * @param {string[]} rootSegments - Root segments. + * @param {string[]} currentDirSegments - Current directory segments. + * @param {boolean} isClient - Indicates whether it's a client component. + */ +function updateIndexFilesIfNeeded(nestedRouteActions, rootSegments, currentDirSegments, isClient) { + const indexFilePath = path.resolve(__dirname, ...rootSegments, ...currentDirSegments, "index.ts"); + const root = rootSegments.join("/"); + if (!fs.existsSync(indexFilePath)) { + const content = + `${isClient ? '"use client";\n' : ""}// ${currentDirSegments.join("/")}` + + " component exports\n"; + nestedRouteActions.push({ + type: "add", + path: `${root + currentDirSegments.join("/")}/index.ts`, + template: content, + }); + const length = currentDirSegments.length; + nestedRouteActions.push({ + type: "append", + pattern: /(? component exports)/, + path: `${ + root + (length === 1 ? "" : `${currentDirSegments.slice(0, length - 1).join("/")}/`) + }index.ts`, + template: `export * from "./${currentDirSegments[length - 1]}"`, + }); + } +} + +/** + * Converts a string to kebab-case. + * @param {string} str - The input string. + * @returns {string} The string in kebab-case. + */ +function toKebabCase(str) { + return str + .trim() + .replace(/([a-z])([A-Z])/g, "$1-$2") + .toLowerCase() + .replace(/ +/g, "-"); +} + +/** + * Gets nested route actions based on the provided data. + * @param {InquirerDataType} data - Input data. + * @returns {Object} Nested route actions and parent directory. + */ +function getNestedRouteActions(data) { + const { isClient } = data; + const name = data.name.replace(/\/+/g, "/").replace(/\/$/, "").trim(); + const root = `${data.pkgPath}/src/${isClient ? "client/" : "server/"}`; + const nestedRouteActions = []; + + /** Create index.ts in src directory if not present. */ + if (!fs.existsSync(path.resolve(__dirname, `${data.pkgPath}/src`, "index.ts"))) { + nestedRouteActions.push({ + type: "add", + path: `${data.pkgPath}/src/index.ts`, + template: `${isClient ? '"use client";\n\n' : ""}export * from "./${isClient ? "client" : "server"}";\n`, + }); + } + + /** Create declaration if not present. */ + if (!fs.existsSync(path.resolve(__dirname, `${data.pkgPath}/src`, "declaration.d.ts"))) { + nestedRouteActions.push({ + type: "add", + path: `${data.pkgPath}/src/declaration.d.ts`, + template: 'declare module "*.module.css";\ndeclare module "*.module.scss";\n', + }); + } + + /** Create index.ts in src/client or src/server directory if not present. */ + if (!fs.existsSync(path.resolve(__dirname, root, "index.ts"))) { + nestedRouteActions.push({ + type: "add", + path: `${root}index.ts`, + template: `${isClient ? '"use client";\n\n' : ""}/**\n * Server components and client components need to be exported from separate files as\n * directive on top of the file from which component is imported takes effect.\n * i.e., server component re-exported from file with "use client" will behave as client component\n */\n\n// ${isClient ? "client" : "server"} component exports\n`, + }); + } + + if (!name.includes("/")) return { nestedRouteActions, parentDir: root }; + + const lastSlashInd = name.lastIndexOf("/") || name.lastIndexOf("\\"); + data.name = name.slice(lastSlashInd + 1); + + const directories = toKebabCase(name.slice(0, lastSlashInd)).split(/\/|\\/); + const rootSegments = [...root.split(/\/|\\/)]; + + for (let i = 1; i <= directories.length; i++) + updateIndexFilesIfNeeded(nestedRouteActions, rootSegments, directories.slice(0, i), isClient); + + return { nestedRouteActions, parentDir: `${root + directories.join("/")}/` }; +} + +/** + * Gets the index action based on the provided data and parent directory. + * @param {InquirerDataType} data - Input data. + * @param {string} parentDir - Parent directory. + * @returns {Object} Index action. + */ +function getIndexAction(data, parentDir) { + const indFilePath = path.resolve(__dirname, parentDir, toKebabCase(data.name), "index.ts"); + if (fs.existsSync(indFilePath)) + return { + type: "append", + pattern: /(? component exports)/, + path: `${parentDir}{{kebabCase name}}/index.ts`, + template: 'export * from "./{{kebabCase name}}";', + }; + return { + type: "add", + path: `${parentDir}{{kebabCase name}}/index.ts`, + template: `${data.isClient ? '"use client";\n\n' : ""}// component exports\nexport * from "./{{kebabCase name}}";\n`, + }; +} + +/** + * Gets actions based on the provided data. + * @param {InquirerDataType} data - Input data. + * @returns {Array} Actions. + */ +function getActions(data) { + const { nestedRouteActions, parentDir } = getNestedRouteActions(data); + + return nestedRouteActions.concat([ + getIndexAction(data, parentDir), + { + type: "add", + path: `${parentDir}{{kebabCase name}}/{{kebabCase name}}.tsx`, + templateFile: "templates/component.hbs", + }, + { + type: "add", + path: `${parentDir}{{kebabCase name}}/{{kebabCase name}}.test.tsx`, + templateFile: "templates/component.test.hbs", + }, + { + type: "add", + path: `${parentDir}{{kebabCase name}}/{{kebabCase name}}.module.scss`, + templateFile: "templates/component.module.hbs", + }, + { + type: "append", + pattern: /(? component exports)/, + path: `${parentDir}index.ts`, + template: 'export * from "./{{kebabCase name}}";', + }, + ]); +} + +/** + * Generator function to add a new React component to the internal UI library. + * @param {import('plop').NodePlopAPI} plop - Plop API. + */ +function generator(plop) { + plop.setGenerator("rc", { + description: "Adds a new React component to the selected package.", + prompts: [ + { + type: "list", + name: "pkgPath", + choices: ["lib", "packages/shared"], + default: "lib", + message: "Select the package", + }, + { + type: "input", + name: "name", + message: "What is the name of the component?", + }, + { + type: "confirm", + name: "isClient", + message: 'Is this a client component? (Should we add "use client" directive?)', + }, + { + type: "input", + name: "description", + message: "Describe your component. (This will be added as js-doc comment.)", + }, + ], + actions: data => (data ? getActions(data) : []), + }); + + plop.setGenerator("React Hook", { + description: "Add a new React hook.", + prompts: [], + actions: [], + }); +} + +module.exports = generator; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..e6805b35 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,14595 @@ +lockfileVersion: '9.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: + dependencies: + '@types/node': + specifier: ^20.12.10 + version: 20.12.10 + devDependencies: + '@changesets/cli': + specifier: ^2.27.1 + version: 2.27.1 + '@repo/typescript-config': + specifier: workspace:* + version: link:packages/config-typescript + plop: + specifier: ^4.0.1 + version: 4.0.1 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + turbo: + specifier: ^1.13.3 + version: 1.13.3 + typedoc: + specifier: ^0.25.13 + version: 0.25.13(typescript@5.4.5) + typedoc-plugin-extras: + specifier: ^3.0.0 + version: 3.0.0(typedoc@0.25.13(typescript@5.4.5)) + typedoc-plugin-inline-sources: + specifier: ^1.0.2 + version: 1.0.2(typedoc@0.25.13(typescript@5.4.5)) + typedoc-plugin-mdn-links: + specifier: ^3.1.24 + version: 3.1.24(typedoc@0.25.13(typescript@5.4.5)) + typedoc-plugin-missing-exports: + specifier: ^2.2.0 + version: 2.2.0(typedoc@0.25.13(typescript@5.4.5)) + typedoc-plugin-rename-defaults: + specifier: ^0.7.0 + version: 0.7.0(typedoc@0.25.13(typescript@5.4.5)) + typedoc-plugin-zod: + specifier: ^1.1.2 + version: 1.1.2(typedoc@0.25.13(typescript@5.4.5)) + + examples/express: + dependencies: + '@repo/logger': + specifier: workspace:* + version: link:../../packages/logger + body-parser: + specifier: ^1.20.2 + version: 1.20.2 + cors: + specifier: ^2.8.5 + version: 2.8.5 + express: + specifier: ^4.19.2 + version: 4.19.2 + morgan: + specifier: ^1.10.0 + version: 1.10.0 + devDependencies: + '@repo/eslint-config': + specifier: workspace:* + version: link:../../packages/config-eslint + '@repo/jest-presets': + specifier: workspace:* + version: link:../../packages/jest-presets + '@repo/typescript-config': + specifier: workspace:* + version: link:../../packages/config-typescript + '@types/body-parser': + specifier: ^1.19.5 + version: 1.19.5 + '@types/cors': + specifier: ^2.8.17 + version: 2.8.17 + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@types/morgan': + specifier: ^1.9.9 + version: 1.9.9 + '@types/node': + specifier: ^20.12.10 + version: 20.12.10 + '@types/supertest': + specifier: ^6.0.2 + version: 6.0.2 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + supertest: + specifier: ^7.0.0 + version: 7.0.0 + tsup: + specifier: ^8.0.2 + version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))(typescript@5.4.5) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + + examples/nextjs: + dependencies: + '@repo/logger': + specifier: workspace:* + version: link:../../packages/logger + '@repo/shared': + specifier: workspace:* + version: link:../../packages/shared + next: + specifier: ^14.2.3 + version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) + nextjs-themes: + specifier: ^3.1.1 + version: 3.1.1(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react18-loaders: + specifier: workspace:* + version: link:../../lib + devDependencies: + '@next/eslint-plugin-next': + specifier: ^14.2.3 + version: 14.2.3 + '@repo/eslint-config': + specifier: workspace:* + version: link:../../packages/config-eslint + '@repo/typescript-config': + specifier: workspace:* + version: link:../../packages/config-typescript + '@types/node': + specifier: ^20.12.10 + version: 20.12.10 + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + typescript: + specifier: ^5.4.5 + version: 5.4.5 + + examples/remix: + dependencies: + '@remix-run/node': + specifier: ^2.9.1 + version: 2.9.1(typescript@5.4.5) + '@remix-run/react': + specifier: ^2.9.1 + version: 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + '@remix-run/serve': + specifier: ^2.9.1 + version: 2.9.1(typescript@5.4.5) + '@remix-run/server-runtime': + specifier: ^2.9.1 + version: 2.9.1(typescript@5.4.5) + '@repo/shared': + specifier: workspace:* + version: link:../../packages/shared + '@vercel/analytics': + specifier: ^1.2.2 + version: 1.2.2(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + '@vercel/remix-entry-server': + specifier: ^0.1.1 + version: 0.1.1(react@18.3.1) + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react18-loaders: + specifier: workspace:* + version: link:../../lib + react18-themes: + specifier: ^3.1.0 + version: 3.1.0(@remix-run/node@2.9.1(typescript@5.4.5))(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + devDependencies: + '@remix-run/dev': + specifier: ^2.9.1 + version: 2.9.1(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@remix-run/serve@2.9.1(typescript@5.4.5))(@types/node@20.12.10)(sass@1.77.0)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0)) + '@repo/eslint-config': + specifier: workspace:* + version: link:../../packages/config-eslint + '@repo/typescript-config': + specifier: workspace:* + version: link:../../packages/config-typescript + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + typescript: + specifier: ^5.4.5 + version: 5.4.5 + + examples/vite: + dependencies: + '@repo/shared': + specifier: workspace:* + version: link:../../packages/shared + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + react18-loaders: + specifier: workspace:* + version: link:../../lib + react18-themes: + specifier: ^3.1.0 + version: 3.1.0(@remix-run/node@2.9.1(typescript@5.4.5))(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + devDependencies: + '@repo/eslint-config': + specifier: workspace:* + version: link:../../packages/config-eslint + '@repo/typescript-config': + specifier: workspace:* + version: link:../../packages/config-typescript + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.2.1(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0)) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + vite: + specifier: ^5.2.11 + version: 5.2.11(@types/node@20.12.10)(sass@1.77.0) + + lib: + dependencies: + next: + specifier: 10 - 14 + version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.76.0) + r18gs: + specifier: ^1.0.2 + version: 1.0.2(@types/react@18.3.1)(react@18.3.1) + devDependencies: + '@repo/eslint-config': + specifier: workspace:* + version: link:../packages/config-eslint + '@repo/jest-presets': + specifier: workspace:* + version: link:../packages/jest-presets + '@repo/typescript-config': + specifier: workspace:* + version: link:../packages/config-typescript + '@testing-library/react': + specifier: ^15.0.7 + version: 15.0.7(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/node': + specifier: ^20.12.10 + version: 20.12.10 + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.2.1(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0)) + '@vitest/coverage-v8': + specifier: ^1.6.0 + version: 1.6.0(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) + esbuild-plugin-react18: + specifier: ^0.1.5 + version: 0.1.5 + esbuild-plugin-react18-css: + specifier: ^0.0.4 + version: 0.0.4 + jsdom: + specifier: ^24.0.0 + version: 24.0.0 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + tsup: + specifier: ^8.0.2 + version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))(typescript@5.4.5) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0)) + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0) + + packages/config-eslint: + devDependencies: + '@vercel/style-guide': + specifier: ^6.0.0 + version: 6.0.0(@next/eslint-plugin-next@14.2.3)(eslint@9.2.0)(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(prettier@3.2.5)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) + eslint-config-turbo: + specifier: ^1.13.3 + version: 1.13.3(eslint@9.2.0) + eslint-plugin-mdx: + specifier: ^3.1.5 + version: 3.1.5(eslint@9.2.0) + eslint-plugin-only-warn: + specifier: ^1.1.0 + version: 1.1.0 + eslint-plugin-storybook: + specifier: ^0.8.0 + version: 0.8.0(eslint@9.2.0)(typescript@5.4.5) + + packages/config-typescript: {} + + packages/jest-presets: + dependencies: + ts-jest: + specifier: ^29.1.2 + version: 29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(typescript@5.4.5) + devDependencies: + jest-environment-jsdom: + specifier: ^29.7.0 + version: 29.7.0 + + packages/logger: + devDependencies: + '@repo/eslint-config': + specifier: workspace:* + version: link:../config-eslint + '@repo/jest-presets': + specifier: workspace:* + version: link:../jest-presets + '@repo/typescript-config': + specifier: workspace:* + version: link:../config-typescript + '@types/jest': + specifier: ^29.5.12 + version: 29.5.12 + '@types/node': + specifier: ^20.12.10 + version: 20.12.10 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + tsup: + specifier: ^8.0.2 + version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))(typescript@5.4.5) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + + packages/shared: + dependencies: + '@mayank1513/fork-me': + specifier: ^2.1.2 + version: 2.1.2(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + '@repo/scripts': + specifier: workspace:* + version: link:../../scripts + nextjs-themes: + specifier: ^3.1.1 + version: 3.1.1(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + r18gs: + specifier: ^1.0.2 + version: 1.0.2(@types/react@18.3.1)(react@18.3.1) + react-live: + specifier: ^4.1.6 + version: 4.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + react18-loaders: + specifier: workspace:* + version: link:../../lib + devDependencies: + '@repo/eslint-config': + specifier: workspace:* + version: link:../config-eslint + '@repo/jest-presets': + specifier: workspace:* + version: link:../jest-presets + '@repo/typescript-config': + specifier: workspace:* + version: link:../config-typescript + '@testing-library/react': + specifier: ^15.0.7 + version: 15.0.7(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + '@types/node': + specifier: ^20.12.10 + version: 20.12.10 + '@types/react': + specifier: ^18.3.1 + version: 18.3.1 + '@types/react-dom': + specifier: ^18.3.0 + version: 18.3.0 + '@vitejs/plugin-react': + specifier: ^4.2.1 + version: 4.2.1(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0)) + '@vitest/coverage-v8': + specifier: ^1.6.0 + version: 1.6.0(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) + esbuild-plugin-react18: + specifier: ^0.1.5 + version: 0.1.5 + esbuild-plugin-react18-css: + specifier: ^0.0.4 + version: 0.0.4 + jsdom: + specifier: ^24.0.0 + version: 24.0.0 + react: + specifier: ^18.3.1 + version: 18.3.1 + react-dom: + specifier: ^18.3.1 + version: 18.3.1(react@18.3.1) + tsup: + specifier: ^8.0.2 + version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))(typescript@5.4.5) + typescript: + specifier: ^5.4.5 + version: 5.4.5 + vite-tsconfig-paths: + specifier: ^4.3.2 + version: 4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0)) + vitest: + specifier: ^1.6.0 + version: 1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0) + + scripts: {} + +packages: + + '@ampproject/remapping@2.3.0': + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + + '@babel/code-frame@7.24.2': + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + + '@babel/compat-data@7.24.4': + resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==} + engines: {node: '>=6.9.0'} + + '@babel/core@7.24.5': + resolution: {integrity: sha512-tVQRucExLQ02Boi4vdPp49svNGcfL2GhdTCT9aldhXgCJVAI21EtRfBettiuLUwce/7r6bFdgs6JFkcdTiFttA==} + engines: {node: '>=6.9.0'} + + '@babel/eslint-parser@7.24.5': + resolution: {integrity: sha512-gsUcqS/fPlgAw1kOtpss7uhY6E9SFFANQ6EFX5GTvzUwaV0+sGaZWk6xq22MOdeT9wfxyokW3ceCUvOiRtZciQ==} + engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0} + peerDependencies: + '@babel/core': ^7.11.0 + eslint: ^7.5.0 || ^8.0.0 || ^9.0.0 + + '@babel/generator@7.24.5': + resolution: {integrity: sha512-x32i4hEXvr+iI0NEoEfDKzlemF8AmtOP8CcrRaEcpzysWuoEb1KknpcvMsHKPONoKZiDuItklgWhB18xEhr9PA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-annotate-as-pure@7.22.5': + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-compilation-targets@7.23.6': + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-create-class-features-plugin@7.24.5': + resolution: {integrity: sha512-uRc4Cv8UQWnE4NXlYTIIdM7wfFkOqlFztcC/gVXDKohKoVB3OyonfelUBaJzSwpBntZ2KYGF/9S7asCHsXwW6g==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-environment-visitor@7.22.20': + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-function-name@7.23.0': + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-hoist-variables@7.22.5': + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-member-expression-to-functions@7.24.5': + resolution: {integrity: sha512-4owRteeihKWKamtqg4JmWSsEZU445xpFRXPEwp44HbgbxdWlUV1b4Agg4lkA806Lil5XM/e+FJyS0vj5T6vmcA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-imports@7.24.3': + resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==} + engines: {node: '>=6.9.0'} + + '@babel/helper-module-transforms@7.24.5': + resolution: {integrity: sha512-9GxeY8c2d2mdQUP1Dye0ks3VDyIMS98kt/llQ2nUId8IsWqTF0l1LkSX0/uP7l7MCDrzXS009Hyhe2gzTiGW8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-optimise-call-expression@7.22.5': + resolution: {integrity: sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==} + engines: {node: '>=6.9.0'} + + '@babel/helper-plugin-utils@7.24.5': + resolution: {integrity: sha512-xjNLDopRzW2o6ba0gKbkZq5YWEBaK3PCyTOY1K2P/O07LGMhMqlMXPxwN4S5/RhWuCobT8z0jrlKGlYmeR1OhQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-replace-supers@7.24.1': + resolution: {integrity: sha512-QCR1UqC9BzG5vZl8BMicmZ28RuUBnHhAMddD8yHFHDRH9lLTZ9uUPehX8ctVPT8l0TKblJidqcgUUKGVrePleQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + + '@babel/helper-simple-access@7.24.5': + resolution: {integrity: sha512-uH3Hmf5q5n7n8mz7arjUlDOCbttY/DW4DYhE6FUsjKJ/oYC1kQQUvwEQWxRwUpX9qQKRXeqLwWxrqilMrf32sQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + resolution: {integrity: sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-split-export-declaration@7.24.5': + resolution: {integrity: sha512-5CHncttXohrHk8GWOFCcCl4oRD9fKosWlIRgWm4ql9VYioKm52Mk2xsmoohvm7f3JoiLSM5ZgJuRaf5QZZYd3Q==} + engines: {node: '>=6.9.0'} + + '@babel/helper-string-parser@7.24.1': + resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-identifier@7.24.5': + resolution: {integrity: sha512-3q93SSKX2TWCG30M2G2kwaKeTYgEUp5Snjuj8qm729SObL6nbtUldAi37qbxkD5gg3xnBio+f9nqpSepGZMvxA==} + engines: {node: '>=6.9.0'} + + '@babel/helper-validator-option@7.23.5': + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + + '@babel/helpers@7.24.5': + resolution: {integrity: sha512-CiQmBMMpMQHwM5m01YnrM6imUG1ebgYJ+fAIW4FZe6m4qHTPaRHti+R8cggAwkdz4oXhtO4/K9JWlh+8hIfR2Q==} + engines: {node: '>=6.9.0'} + + '@babel/highlight@7.24.5': + resolution: {integrity: sha512-8lLmua6AVh/8SLJRRVD6V8p73Hir9w5mJrhE+IPpILG31KKlI9iz5zmBYKcWPS59qSfgP9RaSBQSHHE81WKuEw==} + engines: {node: '>=6.9.0'} + + '@babel/parser@7.24.5': + resolution: {integrity: sha512-EOv5IK8arwh3LI47dz1b0tKUb/1uhHAnHJOrjgtQMIpu1uXd9mlFrJg9IUgGUgZ41Ch0K8REPTYpO7B76b4vJg==} + engines: {node: '>=6.0.0'} + hasBin: true + + '@babel/plugin-syntax-async-generators@7.8.4': + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-bigint@7.8.3': + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-class-properties@7.12.13': + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-decorators@7.24.1': + resolution: {integrity: sha512-05RJdO/cCrtVWuAaSn1tS3bH8jbsJa/Y1uD186u6J4C/1mnHFxseeuWpsqr9anvo7TUulev7tm7GDwRV+VuhDw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-import-meta@7.10.4': + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-json-strings@7.8.3': + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-jsx@7.24.1': + resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4': + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3': + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-numeric-separator@7.10.4': + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-object-rest-spread@7.8.3': + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3': + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-optional-chaining@7.8.3': + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-top-level-await@7.14.5': + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-syntax-typescript@7.24.1': + resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-modules-commonjs@7.24.1': + resolution: {integrity: sha512-szog8fFTUxBfw0b98gEWPaEqF42ZUD/T3bkynW/wtgx2p/XCP55WEsb+VosKceRSd6njipdZvNogqdtI4Q0chw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-self@7.24.5': + resolution: {integrity: sha512-RtCJoUO2oYrYwFPtR1/jkoBEcFuI1ae9a9IMxeyAVa3a1Ap4AnxmyIKG2b2FaJKqkidw/0cxRbWN+HOs6ZWd1w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-react-jsx-source@7.24.1': + resolution: {integrity: sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/plugin-transform-typescript@7.24.5': + resolution: {integrity: sha512-E0VWu/hk83BIFUWnsKZ4D81KXjN5L3MobvevOHErASk9IPwKHOkTgvqzvNo1yP/ePJWqqK2SpUR5z+KQbl6NVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/preset-typescript@7.24.1': + resolution: {integrity: sha512-1DBaMmRDpuYQBPWD8Pf/WEwCrtgRHxsZnP4mIy9G/X+hFfbI47Q2G4t1Paakld84+qsk2fSsUPMKg71jkoOOaQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + + '@babel/runtime@7.24.5': + resolution: {integrity: sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==} + engines: {node: '>=6.9.0'} + + '@babel/template@7.24.0': + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + + '@babel/traverse@7.24.5': + resolution: {integrity: sha512-7aaBLeDQ4zYcUFDUD41lJc1fG8+5IU9DaNSJAgal866FGvmD5EbWQgnEC6kO1gGLsX0esNkfnJSndbTXA3r7UA==} + engines: {node: '>=6.9.0'} + + '@babel/types@7.24.5': + resolution: {integrity: sha512-6mQNsaLeXTw0nxYUYu+NSa4Hx4BlF1x1x8/PMFbiR+GBSr+2DkECc69b8hgy2frEodNcvPffeH8YfWd3LI6jhQ==} + engines: {node: '>=6.9.0'} + + '@bcoe/v8-coverage@0.2.3': + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + + '@changesets/apply-release-plan@7.0.0': + resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==} + + '@changesets/assemble-release-plan@6.0.0': + resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==} + + '@changesets/changelog-git@0.2.0': + resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + + '@changesets/cli@2.27.1': + resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==} + hasBin: true + + '@changesets/config@3.0.0': + resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==} + + '@changesets/errors@0.2.0': + resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} + + '@changesets/get-dependents-graph@2.0.0': + resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==} + + '@changesets/get-release-plan@4.0.0': + resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==} + + '@changesets/get-version-range-type@0.4.0': + resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} + + '@changesets/git@3.0.0': + resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==} + + '@changesets/logger@0.1.0': + resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==} + + '@changesets/parse@0.4.0': + resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + + '@changesets/pre@2.0.0': + resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==} + + '@changesets/read@0.6.0': + resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==} + + '@changesets/types@4.1.0': + resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} + + '@changesets/types@6.0.0': + resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + + '@changesets/write@0.3.0': + resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==} + + '@cspotcode/source-map-support@0.8.1': + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + + '@emotion/hash@0.9.1': + resolution: {integrity: sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==} + + '@esbuild/aix-ppc64@0.19.12': + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/aix-ppc64@0.20.2': + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + + '@esbuild/android-arm64@0.17.6': + resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.19.12': + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm64@0.20.2': + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + + '@esbuild/android-arm@0.17.6': + resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.19.12': + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-arm@0.20.2': + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + + '@esbuild/android-x64@0.17.6': + resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.19.12': + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/android-x64@0.20.2': + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + + '@esbuild/darwin-arm64@0.17.6': + resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.19.12': + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-arm64@0.20.2': + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + + '@esbuild/darwin-x64@0.17.6': + resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.19.12': + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/darwin-x64@0.20.2': + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + + '@esbuild/freebsd-arm64@0.17.6': + resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.19.12': + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-arm64@0.20.2': + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.17.6': + resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.19.12': + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/freebsd-x64@0.20.2': + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + + '@esbuild/linux-arm64@0.17.6': + resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.19.12': + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm64@0.20.2': + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + + '@esbuild/linux-arm@0.17.6': + resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.19.12': + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-arm@0.20.2': + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + + '@esbuild/linux-ia32@0.17.6': + resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.19.12': + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-ia32@0.20.2': + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + + '@esbuild/linux-loong64@0.17.6': + resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.19.12': + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-loong64@0.20.2': + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + + '@esbuild/linux-mips64el@0.17.6': + resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.19.12': + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-mips64el@0.20.2': + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + + '@esbuild/linux-ppc64@0.17.6': + resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.19.12': + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-ppc64@0.20.2': + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + + '@esbuild/linux-riscv64@0.17.6': + resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.19.12': + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-riscv64@0.20.2': + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + + '@esbuild/linux-s390x@0.17.6': + resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.19.12': + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-s390x@0.20.2': + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + + '@esbuild/linux-x64@0.17.6': + resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.19.12': + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/linux-x64@0.20.2': + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + + '@esbuild/netbsd-x64@0.17.6': + resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.19.12': + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/netbsd-x64@0.20.2': + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + + '@esbuild/openbsd-x64@0.17.6': + resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.19.12': + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/openbsd-x64@0.20.2': + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + + '@esbuild/sunos-x64@0.17.6': + resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.19.12': + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/sunos-x64@0.20.2': + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + + '@esbuild/win32-arm64@0.17.6': + resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.19.12': + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-arm64@0.20.2': + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + + '@esbuild/win32-ia32@0.17.6': + resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.19.12': + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-ia32@0.20.2': + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + + '@esbuild/win32-x64@0.17.6': + resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.19.12': + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@esbuild/win32-x64@0.20.2': + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + + '@eslint-community/eslint-utils@4.4.0': + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + + '@eslint-community/regexpp@4.10.0': + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + + '@eslint/eslintrc@2.1.4': + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@eslint/eslintrc@3.0.2': + resolution: {integrity: sha512-wV19ZEGEMAC1eHgrS7UQPqsdEiCIbTKTasEfcXAigzoXICcqZSjBZEHlZwNVvKg6UBCjSlos84XiLqsRJnIcIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/js@9.2.0': + resolution: {integrity: sha512-ESiIudvhoYni+MdsI8oD7skpprZ89qKocwRM2KEvhhBJ9nl5MRh7BXU5GTod7Mdygq+AUl+QzId6iWJKR/wABA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@humanwhocodes/config-array@0.13.0': + resolution: {integrity: sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==} + engines: {node: '>=10.10.0'} + + '@humanwhocodes/module-importer@1.0.1': + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + + '@humanwhocodes/object-schema@2.0.3': + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + + '@humanwhocodes/retry@0.2.4': + resolution: {integrity: sha512-Ttl/jHpxfS3st5sxwICYfk4pOH0WrLI1SpW283GgQL7sCWU7EHIOhX4b4fkIxr3tkfzwg8+FNojtzsIEE7Ecgg==} + engines: {node: '>=18.18'} + + '@inquirer/figures@1.0.1': + resolution: {integrity: sha512-mtup3wVKia3ZwULPHcbs4Mor8Voi+iIXEWD7wCNbIO6lYR62oPCTQyrddi5OMYVXHzeCSoneZwJuS8sBvlEwDw==} + engines: {node: '>=18'} + + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@istanbuljs/load-nyc-config@1.1.0': + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + + '@istanbuljs/schema@0.1.3': + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + + '@jest/console@29.7.0': + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/core@29.7.0': + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/environment@29.7.0': + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect-utils@29.7.0': + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/expect@29.7.0': + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/fake-timers@29.7.0': + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/globals@29.7.0': + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/reporters@29.7.0': + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + '@jest/schemas@29.6.3': + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/source-map@29.6.3': + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-result@29.7.0': + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/test-sequencer@29.7.0': + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/transform@29.7.0': + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jest/types@29.6.3': + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + '@jridgewell/gen-mapping@0.3.5': + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + + '@jridgewell/resolve-uri@3.1.2': + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + + '@jridgewell/set-array@1.2.1': + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + + '@jridgewell/sourcemap-codec@1.4.15': + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + '@jridgewell/trace-mapping@0.3.25': + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + + '@jridgewell/trace-mapping@0.3.9': + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + + '@jspm/core@2.0.1': + resolution: {integrity: sha512-Lg3PnLp0QXpxwLIAuuJboLeRaIhrgJjeuh797QADg3xz8wGLugQOS5DpsE8A6i6Adgzf+bacllkKZG3J0tGfDw==} + + '@ljharb/through@2.3.13': + resolution: {integrity: sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==} + engines: {node: '>= 0.4'} + + '@manypkg/find-root@1.1.0': + resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==} + + '@manypkg/get-packages@1.1.3': + resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} + + '@mayank1513/fork-me@2.1.2': + resolution: {integrity: sha512-TrROXCVu72zrIjtnrIObxySB+/2ObGb6Lycmgp8Ku8OnJdlQl6ZCorbrMpvPCjw++b2ZBx1q9RkOZTtZAZE2ng==} + peerDependencies: + '@types/react': 16.8 - 18 + next: 10 - 14 + react: 16.8 - 18 + peerDependenciesMeta: + next: + optional: true + + '@mdx-js/mdx@2.3.0': + resolution: {integrity: sha512-jLuwRlz8DQfQNiUCJR50Y09CGPq3fLtmtUQfVrj79E0JWu3dvsVcxVIcfhR5h0iXu+/z++zDrYeiJqifRynJkA==} + + '@microsoft/tsdoc-config@0.16.2': + resolution: {integrity: sha512-OGiIzzoBLgWWR0UdRJX98oYO+XKGf7tiK4Zk6tQ/E4IJqGCe7dvkTvgDZV5cFJUzLGDOjeAXrnZoA6QkVySuxw==} + + '@microsoft/tsdoc@0.14.2': + resolution: {integrity: sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug==} + + '@next/env@14.2.3': + resolution: {integrity: sha512-W7fd7IbkfmeeY2gXrzJYDx8D2lWKbVoTIj1o1ScPHNzvp30s1AuoEFSdr39bC5sjxJaxTtq3OTCZboNp0lNWHA==} + + '@next/eslint-plugin-next@14.2.3': + resolution: {integrity: sha512-L3oDricIIjgj1AVnRdRor21gI7mShlSwU/1ZGHmqM3LzHhXXhdkrfeNY5zif25Bi5Dd7fiJHsbhoZCHfXYvlAw==} + + '@next/swc-darwin-arm64@14.2.3': + resolution: {integrity: sha512-3pEYo/RaGqPP0YzwnlmPN2puaF2WMLM3apt5jLW2fFdXD9+pqcoTzRk+iZsf8ta7+quAe4Q6Ms0nR0SFGFdS1A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@next/swc-darwin-x64@14.2.3': + resolution: {integrity: sha512-6adp7waE6P1TYFSXpY366xwsOnEXM+y1kgRpjSRVI2CBDOcbRjsJ67Z6EgKIqWIue52d2q/Mx8g9MszARj8IEA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@next/swc-linux-arm64-gnu@14.2.3': + resolution: {integrity: sha512-cuzCE/1G0ZSnTAHJPUT1rPgQx1w5tzSX7POXSLaS7w2nIUJUD+e25QoXD/hMfxbsT9rslEXugWypJMILBj/QsA==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-arm64-musl@14.2.3': + resolution: {integrity: sha512-0D4/oMM2Y9Ta3nGuCcQN8jjJjmDPYpHX9OJzqk42NZGJocU2MqhBq5tWkJrUQOQY9N+In9xOdymzapM09GeiZw==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@next/swc-linux-x64-gnu@14.2.3': + resolution: {integrity: sha512-ENPiNnBNDInBLyUU5ii8PMQh+4XLr4pG51tOp6aJ9xqFQ2iRI6IH0Ds2yJkAzNV1CfyagcyzPfROMViS2wOZ9w==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-linux-x64-musl@14.2.3': + resolution: {integrity: sha512-BTAbq0LnCbF5MtoM7I/9UeUu/8ZBY0i8SFjUMCbPDOLv+un67e2JgyN4pmgfXBwy/I+RHu8q+k+MCkDN6P9ViQ==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@next/swc-win32-arm64-msvc@14.2.3': + resolution: {integrity: sha512-AEHIw/dhAMLNFJFJIJIyOFDzrzI5bAjI9J26gbO5xhAKHYTZ9Or04BesFPXiAYXDNdrwTP2dQceYA4dL1geu8A==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@next/swc-win32-ia32-msvc@14.2.3': + resolution: {integrity: sha512-vga40n1q6aYb0CLrM+eEmisfKCR45ixQYXuBXxOOmmoV8sYST9k7E3US32FsY+CkkF7NtzdcebiFT4CHuMSyZw==} + engines: {node: '>= 10'} + cpu: [ia32] + os: [win32] + + '@next/swc-win32-x64-msvc@14.2.3': + resolution: {integrity: sha512-Q1/zm43RWynxrO7lW4ehciQVj+5ePBhOK+/K2P7pLFX3JaJ/IZVC69SHidrmZSOkqz7ECIOhhy7XhAFG4JYyHA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==} + + '@nodelib/fs.scandir@2.1.5': + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + + '@nodelib/fs.stat@2.0.5': + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + '@nodelib/fs.walk@1.2.8': + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + + '@npmcli/config@8.3.1': + resolution: {integrity: sha512-lEY3TnkVrNUwI0vCDTFlKTbxK9DxZ83JmXXcQI7kp7pyg7zj/a36xSDmcikXvUbtV2PQpmUwmV0HDAB94NcgNA==} + engines: {node: ^16.14.0 || >=18.0.0} + + '@npmcli/fs@3.1.1': + resolution: {integrity: sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/git@4.1.0': + resolution: {integrity: sha512-9hwoB3gStVfa0N31ymBmrX+GuDGdVA/QWShZVqE0HK2Af+7QGGrCTbZia/SW0ImUTjTne7SP91qxDmtXvDHRPQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/map-workspaces@3.0.6': + resolution: {integrity: sha512-tkYs0OYnzQm6iIRdfy+LcLBjcKuQCeE5YLb8KnrIlutJfheNaPvPpgoFEyEFgbjzl5PLZ3IA/BWAwRU0eHuQDA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/name-from-folder@2.0.0': + resolution: {integrity: sha512-pwK+BfEBZJbKdNYpHHRTNBwBoqrN/iIMO0AiGvYsp3Hoaq0WbgGSWQR6SCldZovoDpY3yje5lkFUe6gsDgJ2vg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/package-json@4.0.1': + resolution: {integrity: sha512-lRCEGdHZomFsURroh522YvA/2cVb9oPIJrjHanCJZkiasz1BzcnLr3tBJhlV7S86MBJBuAQ33is2D60YitZL2Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@npmcli/promise-spawn@6.0.2': + resolution: {integrity: sha512-gGq0NJkIGSwdbUt4yhdF8ZrmkGKVz9vAdVzpOfnom+V8PLSmSOVhZwbNvZZS1EYcJN5hzzKBxmmVVAInM6HQLg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + + '@pkgr/core@0.1.1': + resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==} + engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} + + '@remix-run/dev@2.9.1': + resolution: {integrity: sha512-/YhegnnRrarsqU+11+HdGwjcIT1KgkS9L7kWCM0+ivDvyiBYAuI6xbPG/q/FY6LqLAPYeOxsJmUNl+aj+yMltA==} + engines: {node: '>=18.0.0'} + hasBin: true + peerDependencies: + '@remix-run/react': ^2.9.1 + '@remix-run/serve': ^2.9.1 + typescript: ^5.1.0 + vite: ^5.1.0 + wrangler: ^3.28.2 + peerDependenciesMeta: + '@remix-run/serve': + optional: true + typescript: + optional: true + vite: + optional: true + wrangler: + optional: true + + '@remix-run/express@2.9.1': + resolution: {integrity: sha512-Q0U0oxINSk1t3HdvGnnHOa4M0iT9KlhBEN3JeCpc6BxIXovjceMUOOw0TTcgw8GmpXWaWO/p6vM/w4YZqb0KLg==} + engines: {node: '>=18.0.0'} + peerDependencies: + express: ^4.17.1 + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@remix-run/node@1.12.0': + resolution: {integrity: sha512-WiyRTEQKTUTf3Z3ke5DOwx+fjCkeD8ilI9kbRws1bG3xfdugaDrV9ra76DOZcrYlmVwjwtKE3mVDSRFtiYTTMw==} + engines: {node: '>=14'} + + '@remix-run/node@2.9.1': + resolution: {integrity: sha512-shicVsSmXepj4zotWHR2kLmyYCxQ25mHmfBL11ODIcIs7iSmQO+W7CNbmX1jcRvhHki/v+S/n4fMm0iKNeJ92w==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@remix-run/react@2.9.1': + resolution: {integrity: sha512-QQVZPS56okvDF3FBuGBjyKuYa6bXZvXFFlYeWfngI8ZnDbCzQLKV1oD0FWMhKuQxMaKs25uWg2YwGqwWTdin3w==} + engines: {node: '>=18.0.0'} + peerDependencies: + react: ^18.0.0 + react-dom: ^18.0.0 + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@remix-run/router@1.16.0': + resolution: {integrity: sha512-Quz1KOffeEf/zwkCBM3kBtH4ZoZ+pT3xIXBG4PPW/XFtDP7EGhtTiC2+gpL9GnR7+Qdet5Oa6cYSvwKYg6kN9Q==} + engines: {node: '>=14.0.0'} + + '@remix-run/router@1.3.1': + resolution: {integrity: sha512-+eun1Wtf72RNRSqgU7qM2AMX/oHp+dnx7BHk1qhK5ZHzdHTUU4LA1mGG1vT+jMc8sbhG3orvsfOmryjzx2PzQw==} + engines: {node: '>=14'} + + '@remix-run/serve@2.9.1': + resolution: {integrity: sha512-NtxfJqJFtBrSM+GjdBs+pqcbzZfeCVm0l67OUm+THHLHHFWsxndbqWX2nSSYacWNnGu+O2gNiBDzxyOE8/aElA==} + engines: {node: '>=18.0.0'} + hasBin: true + + '@remix-run/server-runtime@1.12.0': + resolution: {integrity: sha512-7I0165Ns/ffPfCEfuiqD58lMderTn2s/sew1xJ34ONa21mG/7+5T7diHIgxKST8rS3816JPmlwSqUaHgwbmO6Q==} + engines: {node: '>=14'} + + '@remix-run/server-runtime@2.9.1': + resolution: {integrity: sha512-6rRPiR+eMdTPkDojlYiZohVzXkD3+3X55ZvD78axMVocwGcDFFllpmgH9NSR2RKHW9eZDZUfKvNCwd/i9W6Xog==} + engines: {node: '>=18.0.0'} + peerDependencies: + typescript: ^5.1.0 + peerDependenciesMeta: + typescript: + optional: true + + '@remix-run/web-blob@3.1.0': + resolution: {integrity: sha512-owGzFLbqPH9PlKb8KvpNJ0NO74HWE2euAn61eEiyCXX/oteoVzTVSN8mpLgDjaxBf2btj5/nUllSUgpyd6IH6g==} + + '@remix-run/web-fetch@4.4.2': + resolution: {integrity: sha512-jgKfzA713/4kAW/oZ4bC3MoLWyjModOVDjFPNseVqcJKSafgIscrYL9G50SurEYLswPuoU3HzSbO0jQCMYWHhA==} + engines: {node: ^10.17 || >=12.3} + + '@remix-run/web-file@3.1.0': + resolution: {integrity: sha512-dW2MNGwoiEYhlspOAXFBasmLeYshyAyhIdrlXBi06Duex5tDr3ut2LFKVj7tyHLmn8nnNwFf1BjNbkQpygC2aQ==} + + '@remix-run/web-form-data@3.1.0': + resolution: {integrity: sha512-NdeohLMdrb+pHxMQ/Geuzdp0eqPbea+Ieo8M8Jx2lGC6TBHsgHzYcBvr0LyPdPVycNRDEpWpiDdCOdCryo3f9A==} + + '@remix-run/web-stream@1.1.0': + resolution: {integrity: sha512-KRJtwrjRV5Bb+pM7zxcTJkhIqWWSy+MYsIxHK+0m5atcznsf15YwUBWHWulZerV2+vvHH1Lp1DD7pw6qKW8SgA==} + + '@rollup/rollup-android-arm-eabi@4.17.2': + resolution: {integrity: sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==} + cpu: [arm] + os: [android] + + '@rollup/rollup-android-arm64@4.17.2': + resolution: {integrity: sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==} + cpu: [arm64] + os: [android] + + '@rollup/rollup-darwin-arm64@4.17.2': + resolution: {integrity: sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==} + cpu: [arm64] + os: [darwin] + + '@rollup/rollup-darwin-x64@4.17.2': + resolution: {integrity: sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==} + cpu: [x64] + os: [darwin] + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + resolution: {integrity: sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + resolution: {integrity: sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==} + cpu: [arm] + os: [linux] + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + resolution: {integrity: sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-arm64-musl@4.17.2': + resolution: {integrity: sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==} + cpu: [arm64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + resolution: {integrity: sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==} + cpu: [ppc64] + os: [linux] + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + resolution: {integrity: sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + resolution: {integrity: sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==} + cpu: [s390x] + os: [linux] + + '@rollup/rollup-linux-x64-gnu@4.17.2': + resolution: {integrity: sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-linux-x64-musl@4.17.2': + resolution: {integrity: sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==} + cpu: [x64] + os: [linux] + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + resolution: {integrity: sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==} + cpu: [arm64] + os: [win32] + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + resolution: {integrity: sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==} + cpu: [ia32] + os: [win32] + + '@rollup/rollup-win32-x64-msvc@4.17.2': + resolution: {integrity: sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==} + cpu: [x64] + os: [win32] + + '@rushstack/eslint-patch@1.10.2': + resolution: {integrity: sha512-hw437iINopmQuxWPSUEvqE56NCPsiU8N4AYtfHmJFckclktzK9YQJieD3XkDCDH4OjL+C7zgPUh73R/nrcHrqw==} + + '@sinclair/typebox@0.27.8': + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + + '@sinonjs/commons@3.0.1': + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + + '@sinonjs/fake-timers@10.3.0': + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + + '@storybook/csf@0.0.1': + resolution: {integrity: sha512-USTLkZze5gkel8MYCujSRBVIrUQ3YPBrLOx7GNk/0wttvVtlzWXAq9eLbQ4p/NicGxP+3T7KPEMVV//g+yubpw==} + + '@swc/counter@0.1.3': + resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} + + '@swc/helpers@0.5.5': + resolution: {integrity: sha512-KGYxvIOXcceOAbEk4bi/dVLEK9z8sZ0uBB3Il5b1rhfClSpcX0yfRO0KmTkqR2cnQDymwLB+25ZyMzICg/cm/A==} + + '@testing-library/dom@10.1.0': + resolution: {integrity: sha512-wdsYKy5zupPyLCW2Je5DLHSxSfbIp6h80WoHOQc+RPtmPGA52O9x5MJEkv92Sjonpq+poOAtUKhh1kBGAXBrNA==} + engines: {node: '>=18'} + + '@testing-library/react@15.0.7': + resolution: {integrity: sha512-cg0RvEdD1TIhhkm1IeYMQxrzy0MtUNfa3minv4MjbgcYzJAZ7yD0i0lwoPOTPr+INtiXFezt2o8xMSnyHhEn2Q==} + engines: {node: '>=18'} + peerDependencies: + '@types/react': ^18.0.0 + react: ^18.0.0 + react-dom: ^18.0.0 + peerDependenciesMeta: + '@types/react': + optional: true + + '@tootallnate/once@2.0.0': + resolution: {integrity: sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==} + engines: {node: '>= 10'} + + '@tsconfig/node10@1.0.11': + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + + '@tsconfig/node12@1.0.11': + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + + '@tsconfig/node14@1.0.3': + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + + '@tsconfig/node16@1.0.4': + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + + '@types/acorn@4.0.6': + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + + '@types/aria-query@5.0.4': + resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} + + '@types/babel__core@7.20.5': + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + + '@types/babel__generator@7.6.8': + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + + '@types/babel__template@7.4.4': + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + + '@types/babel__traverse@7.20.5': + resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==} + + '@types/body-parser@1.19.5': + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + + '@types/concat-stream@2.0.3': + resolution: {integrity: sha512-3qe4oQAPNwVNwK4C9c8u+VJqv9kez+2MR4qJpoPFfXtgxxif1QbFusvXzK0/Wra2VX07smostI2VMmJNSpZjuQ==} + + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + + '@types/cookie@0.4.1': + resolution: {integrity: sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==} + + '@types/cookie@0.6.0': + resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} + + '@types/cookiejar@2.1.5': + resolution: {integrity: sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==} + + '@types/cors@2.8.17': + resolution: {integrity: sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==} + + '@types/debug@4.1.12': + resolution: {integrity: sha512-vIChWdVG3LG1SMxEvI/AK+FWJthlrqlTu7fbrlywTkkaONwk/UAGaULXRlf8vkzFBLVm0zkMdCquhL5aOjhXPQ==} + + '@types/estree-jsx@1.0.5': + resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==} + + '@types/estree@1.0.5': + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + + '@types/express-serve-static-core@4.19.0': + resolution: {integrity: sha512-bGyep3JqPCRry1wq+O5n7oiBgGWmeIJXPjXXCo8EK0u8duZGSYar7cGqd3ML2JUsLGeB7fmc06KYo9fLGWqPvQ==} + + '@types/express@4.17.21': + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + + '@types/fined@1.1.5': + resolution: {integrity: sha512-2N93vadEGDFhASTIRbizbl4bNqpMOId5zZfj6hHqYZfEzEfO9onnU4Im8xvzo8uudySDveDHBOOSlTWf38ErfQ==} + + '@types/graceful-fs@4.1.9': + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + + '@types/hast@2.3.10': + resolution: {integrity: sha512-McWspRw8xx8J9HurkVBfYj0xKoE25tOFlHGdx4MJ5xORQrMGZNqJhVQWaIbm6Oyla5kYOXtDiopzKRJzEOkwJw==} + + '@types/hast@3.0.4': + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + + '@types/http-errors@2.0.4': + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + + '@types/inquirer@9.0.7': + resolution: {integrity: sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==} + + '@types/is-empty@1.2.3': + resolution: {integrity: sha512-4J1l5d79hoIvsrKh5VUKVRA1aIdsOb10Hu5j3J2VfP/msDnfTdGPmNp2E1Wg+vs97Bktzo+MZePFFXSGoykYJw==} + + '@types/istanbul-lib-coverage@2.0.6': + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + + '@types/istanbul-lib-report@3.0.3': + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + + '@types/istanbul-reports@3.0.4': + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + + '@types/jest@29.5.12': + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + + '@types/jsdom@20.0.1': + resolution: {integrity: sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==} + + '@types/json-schema@7.0.15': + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + + '@types/json5@0.0.29': + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + '@types/liftoff@4.0.3': + resolution: {integrity: sha512-UgbL2kR5pLrWICvr8+fuSg0u43LY250q7ZMkC+XKC3E+rs/YBDEnQIzsnhU5dYsLlwMi3R75UvCL87pObP1sxw==} + + '@types/mdast@3.0.15': + resolution: {integrity: sha512-LnwD+mUEfxWMa1QpDraczIn6k0Ee3SMicuYSSzS6ZYl2gKS09EClnJYGd8Du6rfc5r/GZEk5o1mRb8TaTj03sQ==} + + '@types/mdast@4.0.3': + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + + '@types/mdx@2.0.13': + resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==} + + '@types/methods@1.1.4': + resolution: {integrity: sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==} + + '@types/mime@1.3.5': + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + + '@types/minimist@1.2.5': + resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==} + + '@types/morgan@1.9.9': + resolution: {integrity: sha512-iRYSDKVaC6FkGSpEVVIvrRGw0DfJMiQzIn3qr2G5B3C//AWkulhXgaBd7tS9/J79GWSYMTHGs7PfI5b3Y8m+RQ==} + + '@types/ms@0.7.34': + resolution: {integrity: sha512-nG96G3Wp6acyAgJqGasjODb+acrI7KltPiRxzHPXnP3NgI28bpQDRv53olbqGXbfcgF5aiiHmO3xpwEpS5Ld9g==} + + '@types/node@12.20.55': + resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==} + + '@types/node@20.12.10': + resolution: {integrity: sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==} + + '@types/normalize-package-data@2.4.4': + resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} + + '@types/prismjs@1.26.4': + resolution: {integrity: sha512-rlAnzkW2sZOjbqZ743IHUhFcvzaGbqijwOu8QZnZCjfQzBqFE3s4lOTJEsxikImav9uzz/42I+O7YUs1mWgMlg==} + + '@types/prop-types@15.7.12': + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + + '@types/qs@6.9.15': + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + + '@types/range-parser@1.2.7': + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + + '@types/react-dom@18.3.0': + resolution: {integrity: sha512-EhwApuTmMBmXuFOikhQLIBUn6uFg81SwLMOAUgodJF14SOBOCMdU04gDoYi0WOJJHD144TL32z4yDqCW3dnkQg==} + + '@types/react@18.3.1': + resolution: {integrity: sha512-V0kuGBX3+prX+DQ/7r2qsv1NsdfnCLnTgnRJ1pYnxykBhGMz+qj+box5lq7XsO5mtZsBqpjwwTu/7wszPfMBcw==} + + '@types/semver@7.5.8': + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + + '@types/send@0.17.4': + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + + '@types/serve-static@1.15.7': + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + + '@types/stack-utils@2.0.3': + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + + '@types/superagent@8.1.7': + resolution: {integrity: sha512-NmIsd0Yj4DDhftfWvvAku482PZum4DBW7U51OvS8gvOkDDY0WT1jsVyDV3hK+vplrsYw8oDwi9QxOM7U68iwww==} + + '@types/supertest@6.0.2': + resolution: {integrity: sha512-137ypx2lk/wTQbW6An6safu9hXmajAifU/s7szAHLN/FeIm5w7yR0Wkl9fdJMRSHwOn4HLAI0DaB2TOORuhPDg==} + + '@types/supports-color@8.1.3': + resolution: {integrity: sha512-Hy6UMpxhE3j1tLpl27exp1XqHD7n8chAiNPzWfz16LPZoMMoSc4dzLl6w9qijkEb/r5O1ozdu1CWGA2L83ZeZg==} + + '@types/through@0.0.33': + resolution: {integrity: sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==} + + '@types/tough-cookie@4.0.5': + resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==} + + '@types/unist@2.0.10': + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + '@types/unist@3.0.2': + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + '@types/yargs-parser@21.0.3': + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + + '@types/yargs@17.0.32': + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + + '@typescript-eslint/eslint-plugin@7.8.0': + resolution: {integrity: sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + '@typescript-eslint/parser': ^7.0.0 + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/parser@7.8.0': + resolution: {integrity: sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/scope-manager@5.62.0': + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/scope-manager@7.8.0': + resolution: {integrity: sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/type-utils@7.8.0': + resolution: {integrity: sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/types@5.62.0': + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/types@7.8.0': + resolution: {integrity: sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@typescript-eslint/typescript-estree@5.62.0': + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/typescript-estree@7.8.0': + resolution: {integrity: sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + + '@typescript-eslint/utils@5.62.0': + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + '@typescript-eslint/utils@7.8.0': + resolution: {integrity: sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==} + engines: {node: ^18.18.0 || >=20.0.0} + peerDependencies: + eslint: ^8.56.0 + + '@typescript-eslint/visitor-keys@5.62.0': + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + '@typescript-eslint/visitor-keys@7.8.0': + resolution: {integrity: sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==} + engines: {node: ^18.18.0 || >=20.0.0} + + '@vanilla-extract/babel-plugin-debug-ids@1.0.5': + resolution: {integrity: sha512-Rc9A6ylsw7EBErmpgqCMvc/Z/eEZxI5k1xfLQHw7f5HHh3oc5YfzsAsYU/PdmSNjF1dp3sGEViBdDltvwnfVaA==} + + '@vanilla-extract/css@1.15.1': + resolution: {integrity: sha512-puAfTKAUtsMr2+D+grQNjU5umsdw9zdVgQflUlbzS/tGORaAHdgaYz7jfKPmz1c4ZcpJ6uFNOiI50NDOAzzhyg==} + + '@vanilla-extract/integration@6.5.0': + resolution: {integrity: sha512-E2YcfO8vA+vs+ua+gpvy1HRqvgWbI+MTlUpxA8FvatOvybuNcWAY0CKwQ/Gpj7rswYKtC6C7+xw33emM6/ImdQ==} + + '@vanilla-extract/private@1.0.4': + resolution: {integrity: sha512-8FGD6AejeC/nXcblgNCM5rnZb9KXa4WNkR03HCWtdJBpANjTgjHEglNLFnhuvdQ78tC6afaxBPI+g7F2NX3tgg==} + + '@vercel/analytics@1.2.2': + resolution: {integrity: sha512-X0rctVWkQV1e5Y300ehVNqpOfSOufo7ieA5PIdna8yX/U7Vjz0GFsGf4qvAhxV02uQ2CVt7GYcrFfddXXK2Y4A==} + peerDependencies: + next: '>= 13' + react: ^18 || ^19 + peerDependenciesMeta: + next: + optional: true + react: + optional: true + + '@vercel/remix-entry-server@0.1.1': + resolution: {integrity: sha512-rFBfdsWIb1AYQkynRwY/O5Vv9DjNf24vL7n4oc5E3FuiO5p/6Ire9+9ZgrwM3rZjKZGdWkn2xkDu370TYcWmfg==} + peerDependencies: + react: ^18.0.0 + + '@vercel/style-guide@6.0.0': + resolution: {integrity: sha512-tu0wFINGz91EPwaT5VjSqUwbvCY9pvLach7SPG4XyfJKPU9Vku2TFa6+AyzJ4oroGbo9fK+TQhIFHrnFl0nCdg==} + engines: {node: '>=18.18'} + peerDependencies: + '@next/eslint-plugin-next': '>=12.3.0 <15.0.0-0' + eslint: '>=8.48.0 <9' + prettier: '>=3.0.0 <4' + typescript: '>=4.8.0 <6' + peerDependenciesMeta: + '@next/eslint-plugin-next': + optional: true + eslint: + optional: true + prettier: + optional: true + typescript: + optional: true + + '@vitejs/plugin-react@4.2.1': + resolution: {integrity: sha512-oojO9IDc4nCUUi8qIR11KoQm0XFFLIwsRBwHRR4d/88IWghn1y6ckz/bJ8GHDCsYEJee8mDzqtJxh15/cisJNQ==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + vite: ^4.2.0 || ^5.0.0 + + '@vitest/coverage-v8@1.6.0': + resolution: {integrity: sha512-KvapcbMY/8GYIG0rlwwOKCVNRc0OL20rrhFkg/CHNzncV03TE2XWvO5w9uZYoxNiMEBacAJt3unSOiZ7svePew==} + peerDependencies: + vitest: 1.6.0 + + '@vitest/expect@1.6.0': + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + + '@vitest/runner@1.6.0': + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + + '@vitest/snapshot@1.6.0': + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + + '@vitest/spy@1.6.0': + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + + '@vitest/utils@1.6.0': + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + + '@web3-storage/multipart-parser@1.0.0': + resolution: {integrity: sha512-BEO6al7BYqcnfX15W2cnGR+Q566ACXAT9UQykORCWW80lmkpWsnEob6zJS1ZVBKsSJC8+7vJkHwlp+lXG1UCdw==} + + '@zxing/text-encoding@0.9.0': + resolution: {integrity: sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==} + + abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + + accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + + acorn-globals@7.0.1: + resolution: {integrity: sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==} + + acorn-jsx@5.3.2: + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + + acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + + acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + + agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + + aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + + aggregate-error@4.0.1: + resolution: {integrity: sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==} + engines: {node: '>=12'} + + ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + + ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + + ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + ansi-sequence-parser@1.1.1: + resolution: {integrity: sha512-vJXt3yiaUL4UU546s3rPXlsry/RnM730G1+HkpKE012AN0sx1eOrxSu95oKDIonskeLTijMgqWZ3uDEe3NFvyg==} + + ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + + ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + + ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + + arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + + arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + + argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + + argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + + array-buffer-byte-length@1.0.1: + resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==} + engines: {node: '>= 0.4'} + + array-each@1.0.1: + resolution: {integrity: sha512-zHjL5SZa68hkKHBFBK6DJCTtr9sfTCPCaph/L7tMSLcTFgy+zX7E+6q5UArbtOtMBCtxdICpfTCspRse+ywyXA==} + engines: {node: '>=0.10.0'} + + array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + array-includes@3.1.8: + resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==} + engines: {node: '>= 0.4'} + + array-slice@1.1.0: + resolution: {integrity: sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==} + engines: {node: '>=0.10.0'} + + array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + array.prototype.findlast@1.2.5: + resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==} + engines: {node: '>= 0.4'} + + array.prototype.findlastindex@1.2.5: + resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==} + engines: {node: '>= 0.4'} + + array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + + array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + + array.prototype.toreversed@1.1.2: + resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==} + + array.prototype.tosorted@1.1.3: + resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==} + + arraybuffer.prototype.slice@1.0.3: + resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==} + engines: {node: '>= 0.4'} + + arrify@1.0.1: + resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==} + engines: {node: '>=0.10.0'} + + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + + ast-types-flow@0.0.8: + resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==} + + astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + + asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + autoprefixer@10.4.19: + resolution: {integrity: sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + + available-typed-arrays@1.0.7: + resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==} + engines: {node: '>= 0.4'} + + axe-core@4.7.0: + resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==} + engines: {node: '>=4'} + + axobject-query@3.2.1: + resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==} + + babel-jest@29.7.0: + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + + babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + + babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + babel-preset-current-node-syntax@1.0.1: + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + + babel-preset-jest@29.6.3: + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + + bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + + balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + + better-path-resolve@1.0.0: + resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} + engines: {node: '>=4'} + + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + + body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + + brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + + braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + + breakword@1.0.6: + resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==} + + browserify-zlib@0.1.4: + resolution: {integrity: sha512-19OEpq7vWgsH6WkvkBJQDFvJS1uPcbFOQ4v9CU839dO+ZZXUZO6XpE6hNCqvlIIj+4fZvRiJ6DsAQ382GwiyTQ==} + + browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + + bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + + bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + + buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + + builtin-modules@3.3.0: + resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} + engines: {node: '>=6'} + + bundle-require@4.1.0: + resolution: {integrity: sha512-FeArRFM+ziGkRViKRnSTbHZc35dgmR9yNog05Kn0+ItI59pOAISGvnnIwW1WgFZQW59IxD9QpJnUPkdIPfZuXg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + esbuild: '>=0.17' + + busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + + bytes@3.0.0: + resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==} + engines: {node: '>= 0.8'} + + bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + + cacache@17.1.4: + resolution: {integrity: sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + call-bind@1.0.7: + resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==} + engines: {node: '>= 0.4'} + + callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + + camelcase-keys@6.2.2: + resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==} + engines: {node: '>=8'} + + camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + + camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + + camelcase@8.0.0: + resolution: {integrity: sha512-8WB3Jcas3swSvjIeA2yvCJ+Miyz5l1ZmB6HFb9R1317dt9LCQoswg/BGrmAmkWVEszSrrg4RwmO46qIm2OEnSA==} + engines: {node: '>=16'} + + caniuse-lite@1.0.30001616: + resolution: {integrity: sha512-RHVYKov7IcdNjVHJFNY/78RdG4oGVjbayxv8u5IO74Wv7Hlq4PnJE6mo/OjFijjVFNy5ijnCt6H3IIo4t+wfEw==} + + capital-case@1.0.4: + resolution: {integrity: sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==} + + ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + + chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + + chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + + chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + + chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + + change-case@4.1.2: + resolution: {integrity: sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==} + + char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + + character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + character-entities-legacy@1.1.4: + resolution: {integrity: sha512-3Xnr+7ZFS1uxeiUDvV02wQ+QDbc55o97tIV5zHScSPJpcLm/r0DFPcoY3tYRp+VZukxuMeKgXYmsXQHO05zQeA==} + + character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + character-entities@1.2.4: + resolution: {integrity: sha512-iBMyeEHxfVnIakwOuDXpVkc54HijNgCyQB2w0VfGQThle6NXn50zU6V/u+LDhxHcDUPojn6Kpga3PTAD8W1bQw==} + + character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + character-reference-invalid@1.1.4: + resolution: {integrity: sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==} + + character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + + chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + + ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + + ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + + cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + + clean-regexp@1.0.0: + resolution: {integrity: sha512-GfisEZEJvzKrmGWkvfhgzcz/BllN1USeqD2V6tg14OAOgaCD2Z/PUEuxnAZ/nPvmaHRG7a8y77p1T/IRQ4D1Hw==} + engines: {node: '>=4'} + + clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + + clean-stack@4.2.0: + resolution: {integrity: sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==} + engines: {node: '>=12'} + + cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + + cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + + cli-width@4.1.0: + resolution: {integrity: sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==} + engines: {node: '>= 12'} + + client-only@0.0.1: + resolution: {integrity: sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==} + + cliui@6.0.0: + resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} + + cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + + clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + + co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + + color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + + color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + + color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + + comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + + commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + component-emitter@1.3.1: + resolution: {integrity: sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==} + + compressible@2.0.18: + resolution: {integrity: sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==} + engines: {node: '>= 0.6'} + + compression@1.7.4: + resolution: {integrity: sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==} + engines: {node: '>= 0.8.0'} + + concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + concat-stream@2.0.0: + resolution: {integrity: sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==} + engines: {'0': node >= 6.0} + + confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + + constant-case@3.0.4: + resolution: {integrity: sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==} + + content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + + content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + + cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + cookie-signature@1.2.1: + resolution: {integrity: sha512-78KWk9T26NhzXtuL26cIJ8/qNHANyJ/ZYrmEXFzUmhZdjpBv+DlWlOANRTGBt48YcyslsLrj0bMLFTmXvLRCOw==} + engines: {node: '>=6.6.0'} + + cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + + core-js-compat@3.37.0: + resolution: {integrity: sha512-vYq4L+T8aS5UuFg4UwDhc7YNRWVeVZwltad9C/jV3R2LgVOpS9BDr7l/WL6BN0dbV3k1XejPTHqqEzJgsa0frA==} + + core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + + create-jest@29.7.0: + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + + create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + + cross-spawn@5.1.0: + resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} + + cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + + css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + + cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + + cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + + cssom@0.5.0: + resolution: {integrity: sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==} + + cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + + cssstyle@4.0.1: + resolution: {integrity: sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==} + engines: {node: '>=18'} + + csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + + csv-generate@3.4.3: + resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==} + + csv-parse@4.16.3: + resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==} + + csv-stringify@5.6.5: + resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==} + + csv@5.5.3: + resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==} + engines: {node: '>= 0.1.90'} + + damerau-levenshtein@1.0.8: + resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==} + + data-uri-to-buffer@3.0.1: + resolution: {integrity: sha512-WboRycPNsVw3B3TL559F7kuBUM4d8CgMEvk6xEJlOp7OBPjt6G7z8WMWlD2rOFZLk6OYfFIUGsCOWzcQH9K2og==} + engines: {node: '>= 6'} + + data-urls@3.0.2: + resolution: {integrity: sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==} + engines: {node: '>=12'} + + data-urls@5.0.0: + resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==} + engines: {node: '>=18'} + + data-view-buffer@1.0.1: + resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==} + engines: {node: '>= 0.4'} + + data-view-byte-length@1.0.1: + resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==} + engines: {node: '>= 0.4'} + + data-view-byte-offset@1.0.0: + resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==} + engines: {node: '>= 0.4'} + + debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + + decamelize-keys@1.1.1: + resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==} + engines: {node: '>=0.10.0'} + + decamelize@1.2.0: + resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==} + engines: {node: '>=0.10.0'} + + decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + + decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + + dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + + deep-eql@4.1.3: + resolution: {integrity: sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==} + engines: {node: '>=6'} + + deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + + deep-object-diff@1.1.9: + resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} + + deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + + define-data-property@1.1.4: + resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==} + engines: {node: '>= 0.4'} + + define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + + del@7.1.0: + resolution: {integrity: sha512-v2KyNk7efxhlyHpjEvfyxaAihKKK0nWCuf6ZtqZcFFpQRG0bJ12Qsr0RpvsICMjAAZ8DOVCxrlqpxISlMHC4Kg==} + engines: {node: '>=14.16'} + + delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + detect-file@1.0.0: + resolution: {integrity: sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==} + engines: {node: '>=0.10.0'} + + detect-indent@6.1.0: + resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} + engines: {node: '>=8'} + + detect-indent@7.0.1: + resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} + engines: {node: '>=12.20'} + + detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + + detect-newline@4.0.1: + resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + + dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + + diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + + diff@5.2.0: + resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} + engines: {node: '>=0.3.1'} + + dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + + doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + + dom-accessibility-api@0.5.16: + resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==} + + domexception@4.0.0: + resolution: {integrity: sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==} + engines: {node: '>=12'} + deprecated: Use your platform's native DOMException instead + + dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + + dotenv@16.0.3: + resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} + engines: {node: '>=12'} + + dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + + duplexify@3.7.1: + resolution: {integrity: sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==} + + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + electron-to-chromium@1.4.758: + resolution: {integrity: sha512-/o9x6TCdrYZBMdGeTifAP3wlF/gVT+TtWJe3BSmtNh92Mw81U9hrYwW9OAGUh+sEOX/yz5e34sksqRruZbjYrw==} + + emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + + emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + + enhanced-resolve@5.16.1: + resolution: {integrity: sha512-4U5pNsuDl0EhuZpq46M5xPslstkviJuhrdobaRDBk2Jy2KO37FDAJl4lb2KlNabxT0m4MTK2UHNrsAcphE8nyw==} + engines: {node: '>=10.13.0'} + + enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + + entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + + err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + + error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + + es-abstract@1.23.3: + resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==} + engines: {node: '>= 0.4'} + + es-define-property@1.0.0: + resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==} + engines: {node: '>= 0.4'} + + es-errors@1.3.0: + resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} + engines: {node: '>= 0.4'} + + es-iterator-helpers@1.0.19: + resolution: {integrity: sha512-zoMwbCcH5hwUkKJkT8kDIBZSz9I6mVG//+lDCinLCGov4+r7NIy0ld8o03M0cJxl2spVf6ESYVS6/gpIfq1FFw==} + engines: {node: '>= 0.4'} + + es-module-lexer@1.5.2: + resolution: {integrity: sha512-l60ETUTmLqbVbVHv1J4/qj+M8nq7AwMzEcg3kmJDt9dCNrTk+yHcYFf/Kw75pMDwd9mPcIGCG5LcS20SxYRzFA==} + + es-object-atoms@1.0.0: + resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==} + engines: {node: '>= 0.4'} + + es-set-tostringtag@2.0.3: + resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==} + engines: {node: '>= 0.4'} + + es-shim-unscopables@1.0.2: + resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==} + + es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + + esbuild-plugin-react18-css@0.0.4: + resolution: {integrity: sha512-dg/6DB8c0ODubeahYa/4rWO5lk/Bn22lRD6n3+1ZFOvNU4d+Q/gGMiRq01ndrX7p70QYEnrjYmV8p59zrjTtIg==} + + esbuild-plugin-react18@0.1.5: + resolution: {integrity: sha512-naueaYqB+DQ89yP19NNSEDSshXvmGFHZHet7gDxyLACAue50V2yHTds3nUkSP+xb75o1qmKeUGQdVFJig8x6LA==} + + esbuild-plugins-node-modules-polyfill@1.6.3: + resolution: {integrity: sha512-nydQGT3RijD8mBd3Hek+2gSAxndgceZU9GIjYYiqU+7CE7veN8utTmupf0frcKpwIXCXWpRofL9CY9k0yU70CA==} + engines: {node: '>=14.0.0'} + peerDependencies: + esbuild: ^0.14.0 || ^0.15.0 || ^0.16.0 || ^0.17.0 || ^0.18.0 || ^0.19.0 || ^0.20.0 + + esbuild@0.17.6: + resolution: {integrity: sha512-TKFRp9TxrJDdRWfSsSERKEovm6v30iHnrjlcGhLBOtReE28Yp1VSBRfO3GTaOFMoxsNerx4TjrhzSuma9ha83Q==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + + esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + + escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + + escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + + escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + + eslint-config-prettier@9.1.0: + resolution: {integrity: sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + + eslint-config-turbo@1.13.3: + resolution: {integrity: sha512-if/QtwEiWZ5b7Bg8yZBPSvS0TeCG2Zvfa/+XBYANS7uSYucjmW+BBC8enJB0PqpB/YLGGOumeo3x7h1Nuba9iw==} + peerDependencies: + eslint: '>6.6.0' + + eslint-import-resolver-alias@1.1.2: + resolution: {integrity: sha512-WdviM1Eu834zsfjHtcGHtGfcu+F30Od3V7I9Fi57uhBEwPkjDcii7/yW8jAT+gOhn4P/vOxxNAXbFAKsrrc15w==} + engines: {node: '>= 4'} + peerDependencies: + eslint-plugin-import: '>=1.4.0' + + eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + + eslint-import-resolver-typescript@3.6.1: + resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==} + engines: {node: ^14.18.0 || >=16.0.0} + peerDependencies: + eslint: '*' + eslint-plugin-import: '*' + + eslint-mdx@3.1.5: + resolution: {integrity: sha512-ynztX0k7CQ3iDL7fDEIeg3g0O/d6QPv7IBI9fdYLhXp5fAp0fi8X22xF/D3+Pk0f90R27uwqa1clHpay6t0l8Q==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.0.0' + + eslint-module-utils@2.8.1: + resolution: {integrity: sha512-rXDXR3h7cs7dy9RNpUlQf80nX31XWJEyGq1tRMo+6GsO5VmTe4UTwtmonAD4ZkAsrfMVDA2wlGJ3790Ys+D49Q==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + + eslint-plugin-eslint-comments@3.2.0: + resolution: {integrity: sha512-0jkOl0hfojIHHmEHgmNdqv4fmh7300NdpA9FFpF7zaoLvB/QeXOGNLIo86oAveJFrfB1p05kC8hpEMHM8DwWVQ==} + engines: {node: '>=6.5.0'} + peerDependencies: + eslint: '>=4.19.1' + + eslint-plugin-import@2.29.1: + resolution: {integrity: sha512-BbPC0cuExzhiMo4Ff1BTVwHpjjv28C5R+btTOGaCRC7UEz801up0JadwkeSk5Ued6TG34uaczuVuH6qyy5YUxw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + + eslint-plugin-jest@27.9.0: + resolution: {integrity: sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 || ^6.0.0 || ^7.0.0 + eslint: ^7.0.0 || ^8.0.0 + jest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + jest: + optional: true + + eslint-plugin-jsx-a11y@6.8.0: + resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==} + engines: {node: '>=4.0'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-markdown@3.0.1: + resolution: {integrity: sha512-8rqoc148DWdGdmYF6WSQFT3uQ6PO7zXYgeBpHAOAakX/zpq+NvFYbDA/H7PYzHajwtmaOzAwfxyl++x0g1/N9A==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + + eslint-plugin-mdx@3.1.5: + resolution: {integrity: sha512-lUE7tP7IrIRHU3gTtASDe5u4YM2SvQveYVJfuo82yn3MLh/B/v05FNySURCK4aIxIYF1QYo3IRemQG/lyQzpAg==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: '>=8.0.0' + + eslint-plugin-only-warn@1.1.0: + resolution: {integrity: sha512-2tktqUAT+Q3hCAU0iSf4xAN1k9zOpjK5WO8104mB0rT/dGhOa09582HN5HlbxNbPRZ0THV7nLGvzugcNOSjzfA==} + engines: {node: '>=6'} + + eslint-plugin-playwright@1.6.0: + resolution: {integrity: sha512-tI1E/EDbHT4Fx5KvukUG3RTIT0gk44gvTP8bNwxLCFsUXVM98ZJG5zWU6Om5JOzH9FrmN4AhMu/UKyEsu0ZoDA==} + engines: {node: '>=16.6.0'} + peerDependencies: + eslint: '>=8.40.0' + eslint-plugin-jest: '>=25' + peerDependenciesMeta: + eslint-plugin-jest: + optional: true + + eslint-plugin-react-hooks@4.6.2: + resolution: {integrity: sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==} + engines: {node: '>=10'} + peerDependencies: + eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 + + eslint-plugin-react@7.34.1: + resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==} + engines: {node: '>=4'} + peerDependencies: + eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 + + eslint-plugin-storybook@0.8.0: + resolution: {integrity: sha512-CZeVO5EzmPY7qghO2t64oaFM+8FTaD4uzOEjHKp516exyTKo+skKAL9GI3QALS2BXhyALJjNtwbmr1XinGE8bA==} + engines: {node: '>= 18'} + peerDependencies: + eslint: '>=6' + + eslint-plugin-testing-library@6.2.2: + resolution: {integrity: sha512-1E94YOTUDnOjSLyvOwmbVDzQi/WkKm3WVrMXu6SmBr6DN95xTGZmI6HJ/eOkSXh/DlheRsxaPsJvZByDBhWLVQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'} + peerDependencies: + eslint: ^7.5.0 || ^8.0.0 + + eslint-plugin-tsdoc@0.2.17: + resolution: {integrity: sha512-xRmVi7Zx44lOBuYqG8vzTXuL6IdGOeF9nHX17bjJ8+VE6fsxpdGem0/SBTmAwgYMKYB1WBkqRJVQ+n8GK041pA==} + + eslint-plugin-turbo@1.13.3: + resolution: {integrity: sha512-RjmlnqYsEqnJ+U3M3IS5jLJDjWv5NsvReCpsC61n5pJ4JMHTZ/lU0EIoL1ccuL1L5wP0APzdXdByBxERcPQ+Nw==} + peerDependencies: + eslint: '>6.6.0' + + eslint-plugin-unicorn@51.0.1: + resolution: {integrity: sha512-MuR/+9VuB0fydoI0nIn2RDA5WISRn4AsJyNSaNKLVwie9/ONvQhxOBbkfSICBPnzKrB77Fh6CZZXjgTt/4Latw==} + engines: {node: '>=16'} + peerDependencies: + eslint: '>=8.56.0' + + eslint-plugin-vitest@0.3.26: + resolution: {integrity: sha512-oxe5JSPgRjco8caVLTh7Ti8PxpwJdhSV0hTQAmkFcNcmy/9DnqLB/oNVRA11RmVRP//2+jIIT6JuBEcpW3obYg==} + engines: {node: ^18.0.0 || >= 20.0.0} + peerDependencies: + '@typescript-eslint/eslint-plugin': '*' + eslint: '>=8.0.0' + vitest: '*' + peerDependenciesMeta: + '@typescript-eslint/eslint-plugin': + optional: true + vitest: + optional: true + + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + + eslint-scope@8.0.1: + resolution: {integrity: sha512-pL8XjgP4ZOmmwfFE8mEhSxA7ZY4C+LWyqjQ3o4yWkkmD0qcMT9kkW3zWHOczhWcjTSgqycYAgwSlXvZltv65og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint-visitor-keys@2.1.0: + resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==} + engines: {node: '>=10'} + + eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + eslint-visitor-keys@4.0.0: + resolution: {integrity: sha512-OtIRv/2GyiF6o/d8K7MYKKbXrOUBIK6SfkIRM4Z0dY3w+LiQ0vy3F57m0Z71bjbyeiWFiHJ8brqnmE6H6/jEuw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.2.0: + resolution: {integrity: sha512-0n/I88vZpCOzO+PQpt0lbsqmn9AsnsJAQseIqhZFI8ibQT0U1AkEKRxA3EVMos0BoHSXDQvCXY25TUjB5tr8Og==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + hasBin: true + + espree@10.0.1: + resolution: {integrity: sha512-MWkrWZbJsL2UwnjxTX3gG8FneachS/Mwg7tdGXce011sJd5b0JG54vat5KHnfSBODZ3Wvzd2WnjxyzsRoVv+ww==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + + esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + + esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + estree-util-attach-comments@2.1.1: + resolution: {integrity: sha512-+5Ba/xGGS6mnwFbXIuQiDPTbuTxuMCooq3arVv7gPZtYpjp+VXH/NkHAP35OOefPhNG/UGqU3vt/LTABwcHX0w==} + + estree-util-build-jsx@2.2.2: + resolution: {integrity: sha512-m56vOXcOBuaF+Igpb9OPAy7f9w9OIkb5yhjsZuaPm7HoGi4oTOQi0h2+yZ+AtKklYFZ+rPC4n0wYCJCEU1ONqg==} + + estree-util-is-identifier-name@1.1.0: + resolution: {integrity: sha512-OVJZ3fGGt9By77Ix9NhaRbzfbDV/2rx9EP7YIDJTmsZSEc5kYn2vWcNccYyahJL2uAQZK2a5Or2i0wtIKTPoRQ==} + + estree-util-is-identifier-name@2.1.0: + resolution: {integrity: sha512-bEN9VHRyXAUOjkKVQVvArFym08BTWB0aJPppZZr0UNyAqWsLaVfAqP7hbaTJjzHifmB5ebnR8Wm7r7yGN/HonQ==} + + estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + + estree-util-to-js@1.2.0: + resolution: {integrity: sha512-IzU74r1PK5IMMGZXUVZbmiu4A1uhiPgW5hm1GjcOfr4ZzHaMPpLNJjR7HjXiIOzi25nZDrgFTobHTkV5Q6ITjA==} + + estree-util-value-to-estree@1.3.0: + resolution: {integrity: sha512-Y+ughcF9jSUJvncXwqRageavjrNPAI+1M/L3BI3PyLp1nmgYTGUXU6t5z1Y7OWuThoDdhPME07bQU+d5LxdJqw==} + engines: {node: '>=12.0.0'} + + estree-util-visit@1.2.1: + resolution: {integrity: sha512-xbgqcrkIVbIG+lI/gzbvd9SGTJL4zqJKBFttUl5pP27KhAjtMKbX/mQXJ7qgyXpMgVy/zvpm0xoQQaGL8OloOw==} + + estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + + estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + + esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + eval@0.1.8: + resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} + engines: {node: '>= 0.8'} + + event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + + execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + + exit-hook@2.2.1: + resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} + engines: {node: '>=6'} + + exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + + expand-tilde@2.0.2: + resolution: {integrity: sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==} + engines: {node: '>=0.10.0'} + + expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + express@4.19.2: + resolution: {integrity: sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==} + engines: {node: '>= 0.10.0'} + + extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + + extendable-error@0.1.7: + resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} + + external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + + fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + + fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + + fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + + fault@2.0.1: + resolution: {integrity: sha512-WtySTkS4OKev5JtpHXnib4Gxiurzh5NCGvWrFaZ34m6JehfTUhKZvn9njTfw48t6JumVQOmrKqpmGcdwxnhqBQ==} + + fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + + file-entry-cache@8.0.0: + resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} + engines: {node: '>=16.0.0'} + + fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + + finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + + find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + + find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + + findup-sync@5.0.0: + resolution: {integrity: sha512-MzwXju70AuyflbgeOhzvQWAvvQdo1XL0A9bVvlXsYcFEBM87WR4OakL4OfZq+QRmr+duJubio+UtNQCPsVESzQ==} + engines: {node: '>= 10.13.0'} + + fined@2.0.0: + resolution: {integrity: sha512-OFRzsL6ZMHz5s0JrsEr+TpdGNCtrVtnuG3x1yzGNiQHT0yaDnXAj8V/lWcpJVrnoDpcwXcASxAZYbuXda2Y82A==} + engines: {node: '>= 10.13.0'} + + flagged-respawn@2.0.0: + resolution: {integrity: sha512-Gq/a6YCi8zexmGHMuJwahTGzXlAZAOsbCVKduWXC6TlLCjjFRlExMJc4GC2NYPYZ0r/brw9P7CpRgQmlPVeOoA==} + engines: {node: '>= 10.13.0'} + + flat-cache@4.0.1: + resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==} + engines: {node: '>=16'} + + flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + + for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + + for-in@1.0.2: + resolution: {integrity: sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==} + engines: {node: '>=0.10.0'} + + for-own@1.0.0: + resolution: {integrity: sha512-0OABksIGrxKK8K4kynWkQ7y1zounQxP+CWnyclVwj81KW3vlLlGUx57DKGcP/LH216GzqnstnPocF16Nxs0Ycg==} + engines: {node: '>=0.10.0'} + + foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + + form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + + format@0.2.2: + resolution: {integrity: sha512-wzsgA6WOq+09wrU1tsJ09udeR/YZRaeArL9e1wPbFg3GG2yDnC2ldKpxs4xunpFF9DgqCqOIra3bc1HWrJ37Ww==} + engines: {node: '>=0.4.x'} + + formidable@3.5.1: + resolution: {integrity: sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==} + + forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + + fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + + fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + + fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + + fs-extra@8.1.0: + resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} + engines: {node: '>=6 <7 || >=8'} + + fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + + fs-minipass@3.0.3: + resolution: {integrity: sha512-XUBA9XClHbnJWSfBzjkm6RvPsyg3sryZt06BEQoXcF7EK/xpGaQYJgQKDJSUH5SGZ76Y7pFx1QBnXz09rU5Fbw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + + function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + + functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + generic-names@4.0.0: + resolution: {integrity: sha512-ySFolZQfw9FoDb3ed9d80Cm9f0+r7qj+HJkWjeD9RBfpxEVTlVhol+gvaQB/78WbwYfbnNh8nWHHBSlg072y6A==} + + gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + + get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + + get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + + get-intrinsic@1.2.4: + resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==} + engines: {node: '>= 0.4'} + + get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + get-port@5.1.1: + resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} + engines: {node: '>=8'} + + get-stdin@9.0.0: + resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} + engines: {node: '>=12'} + + get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + + get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + + get-symbol-description@1.0.2: + resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==} + engines: {node: '>= 0.4'} + + get-tsconfig@4.7.4: + resolution: {integrity: sha512-ofbkKj+0pjXjhejr007J/fLf+sW+8H7K5GCm+msC8q3IpvgjobpyPqSRFemNyIMxklC0zeJpi7VDFna19FacvQ==} + + git-hooks-list@3.1.0: + resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} + + glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + + glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + + glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@10.3.12: + resolution: {integrity: sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + + global-modules@1.0.0: + resolution: {integrity: sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==} + engines: {node: '>=0.10.0'} + + global-prefix@1.0.2: + resolution: {integrity: sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==} + engines: {node: '>=0.10.0'} + + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + + globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globalthis@1.0.4: + resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} + engines: {node: '>= 0.4'} + + globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + + globby@13.2.2: + resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + globrex@0.1.2: + resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} + + gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + grapheme-splitter@1.0.4: + resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==} + + graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + + gunzip-maybe@1.4.2: + resolution: {integrity: sha512-4haO1M4mLO91PW57BMsDFf75UmwoRX0GkdD+Faw+Lr+r/OZrOCS0pIBwOL1xCKQqnQzbNFGgK2V2CpBUPeFNTw==} + hasBin: true + + handlebars@4.7.8: + resolution: {integrity: sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==} + engines: {node: '>=0.4.7'} + hasBin: true + + hard-rejection@2.1.0: + resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==} + engines: {node: '>=6'} + + has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + has-property-descriptors@1.0.2: + resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==} + + has-proto@1.0.3: + resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==} + engines: {node: '>= 0.4'} + + has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + has-tostringtag@1.0.2: + resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==} + engines: {node: '>= 0.4'} + + hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + + hast-util-to-estree@2.3.3: + resolution: {integrity: sha512-ihhPIUPxN0v0w6M5+IiAZZrn0LH2uZomeWwhn7uP7avZC6TE7lIiEh2yBMPr5+zi1aUCXq6VoYRgs2Bw9xmycQ==} + + hast-util-whitespace@2.0.1: + resolution: {integrity: sha512-nAxA0v8+vXSBDt3AnRUNjyRIQ0rD+ntpbAp4LnPkumc5M9yUbSMa4XDU9Q6etY4f1Wp4bNgvc1yjiZtsTTrSng==} + + header-case@2.0.4: + resolution: {integrity: sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==} + + hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + + homedir-polyfill@1.0.3: + resolution: {integrity: sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==} + engines: {node: '>=0.10.0'} + + hosted-git-info@2.8.9: + resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==} + + hosted-git-info@6.1.1: + resolution: {integrity: sha512-r0EI+HBMcXadMrugk0GCQ+6BQV39PiWAZVfq7oIckeGiN7sjRGyQxPdft3nQekFTCQbYxLBH+/axZMeH8UX6+w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + html-encoding-sniffer@3.0.0: + resolution: {integrity: sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==} + engines: {node: '>=12'} + + html-encoding-sniffer@4.0.0: + resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==} + engines: {node: '>=18'} + + html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + + http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + + http-proxy-agent@5.0.0: + resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} + engines: {node: '>= 6'} + + http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + + https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} + + human-id@1.0.2: + resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + + human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + + human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + + iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + + iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + + icss-utils@5.1.0: + resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + immutable@4.3.5: + resolution: {integrity: sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==} + + import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + + import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + + imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + + indent-string@5.0.0: + resolution: {integrity: sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==} + engines: {node: '>=12'} + + inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + + inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + + ini@4.1.2: + resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + + inquirer@9.2.20: + resolution: {integrity: sha512-SFwJJPS+Ms75NV+wzFBHjirG4z3tzvis31h+9NyH1tqjIu2c7vCavlXILZ73q/nPYy8/aw4W+DNzLH5MjfYXiA==} + engines: {node: '>=18'} + + internal-slot@1.0.7: + resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==} + engines: {node: '>= 0.4'} + + interpret@3.1.1: + resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} + engines: {node: '>=10.13.0'} + + ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + is-absolute@1.0.0: + resolution: {integrity: sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==} + engines: {node: '>=0.10.0'} + + is-alphabetical@1.0.4: + resolution: {integrity: sha512-DwzsA04LQ10FHTZuL0/grVDk4rFoVH1pjAToYwBrHSxcrBIGQuXrQMtD5U1b0U2XVgKZCTLLP8u2Qxqhy3l2Vg==} + + is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + is-alphanumerical@1.0.4: + resolution: {integrity: sha512-UzoZUr+XfVz3t3v4KyGEniVL9BDRoQtY7tOyrRybkVNjDFWyo1yhXNGrrBTQxp3ib9BLAWs7k2YKBQsFRkZG9A==} + + is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + + is-arguments@1.1.1: + resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==} + engines: {node: '>= 0.4'} + + is-array-buffer@3.0.4: + resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==} + engines: {node: '>= 0.4'} + + is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + is-async-function@2.0.0: + resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==} + engines: {node: '>= 0.4'} + + is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + + is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + + is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + + is-builtin-module@3.2.1: + resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} + engines: {node: '>=6'} + + is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + + is-data-view@1.0.1: + resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==} + engines: {node: '>= 0.4'} + + is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + + is-decimal@1.0.4: + resolution: {integrity: sha512-RGdriMmQQvZ2aqaQq3awNA6dCGtKpiDFcOzrTWrDAT2MiWrKQVPmxLGHl7Y2nNu6led0kEyoX0enY0qXYsv9zw==} + + is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + is-deflate@1.0.0: + resolution: {integrity: sha512-YDoFpuZWu1VRXlsnlYMzKyVRITXj7Ej/V9gXQ2/pAe7X1J7M/RNOqaIYi6qUn+B7nGyB9pDXrv02dsB58d2ZAQ==} + + is-empty@1.2.0: + resolution: {integrity: sha512-F2FnH/otLNJv0J6wc73A5Xo7oHLNnqplYqZhUu01tD54DIPvxIRSTSLkrUB/M0nHO4vo1O9PDfN4KoTxCzLh/w==} + + is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + is-finalizationregistry@1.0.2: + resolution: {integrity: sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==} + + is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + + is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + + is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + + is-gzip@1.0.0: + resolution: {integrity: sha512-rcfALRIb1YewtnksfRIHGcIY93QnK8BIQ/2c9yDYcG/Y6+vRoJuTWBmmSEbyLLYtXm7q35pHOHbZFQBaLrhlWQ==} + engines: {node: '>=0.10.0'} + + is-hexadecimal@1.0.4: + resolution: {integrity: sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==} + + is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + + is-map@2.0.3: + resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==} + engines: {node: '>= 0.4'} + + is-negative-zero@2.0.3: + resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==} + engines: {node: '>= 0.4'} + + is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + + is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + is-path-cwd@3.0.0: + resolution: {integrity: sha512-kyiNFFLU0Ampr6SDZitD/DwUo4Zs1nSdnygUBqsu3LooL00Qvb5j+UnvApUn/TTj1J3OuE6BTdQ5rudKmU2ZaA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + + is-path-inside@4.0.0: + resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} + engines: {node: '>=12'} + + is-plain-obj@1.1.0: + resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==} + engines: {node: '>=0.10.0'} + + is-plain-obj@3.0.0: + resolution: {integrity: sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==} + engines: {node: '>=10'} + + is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + + is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + + is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + + is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + + is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + + is-relative@1.0.0: + resolution: {integrity: sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==} + engines: {node: '>=0.10.0'} + + is-set@2.0.3: + resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==} + engines: {node: '>= 0.4'} + + is-shared-array-buffer@1.0.3: + resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==} + engines: {node: '>= 0.4'} + + is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + + is-subdir@1.2.0: + resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} + engines: {node: '>=4'} + + is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + + is-typed-array@1.1.13: + resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==} + engines: {node: '>= 0.4'} + + is-unc-path@1.0.0: + resolution: {integrity: sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==} + engines: {node: '>=0.10.0'} + + is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + + is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + + is-weakmap@2.0.2: + resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==} + engines: {node: '>= 0.4'} + + is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + + is-weakset@2.0.3: + resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==} + engines: {node: '>= 0.4'} + + is-windows@1.0.2: + resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==} + engines: {node: '>=0.10.0'} + + isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + isbinaryfile@5.0.2: + resolution: {integrity: sha512-GvcjojwonMjWbTkfMpnVHVqXW/wKMYDfEpY94/8zy8HFMOqb/VL6oeONq9v87q4ttVlaTLnGXnJD4B5B1OTGIg==} + engines: {node: '>= 18.0.0'} + + isbot@3.6.5: + resolution: {integrity: sha512-BchONELXt6yMad++BwGpa0oQxo/uD0keL7N15cYVf0A1oMIoNQ79OqeYdPMFWDrNhCqCbRuw9Y9F3QBjvAxZ5g==} + engines: {node: '>=12'} + + isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + isobject@3.0.1: + resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} + engines: {node: '>=0.10.0'} + + istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + + istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + + istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + + istanbul-lib-source-maps@5.0.4: + resolution: {integrity: sha512-wHOoEsNJTVltaJp8eVkm8w+GVkVNHT2YDYo53YdzQEL2gWm1hBX5cGFR9hQJtuGLebidVX7et3+dmDZrmclduw==} + engines: {node: '>=10'} + + istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + + iterator.prototype@1.1.2: + resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==} + + jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + + javascript-stringify@2.1.0: + resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} + + jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-cli@29.7.0: + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jest-config@29.7.0: + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + + jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-environment-jsdom@29.7.0: + resolution: {integrity: sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-pnp-resolver@1.2.3: + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + + jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + jest@29.7.0: + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + + jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + + js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} + + js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + + js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + + jsdom@20.0.3: + resolution: {integrity: sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==} + engines: {node: '>=14'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + + jsdom@24.0.0: + resolution: {integrity: sha512-UDS2NayCvmXSXVP6mpTj+73JnNQadZlr9N68189xib2tx5Mls7swlTNao26IoHv46BZJFvXygyRtyXd1feAk1A==} + engines: {node: '>=18'} + peerDependencies: + canvas: ^2.11.2 + peerDependenciesMeta: + canvas: + optional: true + + jsesc@0.5.0: + resolution: {integrity: sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==} + hasBin: true + + jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + + jsesc@3.0.2: + resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==} + engines: {node: '>=6'} + hasBin: true + + json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + json-parse-even-better-errors@3.0.2: + resolution: {integrity: sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + + json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + + json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + + jsonc-parser@3.2.1: + resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} + + jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + + jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + + jsx-ast-utils@3.3.5: + resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==} + engines: {node: '>=4.0'} + + keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + + kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + + kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + + kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + + language-subtag-registry@0.3.22: + resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==} + + language-tags@1.0.9: + resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==} + engines: {node: '>=0.10'} + + leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + + levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + + liftoff@4.0.0: + resolution: {integrity: sha512-rMGwYF8q7g2XhG2ulBmmJgWv25qBsqRbDn5gH0+wnuyeFt7QBJlHJmtg5qEdn4pN6WVAUMgXnIxytMFRX9c1aA==} + engines: {node: '>=10.13.0'} + + lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + lines-and-columns@2.0.4: + resolution: {integrity: sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-plugin@6.0.3: + resolution: {integrity: sha512-kc0X2FEUZr145odl68frm+lMJuQ23+rTXYmR6TImqPtbpmXC4vVXbWKDQ9IzndA0HfyQamWfKLhzsqGSTxE63w==} + + load-tsconfig@0.2.5: + resolution: {integrity: sha512-IXO6OCs9yg8tMKzfPZ1YmheJbZCiEsnBdcB03l0OcfK9prKnJb96siuHCr5Fl37/yo9DnKU+TLpxzTUspw9shg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + + loader-utils@3.2.1: + resolution: {integrity: sha512-ZvFw1KWS3GVyYBYb7qkmRM/WwL2TQQBxgCK62rlvm4WpVQ23Nb4tYjApUlfjrEGvOs7KHEsmyUn75OHZrJMWPw==} + engines: {node: '>= 12.13.0'} + + local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + + locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + + lodash.camelcase@4.3.0: + resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==} + + lodash.debounce@4.0.8: + resolution: {integrity: sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==} + + lodash.get@4.4.2: + resolution: {integrity: sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==} + + lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + + lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + + lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + + lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + + log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + + longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + + loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + + lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + + lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + + lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + + lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + + lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + + magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + + magicast@0.3.4: + resolution: {integrity: sha512-TyDF/Pn36bBji9rWKHlZe+PZb6Mx5V8IHCSxk7X4aljM4e/vyDvZZYwHewdVaqiA0nb3ghfHU/6AUpDxWoER2Q==} + + make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + + make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + make-iterator@1.0.1: + resolution: {integrity: sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==} + engines: {node: '>=0.10.0'} + + makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + + map-cache@0.2.2: + resolution: {integrity: sha512-8y/eV9QQZCiyn1SprXSrCmqJN0yNRATe+PO8ztwqrvrbdRLA3eYJF0yaR0YayLWkMbsQSKWS9N2gPcGEc4UsZg==} + engines: {node: '>=0.10.0'} + + map-obj@1.0.1: + resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==} + engines: {node: '>=0.10.0'} + + map-obj@4.3.0: + resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==} + engines: {node: '>=8'} + + markdown-extensions@1.1.1: + resolution: {integrity: sha512-WWC0ZuMzCyDHYCasEGs4IPvLyTGftYwh6wIEOULOF0HXcqZlhwRzrK0w2VUlxWA98xnvb/jszw4ZSkJ6ADpM6Q==} + engines: {node: '>=0.10.0'} + + marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + + mdast-util-definitions@5.1.2: + resolution: {integrity: sha512-8SVPMuHqlPME/z3gqVwWY4zVXn8lqKv/pAhC57FuJ40ImXyBpmO5ukh98zB2v7Blql2FiHjHv9LVztSIqjY+MA==} + + mdast-util-from-markdown@0.8.5: + resolution: {integrity: sha512-2hkTXtYYnr+NubD/g6KGBS/0mFmBcifAsI0yIWRiRo0PjVs6SSOSOdtzbp6kSGnShDN6G5aWZpKQ2lWRy27mWQ==} + + mdast-util-from-markdown@1.3.1: + resolution: {integrity: sha512-4xTO/M8c82qBcnQc1tgpNtubGUW/Y1tBQ1B0i5CtSoelOLKFYlElIr3bvgREYYO5iRqbMY1YuqZng0GVOI8Qww==} + + mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + + mdast-util-frontmatter@1.0.1: + resolution: {integrity: sha512-JjA2OjxRqAa8wEG8hloD0uTU0kdn8kbtOWpPP94NBkfAlbxn4S8gCGf/9DwFtEeGPXrDcNXdiDjVaRdUFqYokw==} + + mdast-util-mdx-expression@1.3.2: + resolution: {integrity: sha512-xIPmR5ReJDu/DHH1OoIT1HkuybIfRGYRywC+gJtI7qHjCJp/M9jrmBEJW22O8lskDWm562BX2W8TiAwRTb0rKA==} + + mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + + mdast-util-mdx-jsx@2.1.4: + resolution: {integrity: sha512-DtMn9CmVhVzZx3f+optVDF8yFgQVt7FghCRNdlIaS3X5Bnym3hZwPbg/XW86vdpKjlc1PVj26SpnLGeJBXD3JA==} + + mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + + mdast-util-mdx@2.0.1: + resolution: {integrity: sha512-38w5y+r8nyKlGvNjSEqWrhG0w5PmnRA+wnBvm+ulYCct7nsGYhFVb0lljS9bQav4psDAS1eGkP2LMVcZBi/aqw==} + + mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + + mdast-util-mdxjs-esm@1.3.1: + resolution: {integrity: sha512-SXqglS0HrEvSdUEfoXFtcg7DRl7S2cwOXc7jkuusG472Mmjag34DUDeOJUZtl+BVnyeO1frIgVpHlNRWc2gk/w==} + + mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + + mdast-util-phrasing@3.0.1: + resolution: {integrity: sha512-WmI1gTXUBJo4/ZmSk79Wcb2HcjPJBzM1nlI/OUWA8yk2X9ik3ffNbBGsU+09BFmXaL1IBb9fiuvq6/KMiNycSg==} + + mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + + mdast-util-to-hast@12.3.0: + resolution: {integrity: sha512-pits93r8PhnIoU4Vy9bjW39M2jJ6/tdHyja9rrot9uujkN7UTU9SDnE6WNJz/IGyQk3XHX6yNNtrBH6cQzm8Hw==} + + mdast-util-to-markdown@1.5.0: + resolution: {integrity: sha512-bbv7TPv/WC49thZPg3jXuqzuvI45IL2EVAr/KxF0BSdHsU0ceFHOmwQn6evxAh1GaoK/6GQ1wp4R4oW2+LFL/A==} + + mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + + mdast-util-to-string@2.0.0: + resolution: {integrity: sha512-AW4DRS3QbBayY/jJmD8437V1Gombjf8RSOUCMFBuo5iHi58AGEgVCKQ+ezHkZZDpAQS75hcBMpLqjpJTjtUL7w==} + + mdast-util-to-string@3.2.0: + resolution: {integrity: sha512-V4Zn/ncyN1QNSqSBxTrMOLpjr+IKdHl2v3KVLoWmDPscP4r9GcCi71gjgvUV1SFSKh92AjAG4peFuBl2/YgCJg==} + + mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + + media-query-parser@2.0.2: + resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} + + media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + meow@6.1.1: + resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} + engines: {node: '>=8'} + + merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + micromark-core-commonmark@1.1.0: + resolution: {integrity: sha512-BgHO1aRbolh2hcrzL2d1La37V0Aoz73ymF8rAcKnohLy93titmv62E0gP8Hrx9PKcKrqCZ1BbLGbP3bEhoXYlw==} + + micromark-core-commonmark@2.0.1: + resolution: {integrity: sha512-CUQyKr1e///ZODyD1U3xit6zXwy1a8q2a1S1HKtIlmgvurrEpaw/Y9y6KSIbF8P59cn/NjzHyO+Q2fAyYLQrAA==} + + micromark-extension-frontmatter@1.1.1: + resolution: {integrity: sha512-m2UH9a7n3W8VAH9JO9y01APpPKmNNNs71P0RbknEmYSaZU5Ghogv38BYO94AI5Xw6OYfxZRdHZZ2nYjs/Z+SZQ==} + + micromark-extension-mdx-expression@1.0.8: + resolution: {integrity: sha512-zZpeQtc5wfWKdzDsHRBY003H2Smg+PUi2REhqgIhdzAa5xonhP03FcXxqFSerFiNUr5AWmHpaNPQTBVOS4lrXw==} + + micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + + micromark-extension-mdx-jsx@1.0.5: + resolution: {integrity: sha512-gPH+9ZdmDflbu19Xkb8+gheqEDqkSpdCEubQyxuz/Hn8DOXiXvrXeikOoBA71+e8Pfi0/UYmU3wW3H58kr7akA==} + + micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + + micromark-extension-mdx-md@1.0.1: + resolution: {integrity: sha512-7MSuj2S7xjOQXAjjkbjBsHkMtb+mDGVW6uI2dBL9snOBCbZmoNgDAeZ0nSn9j3T42UE/g2xVNMn18PJxZvkBEA==} + + micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + + micromark-extension-mdxjs-esm@1.0.5: + resolution: {integrity: sha512-xNRBw4aoURcyz/S69B19WnZAkWJMxHMT5hE36GtDAyhoyn/8TuAeqjFJQlwk+MKQsUD7b3l7kFX+vlfVWgcX1w==} + + micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + + micromark-extension-mdxjs@1.0.1: + resolution: {integrity: sha512-7YA7hF6i5eKOfFUzZ+0z6avRG52GpWR8DL+kN47y3f2KhxbBZMhmxe7auOeaTBrW2DenbbZTf1ea9tA2hDpC2Q==} + + micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + + micromark-factory-destination@1.1.0: + resolution: {integrity: sha512-XaNDROBgx9SgSChd69pjiGKbV+nfHGDPVYFs5dOoDd7ZnMAE+Cuu91BCpsY8RT2NP9vo/B8pds2VQNCLiu0zhg==} + + micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + + micromark-factory-label@1.1.0: + resolution: {integrity: sha512-OLtyez4vZo/1NjxGhcpDSbHQ+m0IIGnT8BoPamh+7jVlzLJBH98zzuCoUeMxvM6WsNeh8wx8cKvqLiPHEACn0w==} + + micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + + micromark-factory-mdx-expression@1.0.9: + resolution: {integrity: sha512-jGIWzSmNfdnkJq05c7b0+Wv0Kfz3NJ3N4cBjnbO4zjXIlxJr+f8lk+5ZmwFvqdAbUy2q6B5rCY//g0QAAaXDWA==} + + micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + + micromark-factory-space@1.1.0: + resolution: {integrity: sha512-cRzEj7c0OL4Mw2v6nwzttyOZe8XY/Z8G0rzmWQZTBi/jjwyw/U4uqKtUORXQrR5bAZZnbTI/feRV/R7hc4jQYQ==} + + micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + + micromark-factory-title@1.1.0: + resolution: {integrity: sha512-J7n9R3vMmgjDOCY8NPw55jiyaQnH5kBdV2/UXCtZIpnHH3P6nHUKaH7XXEYuWwx/xUJcawa8plLBEjMPU24HzQ==} + + micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + + micromark-factory-whitespace@1.1.0: + resolution: {integrity: sha512-v2WlmiymVSp5oMg+1Q0N1Lxmt6pMhIHD457whWM7/GUlEks1hI9xj5w3zbc4uuMKXGisksZk8DzP2UyGbGqNsQ==} + + micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + + micromark-util-character@1.2.0: + resolution: {integrity: sha512-lXraTwcX3yH/vMDaFWCQJP1uIszLVebzUa3ZHdrgxr7KEU/9mL4mVgCpGbyhvNLNlauROiNUq7WN5u7ndbY6xg==} + + micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + + micromark-util-chunked@1.1.0: + resolution: {integrity: sha512-Ye01HXpkZPNcV6FiyoW2fGZDUw4Yc7vT0E9Sad83+bEDiCJ1uXu0S3mr8WLpsz3HaG3x2q0HM6CTuPdcZcluFQ==} + + micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + + micromark-util-classify-character@1.1.0: + resolution: {integrity: sha512-SL0wLxtKSnklKSUplok1WQFoGhUdWYKggKUiqhX+Swala+BtptGCu5iPRc+xvzJ4PXE/hwM3FNXsfEVgoZsWbw==} + + micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + + micromark-util-combine-extensions@1.1.0: + resolution: {integrity: sha512-Q20sp4mfNf9yEqDL50WwuWZHUrCO4fEyeDCnMGmG5Pr0Cz15Uo7KBs6jq+dq0EgX4DPwwrh9m0X+zPV1ypFvUA==} + + micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + + micromark-util-decode-numeric-character-reference@1.1.0: + resolution: {integrity: sha512-m9V0ExGv0jB1OT21mrWcuf4QhP46pH1KkfWy9ZEezqHKAxkj4mPCy3nIH1rkbdMlChLHX531eOrymlwyZIf2iw==} + + micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + + micromark-util-decode-string@1.1.0: + resolution: {integrity: sha512-YphLGCK8gM1tG1bd54azwyrQRjCFcmgj2S2GoJDNnh4vYtnL38JS8M4gpxzOPNyHdNEpheyWXCTnnTDY3N+NVQ==} + + micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + + micromark-util-encode@1.1.0: + resolution: {integrity: sha512-EuEzTWSTAj9PA5GOAs992GzNh2dGQO52UvAbtSOMvXTxv3Criqb6IOzJUBCmEqrrXSblJIJBbFFv6zPxpreiJw==} + + micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + micromark-util-events-to-acorn@1.2.3: + resolution: {integrity: sha512-ij4X7Wuc4fED6UoLWkmo0xJQhsktfNh1J0m8g4PbIMPlx+ek/4YdW5mvbye8z/aZvAPUoxgXHrwVlXAPKMRp1w==} + + micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + + micromark-util-html-tag-name@1.2.0: + resolution: {integrity: sha512-VTQzcuQgFUD7yYztuQFKXT49KghjtETQ+Wv/zUjGSGBioZnkA4P1XXZPT1FHeJA6RwRXSF47yvJ1tsJdoxwO+Q==} + + micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + micromark-util-normalize-identifier@1.1.0: + resolution: {integrity: sha512-N+w5vhqrBihhjdpM8+5Xsxy71QWqGn7HYNUvch71iV2PM7+E3uWGox1Qp90loa1ephtCxG2ftRV/Conitc6P2Q==} + + micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + + micromark-util-resolve-all@1.1.0: + resolution: {integrity: sha512-b/G6BTMSg+bX+xVCshPTPyAu2tmA0E4X98NSR7eIbeC6ycCqCeE7wjfDIgzEbkzdEVJXRtOG4FbEm/uGbCRouA==} + + micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + + micromark-util-sanitize-uri@1.2.0: + resolution: {integrity: sha512-QO4GXv0XZfWey4pYFndLUKEAktKkG5kZTdUNaTAkzbuJxn2tNBOr+QtxR2XpWaMhbImT2dPzyLrPXLlPhph34A==} + + micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + + micromark-util-subtokenize@1.1.0: + resolution: {integrity: sha512-kUQHyzRoxvZO2PuLzMt2P/dwVsTiivCK8icYTeR+3WgbuPqfHgPPy7nFKbeqRivBvn/3N3GBiNC+JRTMSxEC7A==} + + micromark-util-subtokenize@2.0.1: + resolution: {integrity: sha512-jZNtiFl/1aY73yS3UGQkutD0UbhTt68qnRpw2Pifmz5wV9h8gOVsN70v+Lq/f1rKaU/W8pxRe8y8Q9FX1AOe1Q==} + + micromark-util-symbol@1.1.0: + resolution: {integrity: sha512-uEjpEYY6KMs1g7QfJ2eX1SQEV+ZT4rUD3UcF6l57acZvLNK7PBZL+ty82Z1qhK1/yXIY4bdx04FKMgR0g4IAag==} + + micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + micromark-util-types@1.1.0: + resolution: {integrity: sha512-ukRBgie8TIAcacscVHSiddHjO4k/q3pnedmzMQ4iwDcK0FtFCohKOlFbaOL/mPgfnPsL3C1ZyxJa4sbWrBl3jg==} + + micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + micromark@2.11.4: + resolution: {integrity: sha512-+WoovN/ppKolQOFIAajxi7Lu9kInbPxFuTBVEavFcL8eAfVstoc5MocPmqBeAdBOJV00uaVjegzH4+MA0DN/uA==} + + micromark@3.2.0: + resolution: {integrity: sha512-uD66tJj54JLYq0De10AhWycZWGQNUvDI55xPgk2sQM5kn1JYlhbCMTtEeT27+vAhW2FBQxLlOmS3pmA7/2z4aA==} + + micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + + micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + + mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + + min-indent@1.0.1: + resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} + engines: {node: '>=4'} + + minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + + minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + + minimist-options@4.1.0: + resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==} + engines: {node: '>= 6'} + + minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + + minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + + minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + + minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + + minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + + minipass@7.1.0: + resolution: {integrity: sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==} + engines: {node: '>=16 || 14 >=14.17'} + + minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + + mixme@0.5.10: + resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==} + engines: {node: '>= 8.0.0'} + + mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + + mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} + engines: {node: '>=10'} + hasBin: true + + mlly@1.7.0: + resolution: {integrity: sha512-U9SDaXGEREBYQgfejV97coK0UL1r+qnF2SyO9A3qcI8MzKnsIFKHNVEkrDyNncQTKQQumsasmeq84eNMdBfsNQ==} + + modern-ahocorasick@1.0.1: + resolution: {integrity: sha512-yoe+JbhTClckZ67b2itRtistFKf8yPYelHLc7e5xAwtNAXxM6wJTUx2C7QeVSJFDzKT7bCIFyBVybPMKvmB9AA==} + + morgan@1.10.0: + resolution: {integrity: sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==} + engines: {node: '>= 0.8.0'} + + mri@1.2.0: + resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} + engines: {node: '>=4'} + + mrmime@1.0.1: + resolution: {integrity: sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==} + engines: {node: '>=10'} + + ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + mute-stream@1.0.0: + resolution: {integrity: sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + + nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + + natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + + negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + next@14.2.3: + resolution: {integrity: sha512-dowFkFTR8v79NPJO4QsBUtxv0g9BrS/phluVpMAt2ku7H+cbcBJlopXjkWlwxrk/xGqMemr7JkGPGemPrLLX7A==} + engines: {node: '>=18.17.0'} + hasBin: true + peerDependencies: + '@opentelemetry/api': ^1.1.0 + '@playwright/test': ^1.41.2 + react: ^18.2.0 + react-dom: ^18.2.0 + sass: ^1.3.0 + peerDependenciesMeta: + '@opentelemetry/api': + optional: true + '@playwright/test': + optional: true + sass: + optional: true + + nextjs-themes@3.1.1: + resolution: {integrity: sha512-/QratUKm1rREoz+aMcnYEf42X53DN70wCyZkyIrV/VdIRtEoTUyEc7z7JfHz/DOqHvTDYBWNy2Z3IiUvlgCdrA==} + peerDependencies: + '@types/react': 16.8 - 18 + next: 8 - 14 + react: 16.8 - 18 + peerDependenciesMeta: + next: + optional: true + + no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + + node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + + node-plop@0.32.0: + resolution: {integrity: sha512-lKFSRSRuDHhwDKMUobdsvaWCbbDRbV3jMUSMiajQSQux1aNUevAZVxUHc2JERI//W8ABPRbi3ebYuSuIzkNIpQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + + nopt@7.2.1: + resolution: {integrity: sha512-taM24ViiimT/XntxbPyJQzCG+p4EKOpgD3mxFwW38mGjVUrfERQOeY4EDHjdnptttfHuHQXFx+lTP08Q+mLa/w==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + normalize-package-data@2.5.0: + resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==} + + normalize-package-data@5.0.0: + resolution: {integrity: sha512-h9iPVIfrVZ9wVYQnxFgtw1ugSvGEMOlyPWWtm8BMJhnwyEL/FLbYbTY3V3PpjI/BUK67n9PEWDu6eHzu1fB15Q==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + + npm-install-checks@6.3.0: + resolution: {integrity: sha512-W29RiK/xtpCGqn6f3ixfRYGk+zRyr+Ew9F2E20BfXxT5/euLdA/Nm7fO7OeTGuAmTs30cpgInyJ0cYe708YTZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-normalize-package-bin@3.0.1: + resolution: {integrity: sha512-dMxCf+zZ+3zeQZXKxmyuCKlIDPGuv8EF940xbkC4kQVDTtqoh6rJFO+JTKSA6/Rwi0getWmtuy4Itup0AMcaDQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-package-arg@10.1.0: + resolution: {integrity: sha512-uFyyCEmgBfZTtrKk/5xDfHp6+MdrqGotX/VoOyEEl3mBwiEE5FlBaePanazJSVMPT7vKepcjYBY2ztg9A3yPIA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-pick-manifest@8.0.2: + resolution: {integrity: sha512-1dKY+86/AIiq1tkKVD3l0WI+Gd3vkknVGAggsFeBkTvbhMQ1OND/LKkYv4JtXPKUJ8bOTCyLiqEg2P6QNdK+Gg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + + npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + nwsapi@2.2.9: + resolution: {integrity: sha512-2f3F0SEEer8bBu0dsNCFF50N0cTThV1nWFYcEYFZttdW0lDAoybv9cQoK7X7/68Z89S7FoRrVjP1LPX4XRf9vg==} + + object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + object-inspect@1.13.1: + resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==} + + object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + object.assign@4.1.5: + resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==} + engines: {node: '>= 0.4'} + + object.defaults@1.1.0: + resolution: {integrity: sha512-c/K0mw/F11k4dEUBMW8naXUuBuhxRCfG7W+yFy8EcijU/rSmazOUd1XAEEe6bC0OuXY4HUKjTJv7xbxIMqdxrA==} + engines: {node: '>=0.10.0'} + + object.entries@1.1.8: + resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==} + engines: {node: '>= 0.4'} + + object.fromentries@2.0.8: + resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==} + engines: {node: '>= 0.4'} + + object.groupby@1.0.3: + resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==} + engines: {node: '>= 0.4'} + + object.hasown@1.1.4: + resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==} + engines: {node: '>= 0.4'} + + object.map@1.0.1: + resolution: {integrity: sha512-3+mAJu2PLfnSVGHwIWubpOFLscJANBKuB/6A4CxBstc4aqwQY0FWcsppuy4jU5GSB95yES5JHSI+33AWuS4k6w==} + engines: {node: '>=0.10.0'} + + object.pick@1.3.0: + resolution: {integrity: sha512-tqa/UMy/CCoYmj+H5qc07qvSL9dqcs/WZENZ1JbtWBlATP+iVOe778gE6MSijnyCnORzDuX6hU+LA4SZ09YjFQ==} + engines: {node: '>=0.10.0'} + + object.values@1.2.0: + resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==} + engines: {node: '>= 0.4'} + + on-finished@2.3.0: + resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} + engines: {node: '>= 0.8'} + + on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + + on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + + once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + + onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + + optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + + ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + + ora@8.0.1: + resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} + engines: {node: '>=18'} + + os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + outdent@0.5.0: + resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==} + + outdent@0.8.0: + resolution: {integrity: sha512-KiOAIsdpUTcAXuykya5fnVVT+/5uS0Q1mrkRHcF89tpieSmY33O/tmc54CqwA+bfhbtEfZUNLHaPUiB9X3jt1A==} + + p-filter@2.1.0: + resolution: {integrity: sha512-ZBxxZ5sL2HghephhpGAQdoskxplTwr7ICaehZwLIlfL6acuVgZPm8yBNuRAFBGEqtD/hmUeq9eqLg2ys9Xr/yw==} + engines: {node: '>=8'} + + p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + + p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + + p-map@2.1.0: + resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==} + engines: {node: '>=6'} + + p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + + p-map@5.5.0: + resolution: {integrity: sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==} + engines: {node: '>=12'} + + p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + + param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + + parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + + parse-entities@2.0.0: + resolution: {integrity: sha512-kkywGpCcRYhqQIchaWqZ875wzpS/bMKhz5HnN3p7wveJTkTtyAB/AlnS0f8DFSqYW1T82t6yEAkEcB+A1I3MbQ==} + + parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + + parse-filepath@1.0.2: + resolution: {integrity: sha512-FwdRXKCohSVeXqwtYonZTXtbGJKrn+HNyWDYVcp5yuJlesTwNH4rsmRZ+GrKAPJ5bLpRxESMeS+Rl0VCHRvB2Q==} + engines: {node: '>=0.8'} + + parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + + parse-json@7.1.1: + resolution: {integrity: sha512-SgOTCX/EZXtZxBE5eJ97P4yGM5n37BwRU+YMsH4vNzFqJV/oWFXXCmwFlgWUM4PrakybVOueJJ6pwHqSVhTFDw==} + engines: {node: '>=16'} + + parse-ms@2.1.0: + resolution: {integrity: sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==} + engines: {node: '>=6'} + + parse-passwd@1.0.0: + resolution: {integrity: sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==} + engines: {node: '>=0.10.0'} + + parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + + parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + + path-case@3.0.4: + resolution: {integrity: sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==} + + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + path-root-regex@0.1.2: + resolution: {integrity: sha512-4GlJ6rZDhQZFE0DPVKh0e9jmZ5egZfxTkp7bcRDuPlJXbAwhxcl2dINPUAsjLdejqaLsCeg8axcLjIbvBjN4pQ==} + engines: {node: '>=0.10.0'} + + path-root@0.1.1: + resolution: {integrity: sha512-QLcPegTHF11axjfojBIoDygmS2E3Lf+8+jI6wOVmNVenrKSo3mFdSGiIgdSHenczw3wPtlVMQaFVwGmM7BJdtg==} + engines: {node: '>=0.10.0'} + + path-scurry@1.10.2: + resolution: {integrity: sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==} + engines: {node: '>=16 || 14 >=14.17'} + + path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + + pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + + peek-stream@1.1.3: + resolution: {integrity: sha512-FhJ+YbOSBb9/rIl2ZeE/QHEsWn7PqNYt8ARAY3kIgNGOk13g9FGyIY6JIl/xB/3TFRVoTv5as0l11weORrTekA==} + + periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + + picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + pidtree@0.6.0: + resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} + engines: {node: '>=0.10'} + hasBin: true + + pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + + pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + + pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + + pkg-types@1.1.0: + resolution: {integrity: sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==} + + plop@4.0.1: + resolution: {integrity: sha512-5n8QU93kvL/ObOzBcPAB1siVFtAH1TZM6TntJ3JK5kXT0jIgnQV+j+uaOWWFJlg1cNkzLYm8klgASF65K36q9w==} + engines: {node: '>=18'} + hasBin: true + + pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + possible-typed-array-names@1.0.0: + resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==} + engines: {node: '>= 0.4'} + + postcss-discard-duplicates@5.1.0: + resolution: {integrity: sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==} + engines: {node: ^10 || ^12 || >=14.0} + peerDependencies: + postcss: ^8.2.15 + + postcss-load-config@4.0.2: + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + + postcss-modules-extract-imports@3.1.0: + resolution: {integrity: sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-local-by-default@4.0.5: + resolution: {integrity: sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-scope@3.2.0: + resolution: {integrity: sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules-values@4.0.0: + resolution: {integrity: sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==} + engines: {node: ^10 || ^12 || >= 14} + peerDependencies: + postcss: ^8.1.0 + + postcss-modules@6.0.0: + resolution: {integrity: sha512-7DGfnlyi/ju82BRzTIjWS5C4Tafmzl3R79YP/PASiocj+aa6yYphHhhKUOEoXQToId5rgyFgJ88+ccOUydjBXQ==} + peerDependencies: + postcss: ^8.0.0 + + postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + + postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + + postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + + postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + + preferred-pm@3.1.3: + resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==} + engines: {node: '>=10'} + + prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + + prettier-plugin-packagejson@2.5.0: + resolution: {integrity: sha512-6XkH3rpin5QEQodBSVNg+rBo4r91g/1mCaRwS1YGdQJZ6jwqrg2UchBsIG9tpS1yK1kNBvOt84OILsX8uHzBGg==} + peerDependencies: + prettier: '>= 1.16.0' + peerDependenciesMeta: + prettier: + optional: true + + prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + + prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + + pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + + pretty-ms@7.0.1: + resolution: {integrity: sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==} + engines: {node: '>=10'} + + prism-react-renderer@2.3.1: + resolution: {integrity: sha512-Rdf+HzBLR7KYjzpJ1rSoxT9ioO85nZngQEoFIhL07XhtJHlCU3SOz0GJ6+qvMyQe0Se+BV3qpe6Yd/NmQF5Juw==} + peerDependencies: + react: '>=16.0.0' + + proc-log@3.0.0: + resolution: {integrity: sha512-++Vn7NS4Xf9NacaU9Xq3URUuqZETPsf8L4j5/ckhaRYsfPeRyzGw+iDjFhV/Jr3uNmTvvddEJFWh5R1gRgUH8A==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + proc-log@4.2.0: + resolution: {integrity: sha512-g8+OnU/L2v+wyiVK+D5fA34J7EH8jZ8DDlvwhRCMxmMj7UCBvxiO1mGeN+36JXIKF4zevU4kRBd8lVgG9vLelA==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + + promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + + prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + + prop-types@15.8.1: + resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} + + property-information@6.5.0: + resolution: {integrity: sha512-PgTgs/BlvHxOu8QuEN7wi5A0OmXaBcHpmCSTehcs6Uuu9IkDIEo13Hy7n898RHfrQ49vKCoGeWZSaAK01nwVig==} + + proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + + pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + + psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + + pump@2.0.1: + resolution: {integrity: sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==} + + pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + + pumpify@1.5.1: + resolution: {integrity: sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==} + + punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + + qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + + qs@6.12.1: + resolution: {integrity: sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==} + engines: {node: '>=0.6'} + + querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + + queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + quick-lru@4.0.1: + resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} + engines: {node: '>=8'} + + r18gs@0.1.4: + resolution: {integrity: sha512-WCio36gmOBxZ3A5TIJGL8zOckiLzi278JX0mSTcK/0tIUalF1Aaj6Ul3CfC8aN46yCb/5GNH2F7433NJJyCQjg==} + peerDependencies: + '@types/react': 16.8 - 18 + react: 16.8 - 18 + + r18gs@1.0.2: + resolution: {integrity: sha512-DLTeoRpX70oo6/KkpB6vkY/oGxlI/SJJfOSL377+3R4f8Fi5MVQhJn92dzRH/lxZfQ6IjnqluJsQJ88AyQdu1w==} + peerDependencies: + '@types/react': 16.8 - 18 + react: 16.8 - 18 + + range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + + react-dom@18.2.0: + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + + react-dom@18.3.1: + resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==} + peerDependencies: + react: ^18.3.1 + + react-is@16.13.1: + resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} + + react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + + react-live@4.1.6: + resolution: {integrity: sha512-2oq3MADi3rupqZcdoHMrV9p+Eg/92BDds278ZuoOz8d68qw6ct0xZxX89MRxeChrnFHy1XPr8BVknDJNJNdvVw==} + engines: {node: '>= 0.12.0', npm: '>= 2.0.0'} + peerDependencies: + react: '>=18.0.0' + react-dom: '>=18.0.0' + + react-refresh@0.14.2: + resolution: {integrity: sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==} + engines: {node: '>=0.10.0'} + + react-router-dom@6.23.0: + resolution: {integrity: sha512-Q9YaSYvubwgbal2c9DJKfx6hTNoBp3iJDsl+Duva/DwxoJH+OTXkxGpql4iUK2sla/8z4RpjAm6EWx1qUDuopQ==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + + react-router@6.23.0: + resolution: {integrity: sha512-wPMZ8S2TuPadH0sF5irFGjkNLIcRvOSaEe7v+JER8508dyJumm6XZB1u5kztlX0RVq6AzRVndzqcUh6sFIauzA==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + + react18-themes@3.1.0: + resolution: {integrity: sha512-Wk5Zsv3/Hkb9o28yOcWgBf3xhy5OpBTCcm++szVjfrvfeRH0a85PyIH8puk47EYf3MEsnSiOtCwT286/lXmpTA==} + peerDependencies: + '@remix-run/node': ^2.3.1 + '@remix-run/react': ^2.3.1 + '@types/react': 16.8 - 18 + next: 10 - 14 + react: 16.8 - 18 + peerDependenciesMeta: + '@remix-run/node': + optional: true + '@remix-run/react': + optional: true + next: + optional: true + + react@18.3.1: + resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==} + engines: {node: '>=0.10.0'} + + read-package-json-fast@3.0.2: + resolution: {integrity: sha512-0J+Msgym3vrLOUB3hzQCuZHII0xkNGCtz/HJH9xZshwv9DbDwkw1KaE3gx/e2J5rpEY5rtOy6cyhKOPrkP7FZw==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + read-pkg-up@7.0.1: + resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==} + engines: {node: '>=8'} + + read-pkg@5.2.0: + resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==} + engines: {node: '>=8'} + + read-yaml-file@1.1.0: + resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} + engines: {node: '>=6'} + + readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + + readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + + rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + + redent@3.0.0: + resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==} + engines: {node: '>=8'} + + reflect.getprototypeof@1.0.6: + resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==} + engines: {node: '>= 0.4'} + + regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + + regexp-tree@0.1.27: + resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} + hasBin: true + + regexp.prototype.flags@1.5.2: + resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==} + engines: {node: '>= 0.4'} + + regjsparser@0.10.0: + resolution: {integrity: sha512-qx+xQGZVsy55CH0a1hiVwHmqjLryfh7wQyF5HO07XJ9f7dQMY/gPQHhlyDkIzJKC+x2fUCpCcUODUUUFrm7SHA==} + hasBin: true + + remark-frontmatter@4.0.1: + resolution: {integrity: sha512-38fJrB0KnmD3E33a5jZC/5+gGAC2WKNiPw1/fdXJvijBlhA7RCsvJklrYJakS0HedninvaCYW8lQGf9C918GfA==} + + remark-mdx-frontmatter@1.1.1: + resolution: {integrity: sha512-7teX9DW4tI2WZkXS4DBxneYSY7NHiXl4AKdWDO9LXVweULlCT8OPWsOjLEnMIXViN1j+QcY8mfbq3k0EK6x3uA==} + engines: {node: '>=12.2.0'} + + remark-mdx@2.3.0: + resolution: {integrity: sha512-g53hMkpM0I98MU266IzDFMrTD980gNF3BJnkyFcmN+dD873mQeD5rdMO3Y2X+x8umQfbSE0PcoEDl7ledSA+2g==} + + remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + + remark-parse@10.0.2: + resolution: {integrity: sha512-3ydxgHa/ZQzG8LvC7jTXccARYDcRld3VfcgIIFs7bI6vbRSxJJmzgLEIIoYKyrfhaY+ujuWaf/PJiMZXoiCXgw==} + + remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + + remark-rehype@10.1.0: + resolution: {integrity: sha512-EFmR5zppdBp0WQeDVZ/b66CWJipB2q2VLNFMabzDSGR66Z2fQii83G5gTBbgGEnEEA0QRussvrFHxk1HWGJskw==} + + remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + + require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + require-like@0.1.2: + resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} + + require-main-filename@2.0.0: + resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} + + requireindex@1.2.0: + resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==} + engines: {node: '>=0.10.5'} + + requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + + resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + + resolve-dir@1.0.1: + resolution: {integrity: sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==} + engines: {node: '>=0.10.0'} + + resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + resolve-pkg-maps@1.0.0: + resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + + resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + + resolve@1.19.0: + resolution: {integrity: sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==} + + resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + + resolve@2.0.0-next.5: + resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==} + hasBin: true + + restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + + restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + + reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + + rollup@4.17.2: + resolution: {integrity: sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + + rrweb-cssom@0.6.0: + resolution: {integrity: sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==} + + run-async@3.0.0: + resolution: {integrity: sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==} + engines: {node: '>=0.12.0'} + + run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + + rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + + sade@1.8.1: + resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} + engines: {node: '>=6'} + + safe-array-concat@1.1.2: + resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==} + engines: {node: '>=0.4'} + + safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + safe-regex-test@1.0.3: + resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==} + engines: {node: '>= 0.4'} + + safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + sass@1.76.0: + resolution: {integrity: sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw==} + engines: {node: '>=14.0.0'} + hasBin: true + + sass@1.77.0: + resolution: {integrity: sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==} + engines: {node: '>=14.0.0'} + hasBin: true + + saxes@6.0.0: + resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==} + engines: {node: '>=v12.22.7'} + + scheduler@0.23.2: + resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==} + + semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + semver@7.6.1: + resolution: {integrity: sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==} + engines: {node: '>=10'} + hasBin: true + + send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + + sentence-case@3.0.4: + resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} + + serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + + server-only@0.0.1: + resolution: {integrity: sha512-qepMx2JxAa5jjfzxG79yPPq+8BuFToHd1hm7kI+Z4zAq1ftQiP7HcxMhDDItrbtwVeLg/cY2JnKnrcFkmiswNA==} + + set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + + set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + set-function-length@1.2.2: + resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==} + engines: {node: '>= 0.4'} + + set-function-name@2.0.2: + resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==} + engines: {node: '>= 0.4'} + + setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + shebang-command@1.2.0: + resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} + engines: {node: '>=0.10.0'} + + shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + + shebang-regex@1.0.0: + resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} + engines: {node: '>=0.10.0'} + + shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + shiki@0.14.7: + resolution: {integrity: sha512-dNPAPrxSc87ua2sKJ3H5dQ/6ZaY8RNnaAqK+t0eG7p0Soi2ydiqbGOTaZCqaYvA/uZYfS1LJnemt3Q+mSfcPCg==} + + side-channel@1.0.6: + resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==} + engines: {node: '>= 0.4'} + + siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + + signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + + slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + slash@4.0.0: + resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} + engines: {node: '>=12'} + + smartwrap@2.0.2: + resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==} + engines: {node: '>=6'} + hasBin: true + + snake-case@3.0.4: + resolution: {integrity: sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==} + + sort-object-keys@1.1.3: + resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} + + sort-package-json@2.10.0: + resolution: {integrity: sha512-MYecfvObMwJjjJskhxYfuOADkXp1ZMMnCFC8yhp+9HDsk7HhR336hd7eiBs96lTXfiqmUNI+WQCeCMRBhl251g==} + hasBin: true + + source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + + source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + + source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + + source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + + source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + + space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + + spawndamnit@2.0.0: + resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + + spdx-correct@3.2.0: + resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==} + + spdx-exceptions@2.5.0: + resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==} + + spdx-expression-parse@3.0.1: + resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==} + + spdx-license-ids@3.0.17: + resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==} + + sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + ssri@10.0.6: + resolution: {integrity: sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + + stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + + statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + + stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + + stream-shift@1.0.3: + resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} + + stream-slice@0.1.2: + resolution: {integrity: sha512-QzQxpoacatkreL6jsxnVb7X5R/pGw9OUv2qWTYWnmLpg4NdN31snPy/f3TdQE1ZUXaThRvj1Zw4/OGg0ZkaLMA==} + + stream-transform@2.1.3: + resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==} + + streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + string-hash@1.1.3: + resolution: {integrity: sha512-kJUvRUFK49aub+a7T1nNE66EJbZBMnBgoC1UbCZ5n6bsZKBRga4KgBRTMn/pFkeCZSYtNeSyMxPDM0AXWELk2A==} + + string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + + string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + + string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + + string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + + string.prototype.matchall@4.0.11: + resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==} + engines: {node: '>= 0.4'} + + string.prototype.trim@1.2.9: + resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==} + engines: {node: '>= 0.4'} + + string.prototype.trimend@1.0.8: + resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==} + + string.prototype.trimstart@1.0.8: + resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==} + engines: {node: '>= 0.4'} + + string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + + string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + + stringify-entities@4.0.4: + resolution: {integrity: sha512-IwfBptatlO+QCJUo19AqvrPNqlVMpW9YEL2LIVY+Rpv2qsjCGxaDLNRgeGsQWJhfItebuJhsGSLjaBbNSQ+ieg==} + + strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + + strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + + strip-indent@3.0.0: + resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} + engines: {node: '>=8'} + + strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + + style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + + styled-jsx@5.1.1: + resolution: {integrity: sha512-pW7uC1l4mBZ8ugbiZrcIsiIvVx1UmTfw7UkC3Um2tmfUq9Bhk8IiyEIPl6F8agHgjzku6j0xQEZbfA5uSgSaCw==} + engines: {node: '>= 12.0.0'} + peerDependencies: + '@babel/core': '*' + babel-plugin-macros: '*' + react: '>= 16.8.0 || 17.x.x || ^18.0.0-0' + peerDependenciesMeta: + '@babel/core': + optional: true + babel-plugin-macros: + optional: true + + sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + + superagent@9.0.2: + resolution: {integrity: sha512-xuW7dzkUpcJq7QnhOsnNUgtYp3xRwpt2F7abdRYIpCsAt0hhUqia0EdxyXZQQpNmGtsCzYHryaKSV3q3GJnq7w==} + engines: {node: '>=14.18.0'} + + supertest@7.0.0: + resolution: {integrity: sha512-qlsr7fIC0lSddmA3tzojvzubYxvlGtzumcdHgPwbFWMISQwL22MhM2Y3LNt+6w9Yyx7559VW5ab70dgphm8qQA==} + engines: {node: '>=14.18.0'} + + supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + + supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + + supports-color@9.4.0: + resolution: {integrity: sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==} + engines: {node: '>=12'} + + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + + synckit@0.9.0: + resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==} + engines: {node: ^14.18.0 || >=16.0.0} + + tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + + tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + + tar@6.2.1: + resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} + engines: {node: '>=10'} + + term-size@2.2.1: + resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} + engines: {node: '>=8'} + + test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + + text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + + thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + + thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + + through2@2.0.5: + resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + + tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + + tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + + tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + + title-case@3.0.3: + resolution: {integrity: sha512-e1zGYRvbffpcHIrnuqT0Dh+gEJtDaxDSoG4JAIpq4oDFyooziLBIiYQv0GBT4FUAnUop5uZ1hiIAj7oAF6sOCA==} + + tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + + tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + + to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + + to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + + toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + toml@3.0.0: + resolution: {integrity: sha512-y/mWCZinnvxjTKYhJ+pYxwD0mRLVvOtdS2Awbgxln6iEnt4rk0yBxeSBHkGJcPucRiG0e55mwWp+g/05rsrd6w==} + + tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + + tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + + tr46@3.0.0: + resolution: {integrity: sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==} + engines: {node: '>=12'} + + tr46@5.0.0: + resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==} + engines: {node: '>=18'} + + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + + trim-newlines@3.0.1: + resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==} + engines: {node: '>=8'} + + trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + + ts-api-utils@1.3.0: + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + + ts-dedent@2.2.0: + resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==} + engines: {node: '>=6.10'} + + ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + + ts-jest@29.1.2: + resolution: {integrity: sha512-br6GJoH/WUX4pu7FbZXuWGKGNDuU7b8Uj77g/Sp7puZV6EXzuByl6JrECvm0MzVzSTkSHWTihsXt+5XYER5b+g==} + engines: {node: ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + + ts-node@10.9.2: + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + + tsconfck@3.0.3: + resolution: {integrity: sha512-4t0noZX9t6GcPTfBAbIbbIU4pfpCwh0ueq3S4O/5qXI1VwK1outmxhe9dOiEWqMz3MW2LKgDTpqWV+37IWuVbA==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + + tsconfig-paths@3.15.0: + resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==} + + tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + + tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + tsup@8.0.2: + resolution: {integrity: sha512-NY8xtQXdH7hDUAZwcQdY/Vzlw9johQsaqf7iwZ6g1DOUlFYQ5/AtVAjTvihhEyeRlGo4dLRVHtrRaL35M1daqQ==} + engines: {node: '>=18'} + hasBin: true + peerDependencies: + '@microsoft/api-extractor': ^7.36.0 + '@swc/core': ^1 + postcss: ^8.4.12 + typescript: '>=4.5.0' + peerDependenciesMeta: + '@microsoft/api-extractor': + optional: true + '@swc/core': + optional: true + postcss: + optional: true + typescript: + optional: true + + tsutils@3.21.0: + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + + tty-table@4.2.3: + resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==} + engines: {node: '>=8.0.0'} + hasBin: true + + turbo-darwin-64@1.13.3: + resolution: {integrity: sha512-glup8Qx1qEFB5jerAnXbS8WrL92OKyMmg5Hnd4PleLljAeYmx+cmmnsmLT7tpaVZIN58EAAwu8wHC6kIIqhbWA==} + cpu: [x64] + os: [darwin] + + turbo-darwin-arm64@1.13.3: + resolution: {integrity: sha512-/np2xD+f/+9qY8BVtuOQXRq5f9LehCFxamiQnwdqWm5iZmdjygC5T3uVSYuagVFsZKMvX3ycySwh8dylGTl6lg==} + cpu: [arm64] + os: [darwin] + + turbo-linux-64@1.13.3: + resolution: {integrity: sha512-G+HGrau54iAnbXLfl+N/PynqpDwi/uDzb6iM9hXEDG+yJnSJxaHMShhOkXYJPk9offm9prH33Khx2scXrYVW1g==} + cpu: [x64] + os: [linux] + + turbo-linux-arm64@1.13.3: + resolution: {integrity: sha512-qWwEl5VR02NqRyl68/3pwp3c/olZuSp+vwlwrunuoNTm6JXGLG5pTeme4zoHNnk0qn4cCX7DFrOboArlYxv0wQ==} + cpu: [arm64] + os: [linux] + + turbo-stream@2.0.1: + resolution: {integrity: sha512-sm0ZtcX9YWh28p5X8t5McxC2uthrt9p+g0bGE0KTVFhnhNWefpSVCr+67zRNDUOfo4bpXwiOp7otO+dyQ7/y/A==} + + turbo-windows-64@1.13.3: + resolution: {integrity: sha512-Nudr4bRChfJzBPzEmpVV85VwUYRCGKecwkBFpbp2a4NtrJ3+UP1VZES653ckqCu2FRyRuS0n03v9euMbAvzH+Q==} + cpu: [x64] + os: [win32] + + turbo-windows-arm64@1.13.3: + resolution: {integrity: sha512-ouJCgsVLd3icjRLmRvHQDDZnmGzT64GBupM1Y+TjtYn2LVaEBoV6hicFy8x5DUpnqdLy+YpCzRMkWlwhmkX7sQ==} + cpu: [arm64] + os: [win32] + + turbo@1.13.3: + resolution: {integrity: sha512-n17HJv4F4CpsYTvKzUJhLbyewbXjq1oLCi90i5tW1TiWDz16ML1eDG7wi5dHaKxzh5efIM56SITnuVbMq5dk4g==} + hasBin: true + + type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + + type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + + type-fest@0.13.1: + resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==} + engines: {node: '>=10'} + + type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + + type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + type-fest@0.6.0: + resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==} + engines: {node: '>=8'} + + type-fest@0.8.1: + resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} + engines: {node: '>=8'} + + type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + + typed-array-buffer@1.0.2: + resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==} + engines: {node: '>= 0.4'} + + typed-array-byte-length@1.0.1: + resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==} + engines: {node: '>= 0.4'} + + typed-array-byte-offset@1.0.2: + resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==} + engines: {node: '>= 0.4'} + + typed-array-length@1.0.6: + resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==} + engines: {node: '>= 0.4'} + + typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + typedoc-plugin-extras@3.0.0: + resolution: {integrity: sha512-eiAe3qtm2WbV5owdncpt0zHZPqsNZH2mzNGILPd4zqrvEZie3Et9es4cpGZ+8lHO/SI0pVKwsAj7IuMxPNOdYg==} + peerDependencies: + typedoc: 0.25.x + + typedoc-plugin-inline-sources@1.0.2: + resolution: {integrity: sha512-J1L2Ky6t5EeAI2fTqhcRii/ntxYN6lSPyKiaTKc/MIHgMTDh81elRvXPZFmvy+xMY9EEE9nlkUujfLGNo5c5Tw==} + engines: {node: '>= 10.8.0'} + peerDependencies: + typedoc: ^0.25.7 + + typedoc-plugin-mdn-links@3.1.24: + resolution: {integrity: sha512-incXVpVAHfK7xvA4hpj8R+Hhm51IH8f4O+ZQX7ws1JYWdFFf7Yu5sv0UWFMBmYcjjE1IovG1SEmg9XRE8bdkgg==} + peerDependencies: + typedoc: '>= 0.23.14 || 0.24.x || 0.25.x' + + typedoc-plugin-missing-exports@2.2.0: + resolution: {integrity: sha512-2+XR1IcyQ5UwXZVJe9NE6HrLmNufT9i5OwoIuuj79VxuA3eYq+Y6itS9rnNV1D7UeQnUSH8kISYD73gHE5zw+w==} + peerDependencies: + typedoc: 0.24.x || 0.25.x + + typedoc-plugin-rename-defaults@0.7.0: + resolution: {integrity: sha512-NudSQ1o/XLHNF9c4y7LzIZxfE9ltz09yCDklBPJpP5VMRvuBpYGIbQ0ZgmPz+EIV8vPx9Z/OyKwzp4HT2vDtfg==} + peerDependencies: + typedoc: 0.22.x || 0.23.x || 0.24.x || 0.25.x + + typedoc-plugin-zod@1.1.2: + resolution: {integrity: sha512-jsmuYg1xsGjwKdhKN4tgRYORnbKpU7v5B1ZpsazMH5lUsI6ZLxBqAY5iiZ06oz/01gHOsAdhpABgWD97MOjKQA==} + peerDependencies: + typedoc: 0.23.x || 0.24.x || 0.25.x + + typedoc@0.25.13: + resolution: {integrity: sha512-pQqiwiJ+Z4pigfOnnysObszLiU3mVLWAExSPf+Mu06G/qsc3wzbuM56SZQvONhHLncLUhYzOVkjFFpFfL5AzhQ==} + engines: {node: '>= 16'} + hasBin: true + peerDependencies: + typescript: 4.6.x || 4.7.x || 4.8.x || 4.9.x || 5.0.x || 5.1.x || 5.2.x || 5.3.x || 5.4.x + + typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + + uglify-js@3.17.4: + resolution: {integrity: sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==} + engines: {node: '>=0.8.0'} + hasBin: true + + unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + + unc-path-regex@0.1.2: + resolution: {integrity: sha512-eXL4nmJT7oCpkZsHZUOJo8hcX3GbsiDOa0Qu9F646fi8dT3XuSVopVqAcEiVzSKKH7UoDti23wNX3qGFxcW5Qg==} + engines: {node: '>=0.10.0'} + + undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + undici@6.16.0: + resolution: {integrity: sha512-HQfVddOTb5PJtfLnJ1Px8bNGyIg/z7WTj1hjUSna1Itsv59Oca9JdclIU08ToNqvWWXjFLRzc9rqjnpfw5UWcQ==} + engines: {node: '>=18.17'} + + unified-engine@11.2.1: + resolution: {integrity: sha512-xBAdZ8UY2X4R9Hm6X6kMne4Nz0PlpOc1oE6DPeqJnewr5Imkb8uT5Eyvy1h7xNekPL3PSWh3ZJyNrMW6jnNQBg==} + + unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + + unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + + unique-filename@3.0.0: + resolution: {integrity: sha512-afXhuC55wkAmZ0P18QsVE6kp8JaxrEokN2HGIoIVv2ijHQd419H0+6EigAFcIzXeMIkcIkNBpB3L/DXB3cTS/g==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unique-slug@4.0.0: + resolution: {integrity: sha512-WrcA6AyEfqDX5bWige/4NQfPZMtASNVxdmWR76WESYQVAACSgWcR6e9i0mofqqBxYFtL4oAxPIptY73/0YE1DQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + unist-util-generated@2.0.1: + resolution: {integrity: sha512-qF72kLmPxAw0oN2fwpWIqbXAVyEqUzDHMsbtPvOudIlUzXYFIeQIuxXQCRCFh22B7cixvU0MG7m3MW8FTq/S+A==} + + unist-util-inspect@8.0.0: + resolution: {integrity: sha512-/3Wn/wU6/H6UEo4FoYUeo8KUePN8ERiZpQYFWYoihOsr1DoDuv80PeB0hobVZyYSvALa2e556bG1A1/AbwU4yg==} + + unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + + unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + + unist-util-position-from-estree@1.1.2: + resolution: {integrity: sha512-poZa0eXpS+/XpoQwGwl79UUdea4ol2ZuCYguVaJS4qzIOMDzbqz8a3erUCOmubSZkaOuGamb3tX790iwOIROww==} + + unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + + unist-util-position@4.0.4: + resolution: {integrity: sha512-kUBE91efOWfIVBo8xzh/uZQ7p9ffYRtUbMRZBNFYwf0RK8koUMx6dGUfwylLOKmaT2cs4wSW96QoYUSXAyEtpg==} + + unist-util-remove-position@4.0.2: + resolution: {integrity: sha512-TkBb0HABNmxzAcfLf4qsIbFbaPDvMO6wa3b3j4VcEzFVaw1LBKwnW4/sRJ/atSLSzoIg41JWEdnE7N6DIhGDGQ==} + + unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + + unist-util-stringify-position@2.0.3: + resolution: {integrity: sha512-3faScn5I+hy9VleOq/qNbAd6pAx7iH5jYBMS9I1HgQVijz/4mv5Bvw5iw1sC/90CODiKo81G/ps8AJrISn687g==} + + unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + + unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + + unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + + unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + + unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + + unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + + universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + + universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + update-browserslist-db@1.0.15: + resolution: {integrity: sha512-K9HWH62x3/EalU1U6sjSZiylm9C8tgq2mSvshZpqc7QE69RaA2qjhkW2HlNA0tFpEbtyFz7HTqbSdN4MSwUodA==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + + upper-case-first@2.0.2: + resolution: {integrity: sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==} + + upper-case@2.0.2: + resolution: {integrity: sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==} + + uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + + url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + + use-editable@2.3.3: + resolution: {integrity: sha512-7wVD2JbfAFJ3DK0vITvXBdpd9JAz5BcKAAolsnLBuBn6UDDwBGuCIAGvR3yA2BNKm578vAMVHFCWaOcA+BhhiA==} + peerDependencies: + react: '>= 16.8.0' + + util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + util@0.12.5: + resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==} + + utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + uvu@0.5.6: + resolution: {integrity: sha512-+g8ENReyr8YsOc6fv/NVJs2vFdHBnBNdfE49rshrTzDWOlUx4Gq7KOS2GD8eqhy2j+Ejq29+SbKH8yjkAqXqoA==} + engines: {node: '>=8'} + hasBin: true + + v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + + v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + + v8flags@4.0.1: + resolution: {integrity: sha512-fcRLaS4H/hrZk9hYwbdRM35D0U8IYMfEClhXxCivOojl+yTRAZH3Zy2sSy6qVCiGbV9YAtPssP6jaChqC9vPCg==} + engines: {node: '>= 10.13.0'} + + validate-npm-package-license@3.0.4: + resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + + validate-npm-package-name@5.0.1: + resolution: {integrity: sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + + vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + + vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + + vfile-reporter@8.1.1: + resolution: {integrity: sha512-qxRZcnFSQt6pWKn3PAk81yLK2rO2i7CDXpy8v8ZquiEOMLSnPw6BMSi9Y1sUCwGGl7a9b3CJT1CKpnRF7pp66g==} + + vfile-sort@4.0.0: + resolution: {integrity: sha512-lffPI1JrbHDTToJwcq0rl6rBmkjQmMuXkAxsZPRS9DXbaJQvc642eCg6EGxcX2i1L+esbuhq+2l9tBll5v8AeQ==} + + vfile-statistics@3.0.0: + resolution: {integrity: sha512-/qlwqwWBWFOmpXujL/20P+Iuydil0rZZNglR+VNm6J0gpLHwuVM5s7g2TfVoswbXjZ4HuIhLMySEyIw5i7/D8w==} + + vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + + vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + + vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + + vite-tsconfig-paths@4.3.2: + resolution: {integrity: sha512-0Vd/a6po6Q+86rPlntHye7F31zA2URZMbH8M3saAZ/xR9QoGN/L21bxEGfXdWmFdNkqPpRdxFT7nmNe12e9/uA==} + peerDependencies: + vite: '*' + peerDependenciesMeta: + vite: + optional: true + + vite@5.2.11: + resolution: {integrity: sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + + vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true + + vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + + vscode-textmate@8.0.0: + resolution: {integrity: sha512-AFbieoL7a5LMqcnOF04ji+rpXadgOXnZsxQr//r83kLPr7biP7am3g9zbaZIaBGwBRWeSvoMD4mgPdX3e4NWBg==} + + w3c-xmlserializer@4.0.0: + resolution: {integrity: sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==} + engines: {node: '>=14'} + + w3c-xmlserializer@5.0.0: + resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==} + engines: {node: '>=18'} + + walk-up-path@3.0.1: + resolution: {integrity: sha512-9YlCL/ynK3CTlrSRrDxZvUauLzAswPCrsaCgilqFevUYpeEW0/3ScEjaa3kbW/T0ghhkEr7mv+fpjqn1Y1YuTA==} + + walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + + wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + + web-encoding@1.1.5: + resolution: {integrity: sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==} + + web-streams-polyfill@3.3.3: + resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} + engines: {node: '>= 8'} + + webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + + webidl-conversions@7.0.0: + resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} + engines: {node: '>=12'} + + whatwg-encoding@2.0.0: + resolution: {integrity: sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==} + engines: {node: '>=12'} + + whatwg-encoding@3.1.1: + resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} + engines: {node: '>=18'} + + whatwg-mimetype@3.0.0: + resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==} + engines: {node: '>=12'} + + whatwg-mimetype@4.0.0: + resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==} + engines: {node: '>=18'} + + whatwg-url@11.0.0: + resolution: {integrity: sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==} + engines: {node: '>=12'} + + whatwg-url@14.0.0: + resolution: {integrity: sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==} + engines: {node: '>=18'} + + whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + + which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + + which-builtin-type@1.1.3: + resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==} + engines: {node: '>= 0.4'} + + which-collection@1.0.2: + resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==} + engines: {node: '>= 0.4'} + + which-module@2.0.1: + resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} + + which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + + which-typed-array@1.1.15: + resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==} + engines: {node: '>= 0.4'} + + which@1.3.1: + resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} + hasBin: true + + which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + + which@3.0.1: + resolution: {integrity: sha512-XA1b62dzQzLfaEOSQFTCOd5KFf/1VSzZo7/7TUjnya6u0vGGKzU96UQBZTAThCb2j4/xjBAyii1OhRLJEivHvg==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} + hasBin: true + + why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + + word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + + wordwrap@1.0.0: + resolution: {integrity: sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==} + + wrap-ansi@6.2.0: + resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==} + engines: {node: '>=8'} + + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + + wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + + ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + ws@8.17.0: + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + xml-name-validator@4.0.0: + resolution: {integrity: sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==} + engines: {node: '>=12'} + + xml-name-validator@5.0.0: + resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==} + engines: {node: '>=18'} + + xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + y18n@4.0.3: + resolution: {integrity: sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==} + + y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + + yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + + yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + yaml@2.4.2: + resolution: {integrity: sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==} + engines: {node: '>= 14'} + hasBin: true + + yargs-parser@18.1.3: + resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==} + engines: {node: '>=6'} + + yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + yargs@15.4.1: + resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==} + engines: {node: '>=8'} + + yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + + yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + + zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} + +snapshots: + + '@ampproject/remapping@2.3.0': + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + + '@babel/code-frame@7.24.2': + dependencies: + '@babel/highlight': 7.24.5 + picocolors: 1.0.0 + + '@babel/compat-data@7.24.4': {} + + '@babel/core@7.24.5': + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helpers': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + '@babel/eslint-parser@7.24.5(@babel/core@7.24.5)(eslint@9.2.0)': + dependencies: + '@babel/core': 7.24.5 + '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1 + eslint: 9.2.0 + eslint-visitor-keys: 2.1.0 + semver: 6.3.1 + + '@babel/generator@7.24.5': + dependencies: + '@babel/types': 7.24.5 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + + '@babel/helper-annotate-as-pure@7.22.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-compilation-targets@7.23.6': + dependencies: + '@babel/compat-data': 7.24.4 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + + '@babel/helper-create-class-features-plugin@7.24.5(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.24.1(@babel/core@7.24.5) + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + semver: 6.3.1 + + '@babel/helper-environment-visitor@7.22.20': {} + + '@babel/helper-function-name@7.23.0': + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 + + '@babel/helper-hoist-variables@7.22.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-member-expression-to-functions@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-module-imports@7.24.3': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-module-transforms@7.24.5(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.24.3 + '@babel/helper-simple-access': 7.24.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/helper-validator-identifier': 7.24.5 + + '@babel/helper-optimise-call-expression@7.22.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-plugin-utils@7.24.5': {} + + '@babel/helper-replace-supers@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-member-expression-to-functions': 7.24.5 + '@babel/helper-optimise-call-expression': 7.22.5 + + '@babel/helper-simple-access@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-skip-transparent-expression-wrappers@7.22.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-split-export-declaration@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/helper-string-parser@7.24.1': {} + + '@babel/helper-validator-identifier@7.24.5': {} + + '@babel/helper-validator-option@7.23.5': {} + + '@babel/helpers@7.24.5': + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + transitivePeerDependencies: + - supports-color + + '@babel/highlight@7.24.5': + dependencies: + '@babel/helper-validator-identifier': 7.24.5 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + + '@babel/parser@7.24.5': + dependencies: + '@babel/types': 7.24.5 + + '@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-decorators@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-transform-modules-commonjs@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-module-transforms': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-simple-access': 7.24.5 + + '@babel/plugin-transform-react-jsx-self@7.24.5(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-transform-react-jsx-source@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + + '@babel/plugin-transform-typescript@7.24.5(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.24.5(@babel/core@7.24.5) + '@babel/helper-plugin-utils': 7.24.5 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) + + '@babel/preset-typescript@7.24.1(@babel/core@7.24.5)': + dependencies: + '@babel/core': 7.24.5 + '@babel/helper-plugin-utils': 7.24.5 + '@babel/helper-validator-option': 7.23.5 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-modules-commonjs': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-transform-typescript': 7.24.5(@babel/core@7.24.5) + + '@babel/runtime@7.24.5': + dependencies: + regenerator-runtime: 0.14.1 + + '@babel/template@7.24.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + + '@babel/traverse@7.24.5': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.24.5': + dependencies: + '@babel/helper-string-parser': 7.24.1 + '@babel/helper-validator-identifier': 7.24.5 + to-fast-properties: 2.0.0 + + '@bcoe/v8-coverage@0.2.3': {} + + '@changesets/apply-release-plan@7.0.0': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/config': 3.0.0 + '@changesets/get-version-range-type': 0.4.0 + '@changesets/git': 3.0.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + detect-indent: 6.1.0 + fs-extra: 7.0.1 + lodash.startcase: 4.4.0 + outdent: 0.5.0 + prettier: 2.8.8 + resolve-from: 5.0.0 + semver: 7.6.1 + + '@changesets/assemble-release-plan@6.0.0': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + semver: 7.6.1 + + '@changesets/changelog-git@0.2.0': + dependencies: + '@changesets/types': 6.0.0 + + '@changesets/cli@2.27.1': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/apply-release-plan': 7.0.0 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/changelog-git': 0.2.0 + '@changesets/config': 3.0.0 + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/get-release-plan': 4.0.0 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@changesets/write': 0.3.0 + '@manypkg/get-packages': 1.1.3 + '@types/semver': 7.5.8 + ansi-colors: 4.1.3 + chalk: 2.4.2 + ci-info: 3.9.0 + enquirer: 2.4.1 + external-editor: 3.1.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + meow: 6.1.1 + outdent: 0.5.0 + p-limit: 2.3.0 + preferred-pm: 3.1.3 + resolve-from: 5.0.0 + semver: 7.6.1 + spawndamnit: 2.0.0 + term-size: 2.2.1 + tty-table: 4.2.3 + + '@changesets/config@3.0.0': + dependencies: + '@changesets/errors': 0.2.0 + '@changesets/get-dependents-graph': 2.0.0 + '@changesets/logger': 0.1.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + micromatch: 4.0.5 + + '@changesets/errors@0.2.0': + dependencies: + extendable-error: 0.1.7 + + '@changesets/get-dependents-graph@2.0.0': + dependencies: + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + chalk: 2.4.2 + fs-extra: 7.0.1 + semver: 7.6.1 + + '@changesets/get-release-plan@4.0.0': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/assemble-release-plan': 6.0.0 + '@changesets/config': 3.0.0 + '@changesets/pre': 2.0.0 + '@changesets/read': 0.6.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + + '@changesets/get-version-range-type@0.4.0': {} + + '@changesets/git@3.0.0': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + is-subdir: 1.2.0 + micromatch: 4.0.5 + spawndamnit: 2.0.0 + + '@changesets/logger@0.1.0': + dependencies: + chalk: 2.4.2 + + '@changesets/parse@0.4.0': + dependencies: + '@changesets/types': 6.0.0 + js-yaml: 3.14.1 + + '@changesets/pre@2.0.0': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/errors': 0.2.0 + '@changesets/types': 6.0.0 + '@manypkg/get-packages': 1.1.3 + fs-extra: 7.0.1 + + '@changesets/read@0.6.0': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/git': 3.0.0 + '@changesets/logger': 0.1.0 + '@changesets/parse': 0.4.0 + '@changesets/types': 6.0.0 + chalk: 2.4.2 + fs-extra: 7.0.1 + p-filter: 2.1.0 + + '@changesets/types@4.1.0': {} + + '@changesets/types@6.0.0': {} + + '@changesets/write@0.3.0': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/types': 6.0.0 + fs-extra: 7.0.1 + human-id: 1.0.2 + prettier: 2.8.8 + + '@cspotcode/source-map-support@0.8.1': + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + optional: true + + '@emotion/hash@0.9.1': {} + + '@esbuild/aix-ppc64@0.19.12': + optional: true + + '@esbuild/aix-ppc64@0.20.2': + optional: true + + '@esbuild/android-arm64@0.17.6': + optional: true + + '@esbuild/android-arm64@0.19.12': + optional: true + + '@esbuild/android-arm64@0.20.2': + optional: true + + '@esbuild/android-arm@0.17.6': + optional: true + + '@esbuild/android-arm@0.19.12': + optional: true + + '@esbuild/android-arm@0.20.2': + optional: true + + '@esbuild/android-x64@0.17.6': + optional: true + + '@esbuild/android-x64@0.19.12': + optional: true + + '@esbuild/android-x64@0.20.2': + optional: true + + '@esbuild/darwin-arm64@0.17.6': + optional: true + + '@esbuild/darwin-arm64@0.19.12': + optional: true + + '@esbuild/darwin-arm64@0.20.2': + optional: true + + '@esbuild/darwin-x64@0.17.6': + optional: true + + '@esbuild/darwin-x64@0.19.12': + optional: true + + '@esbuild/darwin-x64@0.20.2': + optional: true + + '@esbuild/freebsd-arm64@0.17.6': + optional: true + + '@esbuild/freebsd-arm64@0.19.12': + optional: true + + '@esbuild/freebsd-arm64@0.20.2': + optional: true + + '@esbuild/freebsd-x64@0.17.6': + optional: true + + '@esbuild/freebsd-x64@0.19.12': + optional: true + + '@esbuild/freebsd-x64@0.20.2': + optional: true + + '@esbuild/linux-arm64@0.17.6': + optional: true + + '@esbuild/linux-arm64@0.19.12': + optional: true + + '@esbuild/linux-arm64@0.20.2': + optional: true + + '@esbuild/linux-arm@0.17.6': + optional: true + + '@esbuild/linux-arm@0.19.12': + optional: true + + '@esbuild/linux-arm@0.20.2': + optional: true + + '@esbuild/linux-ia32@0.17.6': + optional: true + + '@esbuild/linux-ia32@0.19.12': + optional: true + + '@esbuild/linux-ia32@0.20.2': + optional: true + + '@esbuild/linux-loong64@0.17.6': + optional: true + + '@esbuild/linux-loong64@0.19.12': + optional: true + + '@esbuild/linux-loong64@0.20.2': + optional: true + + '@esbuild/linux-mips64el@0.17.6': + optional: true + + '@esbuild/linux-mips64el@0.19.12': + optional: true + + '@esbuild/linux-mips64el@0.20.2': + optional: true + + '@esbuild/linux-ppc64@0.17.6': + optional: true + + '@esbuild/linux-ppc64@0.19.12': + optional: true + + '@esbuild/linux-ppc64@0.20.2': + optional: true + + '@esbuild/linux-riscv64@0.17.6': + optional: true + + '@esbuild/linux-riscv64@0.19.12': + optional: true + + '@esbuild/linux-riscv64@0.20.2': + optional: true + + '@esbuild/linux-s390x@0.17.6': + optional: true + + '@esbuild/linux-s390x@0.19.12': + optional: true + + '@esbuild/linux-s390x@0.20.2': + optional: true + + '@esbuild/linux-x64@0.17.6': + optional: true + + '@esbuild/linux-x64@0.19.12': + optional: true + + '@esbuild/linux-x64@0.20.2': + optional: true + + '@esbuild/netbsd-x64@0.17.6': + optional: true + + '@esbuild/netbsd-x64@0.19.12': + optional: true + + '@esbuild/netbsd-x64@0.20.2': + optional: true + + '@esbuild/openbsd-x64@0.17.6': + optional: true + + '@esbuild/openbsd-x64@0.19.12': + optional: true + + '@esbuild/openbsd-x64@0.20.2': + optional: true + + '@esbuild/sunos-x64@0.17.6': + optional: true + + '@esbuild/sunos-x64@0.19.12': + optional: true + + '@esbuild/sunos-x64@0.20.2': + optional: true + + '@esbuild/win32-arm64@0.17.6': + optional: true + + '@esbuild/win32-arm64@0.19.12': + optional: true + + '@esbuild/win32-arm64@0.20.2': + optional: true + + '@esbuild/win32-ia32@0.17.6': + optional: true + + '@esbuild/win32-ia32@0.19.12': + optional: true + + '@esbuild/win32-ia32@0.20.2': + optional: true + + '@esbuild/win32-x64@0.17.6': + optional: true + + '@esbuild/win32-x64@0.19.12': + optional: true + + '@esbuild/win32-x64@0.20.2': + optional: true + + '@eslint-community/eslint-utils@4.4.0(eslint@9.2.0)': + dependencies: + eslint: 9.2.0 + eslint-visitor-keys: 3.4.3 + + '@eslint-community/regexpp@4.10.0': {} + + '@eslint/eslintrc@2.1.4': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/eslintrc@3.0.2': + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 10.0.1 + globals: 14.0.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + + '@eslint/js@9.2.0': {} + + '@humanwhocodes/config-array@0.13.0': + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + + '@humanwhocodes/module-importer@1.0.1': {} + + '@humanwhocodes/object-schema@2.0.3': {} + + '@humanwhocodes/retry@0.2.4': {} + + '@inquirer/figures@1.0.1': {} + + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@istanbuljs/load-nyc-config@1.1.0': + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + + '@istanbuljs/schema@0.1.3': {} + + '@jest/console@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + + '@jest/core@29.7.0(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))': + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + + '@jest/environment@29.7.0': + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + jest-mock: 29.7.0 + + '@jest/expect-utils@29.7.0': + dependencies: + jest-get-type: 29.6.3 + + '@jest/expect@29.7.0': + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/fake-timers@29.7.0': + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 20.12.10 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + '@jest/globals@29.7.0': + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + + '@jest/reporters@29.7.0': + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 20.12.10 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + + '@jest/schemas@29.6.3': + dependencies: + '@sinclair/typebox': 0.27.8 + + '@jest/source-map@29.6.3': + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + + '@jest/test-result@29.7.0': + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + + '@jest/test-sequencer@29.7.0': + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + + '@jest/transform@29.7.0': + dependencies: + '@babel/core': 7.24.5 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + + '@jest/types@29.6.3': + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 20.12.10 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + + '@jridgewell/gen-mapping@0.3.5': + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + + '@jridgewell/resolve-uri@3.1.2': {} + + '@jridgewell/set-array@1.2.1': {} + + '@jridgewell/sourcemap-codec@1.4.15': {} + + '@jridgewell/trace-mapping@0.3.25': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + + '@jridgewell/trace-mapping@0.3.9': + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + optional: true + + '@jspm/core@2.0.1': {} + + '@ljharb/through@2.3.13': + dependencies: + call-bind: 1.0.7 + + '@manypkg/find-root@1.1.0': + dependencies: + '@babel/runtime': 7.24.5 + '@types/node': 12.20.55 + find-up: 4.1.0 + fs-extra: 8.1.0 + + '@manypkg/get-packages@1.1.3': + dependencies: + '@babel/runtime': 7.24.5 + '@changesets/types': 4.1.0 + '@manypkg/find-root': 1.1.0 + fs-extra: 8.1.0 + globby: 11.1.0 + read-yaml-file: 1.1.0 + + '@mayank1513/fork-me@2.1.2(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1)': + dependencies: + '@types/react': 18.3.1 + react: 18.3.1 + optionalDependencies: + next: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) + + '@mdx-js/mdx@2.3.0': + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/mdx': 2.0.13 + estree-util-build-jsx: 2.2.2 + estree-util-is-identifier-name: 2.1.0 + estree-util-to-js: 1.2.0 + estree-walker: 3.0.3 + hast-util-to-estree: 2.3.3 + markdown-extensions: 1.1.1 + periscopic: 3.1.0 + remark-mdx: 2.3.0 + remark-parse: 10.0.2 + remark-rehype: 10.1.0 + unified: 10.1.2 + unist-util-position-from-estree: 1.1.2 + unist-util-stringify-position: 3.0.3 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + + '@microsoft/tsdoc-config@0.16.2': + dependencies: + '@microsoft/tsdoc': 0.14.2 + ajv: 6.12.6 + jju: 1.4.0 + resolve: 1.19.0 + + '@microsoft/tsdoc@0.14.2': {} + + '@next/env@14.2.3': {} + + '@next/eslint-plugin-next@14.2.3': + dependencies: + glob: 10.3.10 + + '@next/swc-darwin-arm64@14.2.3': + optional: true + + '@next/swc-darwin-x64@14.2.3': + optional: true + + '@next/swc-linux-arm64-gnu@14.2.3': + optional: true + + '@next/swc-linux-arm64-musl@14.2.3': + optional: true + + '@next/swc-linux-x64-gnu@14.2.3': + optional: true + + '@next/swc-linux-x64-musl@14.2.3': + optional: true + + '@next/swc-win32-arm64-msvc@14.2.3': + optional: true + + '@next/swc-win32-ia32-msvc@14.2.3': + optional: true + + '@next/swc-win32-x64-msvc@14.2.3': + optional: true + + '@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1': + dependencies: + eslint-scope: 5.1.1 + + '@nodelib/fs.scandir@2.1.5': + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + '@nodelib/fs.stat@2.0.5': {} + + '@nodelib/fs.walk@1.2.8': + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + '@npmcli/config@8.3.1': + dependencies: + '@npmcli/map-workspaces': 3.0.6 + ci-info: 4.0.0 + ini: 4.1.2 + nopt: 7.2.1 + proc-log: 4.2.0 + read-package-json-fast: 3.0.2 + semver: 7.6.1 + walk-up-path: 3.0.1 + + '@npmcli/fs@3.1.1': + dependencies: + semver: 7.6.1 + + '@npmcli/git@4.1.0': + dependencies: + '@npmcli/promise-spawn': 6.0.2 + lru-cache: 7.18.3 + npm-pick-manifest: 8.0.2 + proc-log: 3.0.0 + promise-inflight: 1.0.1 + promise-retry: 2.0.1 + semver: 7.6.1 + which: 3.0.1 + transitivePeerDependencies: + - bluebird + + '@npmcli/map-workspaces@3.0.6': + dependencies: + '@npmcli/name-from-folder': 2.0.0 + glob: 10.3.12 + minimatch: 9.0.4 + read-package-json-fast: 3.0.2 + + '@npmcli/name-from-folder@2.0.0': {} + + '@npmcli/package-json@4.0.1': + dependencies: + '@npmcli/git': 4.1.0 + glob: 10.3.12 + hosted-git-info: 6.1.1 + json-parse-even-better-errors: 3.0.2 + normalize-package-data: 5.0.0 + proc-log: 3.0.0 + semver: 7.6.1 + transitivePeerDependencies: + - bluebird + + '@npmcli/promise-spawn@6.0.2': + dependencies: + which: 3.0.1 + + '@pkgjs/parseargs@0.11.0': + optional: true + + '@pkgr/core@0.1.1': {} + + '@remix-run/dev@2.9.1(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@remix-run/serve@2.9.1(typescript@5.4.5))(@types/node@20.12.10)(sass@1.77.0)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0))': + dependencies: + '@babel/core': 7.24.5 + '@babel/generator': 7.24.5 + '@babel/parser': 7.24.5 + '@babel/plugin-syntax-decorators': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) + '@babel/preset-typescript': 7.24.1(@babel/core@7.24.5) + '@babel/traverse': 7.24.5 + '@babel/types': 7.24.5 + '@mdx-js/mdx': 2.3.0 + '@npmcli/package-json': 4.0.1 + '@remix-run/node': 2.9.1(typescript@5.4.5) + '@remix-run/react': 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + '@remix-run/router': 1.16.0 + '@remix-run/server-runtime': 2.9.1(typescript@5.4.5) + '@types/mdx': 2.0.13 + '@vanilla-extract/integration': 6.5.0(@types/node@20.12.10)(sass@1.77.0) + arg: 5.0.2 + cacache: 17.1.4 + chalk: 4.1.2 + chokidar: 3.6.0 + cross-spawn: 7.0.3 + dotenv: 16.4.5 + es-module-lexer: 1.5.2 + esbuild: 0.17.6 + esbuild-plugins-node-modules-polyfill: 1.6.3(esbuild@0.17.6) + execa: 5.1.1 + exit-hook: 2.2.1 + express: 4.19.2 + fs-extra: 10.1.0 + get-port: 5.1.1 + gunzip-maybe: 1.4.2 + jsesc: 3.0.2 + json5: 2.2.3 + lodash: 4.17.21 + lodash.debounce: 4.0.8 + minimatch: 9.0.4 + ora: 5.4.1 + picocolors: 1.0.0 + picomatch: 2.3.1 + pidtree: 0.6.0 + postcss: 8.4.38 + postcss-discard-duplicates: 5.1.0(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + postcss-modules: 6.0.0(postcss@8.4.38) + prettier: 2.8.8 + pretty-ms: 7.0.1 + react-refresh: 0.14.2 + remark-frontmatter: 4.0.1 + remark-mdx-frontmatter: 1.1.1 + semver: 7.6.1 + set-cookie-parser: 2.6.0 + tar-fs: 2.1.1 + tsconfig-paths: 4.2.0 + ws: 7.5.9 + optionalDependencies: + '@remix-run/serve': 2.9.1(typescript@5.4.5) + typescript: 5.4.5 + vite: 5.2.11(@types/node@20.12.10)(sass@1.77.0) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - bluebird + - bufferutil + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - ts-node + - utf-8-validate + + '@remix-run/express@2.9.1(express@4.19.2)(typescript@5.4.5)': + dependencies: + '@remix-run/node': 2.9.1(typescript@5.4.5) + express: 4.19.2 + optionalDependencies: + typescript: 5.4.5 + + '@remix-run/node@1.12.0': + dependencies: + '@remix-run/server-runtime': 1.12.0 + '@remix-run/web-fetch': 4.4.2 + '@remix-run/web-file': 3.1.0 + '@remix-run/web-stream': 1.1.0 + '@web3-storage/multipart-parser': 1.0.0 + abort-controller: 3.0.0 + cookie-signature: 1.2.1 + source-map-support: 0.5.21 + stream-slice: 0.1.2 + + '@remix-run/node@2.9.1(typescript@5.4.5)': + dependencies: + '@remix-run/server-runtime': 2.9.1(typescript@5.4.5) + '@remix-run/web-fetch': 4.4.2 + '@web3-storage/multipart-parser': 1.0.0 + cookie-signature: 1.2.1 + source-map-support: 0.5.21 + stream-slice: 0.1.2 + undici: 6.16.0 + optionalDependencies: + typescript: 5.4.5 + + '@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5)': + dependencies: + '@remix-run/router': 1.16.0 + '@remix-run/server-runtime': 2.9.1(typescript@5.4.5) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.23.0(react@18.3.1) + react-router-dom: 6.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1) + turbo-stream: 2.0.1 + optionalDependencies: + typescript: 5.4.5 + + '@remix-run/router@1.16.0': {} + + '@remix-run/router@1.3.1': {} + + '@remix-run/serve@2.9.1(typescript@5.4.5)': + dependencies: + '@remix-run/express': 2.9.1(express@4.19.2)(typescript@5.4.5) + '@remix-run/node': 2.9.1(typescript@5.4.5) + chokidar: 3.6.0 + compression: 1.7.4 + express: 4.19.2 + get-port: 5.1.1 + morgan: 1.10.0 + source-map-support: 0.5.21 + transitivePeerDependencies: + - supports-color + - typescript + + '@remix-run/server-runtime@1.12.0': + dependencies: + '@remix-run/router': 1.3.1 + '@types/cookie': 0.4.1 + '@types/react': 18.3.1 + '@web3-storage/multipart-parser': 1.0.0 + cookie: 0.4.2 + set-cookie-parser: 2.6.0 + source-map: 0.7.4 + + '@remix-run/server-runtime@2.9.1(typescript@5.4.5)': + dependencies: + '@remix-run/router': 1.16.0 + '@types/cookie': 0.6.0 + '@web3-storage/multipart-parser': 1.0.0 + cookie: 0.6.0 + set-cookie-parser: 2.6.0 + source-map: 0.7.4 + turbo-stream: 2.0.1 + optionalDependencies: + typescript: 5.4.5 + + '@remix-run/web-blob@3.1.0': + dependencies: + '@remix-run/web-stream': 1.1.0 + web-encoding: 1.1.5 + + '@remix-run/web-fetch@4.4.2': + dependencies: + '@remix-run/web-blob': 3.1.0 + '@remix-run/web-file': 3.1.0 + '@remix-run/web-form-data': 3.1.0 + '@remix-run/web-stream': 1.1.0 + '@web3-storage/multipart-parser': 1.0.0 + abort-controller: 3.0.0 + data-uri-to-buffer: 3.0.1 + mrmime: 1.0.1 + + '@remix-run/web-file@3.1.0': + dependencies: + '@remix-run/web-blob': 3.1.0 + + '@remix-run/web-form-data@3.1.0': + dependencies: + web-encoding: 1.1.5 + + '@remix-run/web-stream@1.1.0': + dependencies: + web-streams-polyfill: 3.3.3 + + '@rollup/rollup-android-arm-eabi@4.17.2': + optional: true + + '@rollup/rollup-android-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-arm64@4.17.2': + optional: true + + '@rollup/rollup-darwin-x64@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-gnueabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm-musleabihf@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-arm64-musl@4.17.2': + optional: true + + '@rollup/rollup-linux-powerpc64le-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-riscv64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-s390x-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-gnu@4.17.2': + optional: true + + '@rollup/rollup-linux-x64-musl@4.17.2': + optional: true + + '@rollup/rollup-win32-arm64-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-ia32-msvc@4.17.2': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.17.2': + optional: true + + '@rushstack/eslint-patch@1.10.2': {} + + '@sinclair/typebox@0.27.8': {} + + '@sinonjs/commons@3.0.1': + dependencies: + type-detect: 4.0.8 + + '@sinonjs/fake-timers@10.3.0': + dependencies: + '@sinonjs/commons': 3.0.1 + + '@storybook/csf@0.0.1': + dependencies: + lodash: 4.17.21 + + '@swc/counter@0.1.3': {} + + '@swc/helpers@0.5.5': + dependencies: + '@swc/counter': 0.1.3 + tslib: 2.6.2 + + '@testing-library/dom@10.1.0': + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/runtime': 7.24.5 + '@types/aria-query': 5.0.4 + aria-query: 5.3.0 + chalk: 4.1.2 + dom-accessibility-api: 0.5.16 + lz-string: 1.5.0 + pretty-format: 27.5.1 + + '@testing-library/react@15.0.7(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)': + dependencies: + '@babel/runtime': 7.24.5 + '@testing-library/dom': 10.1.0 + '@types/react-dom': 18.3.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + optionalDependencies: + '@types/react': 18.3.1 + + '@tootallnate/once@2.0.0': {} + + '@tsconfig/node10@1.0.11': + optional: true + + '@tsconfig/node12@1.0.11': + optional: true + + '@tsconfig/node14@1.0.3': + optional: true + + '@tsconfig/node16@1.0.4': + optional: true + + '@types/acorn@4.0.6': + dependencies: + '@types/estree': 1.0.5 + + '@types/aria-query@5.0.4': {} + + '@types/babel__core@7.20.5': + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.5 + + '@types/babel__generator@7.6.8': + dependencies: + '@babel/types': 7.24.5 + + '@types/babel__template@7.4.4': + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + + '@types/babel__traverse@7.20.5': + dependencies: + '@babel/types': 7.24.5 + + '@types/body-parser@1.19.5': + dependencies: + '@types/connect': 3.4.38 + '@types/node': 20.12.10 + + '@types/concat-stream@2.0.3': + dependencies: + '@types/node': 20.12.10 + + '@types/connect@3.4.38': + dependencies: + '@types/node': 20.12.10 + + '@types/cookie@0.4.1': {} + + '@types/cookie@0.6.0': {} + + '@types/cookiejar@2.1.5': {} + + '@types/cors@2.8.17': + dependencies: + '@types/node': 20.12.10 + + '@types/debug@4.1.12': + dependencies: + '@types/ms': 0.7.34 + + '@types/estree-jsx@1.0.5': + dependencies: + '@types/estree': 1.0.5 + + '@types/estree@1.0.5': {} + + '@types/express-serve-static-core@4.19.0': + dependencies: + '@types/node': 20.12.10 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + + '@types/express@4.17.21': + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.0 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + + '@types/fined@1.1.5': {} + + '@types/graceful-fs@4.1.9': + dependencies: + '@types/node': 20.12.10 + + '@types/hast@2.3.10': + dependencies: + '@types/unist': 2.0.10 + + '@types/hast@3.0.4': + dependencies: + '@types/unist': 3.0.2 + + '@types/http-errors@2.0.4': {} + + '@types/inquirer@9.0.7': + dependencies: + '@types/through': 0.0.33 + rxjs: 7.8.1 + + '@types/is-empty@1.2.3': {} + + '@types/istanbul-lib-coverage@2.0.6': {} + + '@types/istanbul-lib-report@3.0.3': + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + + '@types/istanbul-reports@3.0.4': + dependencies: + '@types/istanbul-lib-report': 3.0.3 + + '@types/jest@29.5.12': + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + + '@types/jsdom@20.0.1': + dependencies: + '@types/node': 20.12.10 + '@types/tough-cookie': 4.0.5 + parse5: 7.1.2 + + '@types/json-schema@7.0.15': {} + + '@types/json5@0.0.29': {} + + '@types/liftoff@4.0.3': + dependencies: + '@types/fined': 1.1.5 + '@types/node': 20.12.10 + + '@types/mdast@3.0.15': + dependencies: + '@types/unist': 2.0.10 + + '@types/mdast@4.0.3': + dependencies: + '@types/unist': 3.0.2 + + '@types/mdx@2.0.13': {} + + '@types/methods@1.1.4': {} + + '@types/mime@1.3.5': {} + + '@types/minimist@1.2.5': {} + + '@types/morgan@1.9.9': + dependencies: + '@types/node': 20.12.10 + + '@types/ms@0.7.34': {} + + '@types/node@12.20.55': {} + + '@types/node@20.12.10': + dependencies: + undici-types: 5.26.5 + + '@types/normalize-package-data@2.4.4': {} + + '@types/prismjs@1.26.4': {} + + '@types/prop-types@15.7.12': {} + + '@types/qs@6.9.15': {} + + '@types/range-parser@1.2.7': {} + + '@types/react-dom@18.3.0': + dependencies: + '@types/react': 18.3.1 + + '@types/react@18.3.1': + dependencies: + '@types/prop-types': 15.7.12 + csstype: 3.1.3 + + '@types/semver@7.5.8': {} + + '@types/send@0.17.4': + dependencies: + '@types/mime': 1.3.5 + '@types/node': 20.12.10 + + '@types/serve-static@1.15.7': + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 20.12.10 + '@types/send': 0.17.4 + + '@types/stack-utils@2.0.3': {} + + '@types/superagent@8.1.7': + dependencies: + '@types/cookiejar': 2.1.5 + '@types/methods': 1.1.4 + '@types/node': 20.12.10 + + '@types/supertest@6.0.2': + dependencies: + '@types/methods': 1.1.4 + '@types/superagent': 8.1.7 + + '@types/supports-color@8.1.3': {} + + '@types/through@0.0.33': + dependencies: + '@types/node': 20.12.10 + + '@types/tough-cookie@4.0.5': {} + + '@types/unist@2.0.10': {} + + '@types/unist@3.0.2': {} + + '@types/yargs-parser@21.0.3': {} + + '@types/yargs@17.0.32': + dependencies: + '@types/yargs-parser': 21.0.3 + + '@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/type-utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + '@typescript-eslint/utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.3.4 + eslint: 9.2.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.1 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.3.4 + eslint: 9.2.0 + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/scope-manager@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + + '@typescript-eslint/scope-manager@7.8.0': + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + + '@typescript-eslint/type-utils@7.8.0(eslint@9.2.0)(typescript@5.4.5)': + dependencies: + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + '@typescript-eslint/utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + debug: 4.3.4 + eslint: 9.2.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/types@5.62.0': {} + + '@typescript-eslint/types@7.8.0': {} + + '@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.6.1 + tsutils: 3.21.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@7.8.0(typescript@5.4.5)': + dependencies: + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/visitor-keys': 7.8.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.4 + semver: 7.6.1 + ts-api-utils: 1.3.0(typescript@5.4.5) + optionalDependencies: + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/utils@5.62.0(eslint@9.2.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.5) + eslint: 9.2.0 + eslint-scope: 5.1.1 + semver: 7.6.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/utils@7.8.0(eslint@9.2.0)(typescript@5.4.5)': + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 7.8.0 + '@typescript-eslint/types': 7.8.0 + '@typescript-eslint/typescript-estree': 7.8.0(typescript@5.4.5) + eslint: 9.2.0 + semver: 7.6.1 + transitivePeerDependencies: + - supports-color + - typescript + + '@typescript-eslint/visitor-keys@5.62.0': + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + + '@typescript-eslint/visitor-keys@7.8.0': + dependencies: + '@typescript-eslint/types': 7.8.0 + eslint-visitor-keys: 3.4.3 + + '@vanilla-extract/babel-plugin-debug-ids@1.0.5': + dependencies: + '@babel/core': 7.24.5 + transitivePeerDependencies: + - supports-color + + '@vanilla-extract/css@1.15.1': + dependencies: + '@emotion/hash': 0.9.1 + '@vanilla-extract/private': 1.0.4 + css-what: 6.1.0 + cssesc: 3.0.0 + csstype: 3.1.3 + dedent: 1.5.3 + deep-object-diff: 1.1.9 + deepmerge: 4.3.1 + media-query-parser: 2.0.2 + modern-ahocorasick: 1.0.1 + picocolors: 1.0.0 + transitivePeerDependencies: + - babel-plugin-macros + + '@vanilla-extract/integration@6.5.0(@types/node@20.12.10)(sass@1.77.0)': + dependencies: + '@babel/core': 7.24.5 + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) + '@vanilla-extract/babel-plugin-debug-ids': 1.0.5 + '@vanilla-extract/css': 1.15.1 + esbuild: 0.17.6 + eval: 0.1.8 + find-up: 5.0.0 + javascript-stringify: 2.1.0 + lodash: 4.17.21 + mlly: 1.7.0 + outdent: 0.8.0 + vite: 5.2.11(@types/node@20.12.10)(sass@1.77.0) + vite-node: 1.6.0(@types/node@20.12.10)(sass@1.77.0) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + '@vanilla-extract/private@1.0.4': {} + + '@vercel/analytics@1.2.2(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1)': + dependencies: + server-only: 0.0.1 + optionalDependencies: + next: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) + react: 18.3.1 + + '@vercel/remix-entry-server@0.1.1(react@18.3.1)': + dependencies: + '@remix-run/node': 1.12.0 + isbot: 3.6.5 + react: 18.3.1 + react-dom: 18.2.0(react@18.3.1) + + '@vercel/style-guide@6.0.0(@next/eslint-plugin-next@14.2.3)(eslint@9.2.0)(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(prettier@3.2.5)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0))': + dependencies: + '@babel/core': 7.24.5 + '@babel/eslint-parser': 7.24.5(@babel/core@7.24.5)(eslint@9.2.0) + '@rushstack/eslint-patch': 1.10.2 + '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5) + '@typescript-eslint/parser': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + eslint-config-prettier: 9.1.0(eslint@9.2.0) + eslint-import-resolver-alias: 1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@9.2.0)) + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@9.2.0) + eslint-plugin-eslint-comments: 3.2.0(eslint@9.2.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@9.2.0) + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(typescript@5.4.5) + eslint-plugin-jsx-a11y: 6.8.0(eslint@9.2.0) + eslint-plugin-playwright: 1.6.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(typescript@5.4.5))(eslint@9.2.0) + eslint-plugin-react: 7.34.1(eslint@9.2.0) + eslint-plugin-react-hooks: 4.6.2(eslint@9.2.0) + eslint-plugin-testing-library: 6.2.2(eslint@9.2.0)(typescript@5.4.5) + eslint-plugin-tsdoc: 0.2.17 + eslint-plugin-unicorn: 51.0.1(eslint@9.2.0) + eslint-plugin-vitest: 0.3.26(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) + prettier-plugin-packagejson: 2.5.0(prettier@3.2.5) + optionalDependencies: + '@next/eslint-plugin-next': 14.2.3 + eslint: 9.2.0 + prettier: 3.2.5 + typescript: 5.4.5 + transitivePeerDependencies: + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - jest + - supports-color + - vitest + + '@vitejs/plugin-react@4.2.1(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0))': + dependencies: + '@babel/core': 7.24.5 + '@babel/plugin-transform-react-jsx-self': 7.24.5(@babel/core@7.24.5) + '@babel/plugin-transform-react-jsx-source': 7.24.1(@babel/core@7.24.5) + '@types/babel__core': 7.20.5 + react-refresh: 0.14.2 + vite: 5.2.11(@types/node@20.12.10)(sass@1.77.0) + transitivePeerDependencies: + - supports-color + + '@vitest/coverage-v8@1.6.0(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0))': + dependencies: + '@ampproject/remapping': 2.3.0 + '@bcoe/v8-coverage': 0.2.3 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 5.0.4 + istanbul-reports: 3.1.7 + magic-string: 0.30.10 + magicast: 0.3.4 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + test-exclude: 6.0.0 + vitest: 1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0) + transitivePeerDependencies: + - supports-color + + '@vitest/expect@1.6.0': + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.4.1 + + '@vitest/runner@1.6.0': + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + + '@vitest/snapshot@1.6.0': + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + + '@vitest/spy@1.6.0': + dependencies: + tinyspy: 2.2.1 + + '@vitest/utils@1.6.0': + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + + '@web3-storage/multipart-parser@1.0.0': {} + + '@zxing/text-encoding@0.9.0': + optional: true + + abab@2.0.6: {} + + abbrev@2.0.0: {} + + abort-controller@3.0.0: + dependencies: + event-target-shim: 5.0.1 + + accepts@1.3.8: + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + acorn-globals@7.0.1: + dependencies: + acorn: 8.11.3 + acorn-walk: 8.3.2 + + acorn-jsx@5.3.2(acorn@8.11.3): + dependencies: + acorn: 8.11.3 + + acorn-walk@8.3.2: {} + + acorn@8.11.3: {} + + agent-base@6.0.2: + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + agent-base@7.1.1: + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + aggregate-error@3.1.0: + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + + aggregate-error@4.0.1: + dependencies: + clean-stack: 4.2.0 + indent-string: 5.0.0 + + ajv@6.12.6: + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + ansi-colors@4.1.3: {} + + ansi-escapes@4.3.2: + dependencies: + type-fest: 0.21.3 + + ansi-regex@5.0.1: {} + + ansi-regex@6.0.1: {} + + ansi-sequence-parser@1.1.1: {} + + ansi-styles@3.2.1: + dependencies: + color-convert: 1.9.3 + + ansi-styles@4.3.0: + dependencies: + color-convert: 2.0.1 + + ansi-styles@5.2.0: {} + + ansi-styles@6.2.1: {} + + any-promise@1.3.0: {} + + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + arg@4.1.3: + optional: true + + arg@5.0.2: {} + + argparse@1.0.10: + dependencies: + sprintf-js: 1.0.3 + + argparse@2.0.1: {} + + aria-query@5.3.0: + dependencies: + dequal: 2.0.3 + + array-buffer-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + is-array-buffer: 3.0.4 + + array-each@1.0.1: {} + + array-flatten@1.1.1: {} + + array-includes@3.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + is-string: 1.0.7 + + array-slice@1.1.0: {} + + array-union@2.1.0: {} + + array.prototype.findlast@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.findlastindex@1.2.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-shim-unscopables: 1.0.2 + + array.prototype.flat@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.flatmap@1.3.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.toreversed@1.1.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-shim-unscopables: 1.0.2 + + array.prototype.tosorted@1.1.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-shim-unscopables: 1.0.2 + + arraybuffer.prototype.slice@1.0.3: + dependencies: + array-buffer-byte-length: 1.0.1 + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + is-array-buffer: 3.0.4 + is-shared-array-buffer: 1.0.3 + + arrify@1.0.1: {} + + asap@2.0.6: {} + + assertion-error@1.1.0: {} + + ast-types-flow@0.0.8: {} + + astring@1.8.6: {} + + asynckit@0.4.0: {} + + autoprefixer@10.4.19(postcss@8.4.38): + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001616 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + + available-typed-arrays@1.0.7: + dependencies: + possible-typed-array-names: 1.0.0 + + axe-core@4.7.0: {} + + axobject-query@3.2.1: + dependencies: + dequal: 2.0.3 + + babel-jest@29.7.0(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.24.5) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-istanbul@6.1.1: + dependencies: + '@babel/helper-plugin-utils': 7.24.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + + babel-plugin-jest-hoist@29.6.3: + dependencies: + '@babel/template': 7.24.0 + '@babel/types': 7.24.5 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.5 + + babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.5) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.5) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.5) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.5) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.5) + + babel-preset-jest@29.6.3(@babel/core@7.24.5): + dependencies: + '@babel/core': 7.24.5 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) + + bail@2.0.2: {} + + balanced-match@1.0.2: {} + + base64-js@1.5.1: {} + + basic-auth@2.0.1: + dependencies: + safe-buffer: 5.1.2 + + better-path-resolve@1.0.0: + dependencies: + is-windows: 1.0.2 + + binary-extensions@2.3.0: {} + + bl@4.1.0: + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + body-parser@1.20.2: + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + brace-expansion@1.1.11: + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + brace-expansion@2.0.1: + dependencies: + balanced-match: 1.0.2 + + braces@3.0.2: + dependencies: + fill-range: 7.0.1 + + breakword@1.0.6: + dependencies: + wcwidth: 1.0.1 + + browserify-zlib@0.1.4: + dependencies: + pako: 0.2.9 + + browserslist@4.23.0: + dependencies: + caniuse-lite: 1.0.30001616 + electron-to-chromium: 1.4.758 + node-releases: 2.0.14 + update-browserslist-db: 1.0.15(browserslist@4.23.0) + + bs-logger@0.2.6: + dependencies: + fast-json-stable-stringify: 2.1.0 + + bser@2.1.1: + dependencies: + node-int64: 0.4.0 + + buffer-from@1.1.2: {} + + buffer@5.7.1: + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + builtin-modules@3.3.0: {} + + bundle-require@4.1.0(esbuild@0.19.12): + dependencies: + esbuild: 0.19.12 + load-tsconfig: 0.2.5 + + busboy@1.6.0: + dependencies: + streamsearch: 1.1.0 + + bytes@3.0.0: {} + + bytes@3.1.2: {} + + cac@6.7.14: {} + + cacache@17.1.4: + dependencies: + '@npmcli/fs': 3.1.1 + fs-minipass: 3.0.3 + glob: 10.3.12 + lru-cache: 7.18.3 + minipass: 7.1.0 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + p-map: 4.0.0 + ssri: 10.0.6 + tar: 6.2.1 + unique-filename: 3.0.0 + + call-bind@1.0.7: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + set-function-length: 1.2.2 + + callsites@3.1.0: {} + + camel-case@4.1.2: + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + + camelcase-keys@6.2.2: + dependencies: + camelcase: 5.3.1 + map-obj: 4.3.0 + quick-lru: 4.0.1 + + camelcase@5.3.1: {} + + camelcase@6.3.0: {} + + camelcase@8.0.0: {} + + caniuse-lite@1.0.30001616: {} + + capital-case@1.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + + ccount@2.0.1: {} + + chai@4.4.1: + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.3 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 + + chalk@2.4.2: + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + chalk@4.1.2: + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + chalk@5.3.0: {} + + change-case@4.1.2: + dependencies: + camel-case: 4.1.2 + capital-case: 1.0.4 + constant-case: 3.0.4 + dot-case: 3.0.4 + header-case: 2.0.4 + no-case: 3.0.4 + param-case: 3.0.4 + pascal-case: 3.1.2 + path-case: 3.0.4 + sentence-case: 3.0.4 + snake-case: 3.0.4 + tslib: 2.6.2 + + char-regex@1.0.2: {} + + character-entities-html4@2.1.0: {} + + character-entities-legacy@1.1.4: {} + + character-entities-legacy@3.0.0: {} + + character-entities@1.2.4: {} + + character-entities@2.0.2: {} + + character-reference-invalid@1.1.4: {} + + character-reference-invalid@2.0.1: {} + + chardet@0.7.0: {} + + check-error@1.0.3: + dependencies: + get-func-name: 2.0.2 + + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@1.1.4: {} + + chownr@2.0.0: {} + + ci-info@3.9.0: {} + + ci-info@4.0.0: {} + + cjs-module-lexer@1.3.1: {} + + clean-regexp@1.0.0: + dependencies: + escape-string-regexp: 1.0.5 + + clean-stack@2.2.0: {} + + clean-stack@4.2.0: + dependencies: + escape-string-regexp: 5.0.0 + + cli-cursor@3.1.0: + dependencies: + restore-cursor: 3.1.0 + + cli-cursor@4.0.0: + dependencies: + restore-cursor: 4.0.0 + + cli-spinners@2.9.2: {} + + cli-width@4.1.0: {} + + client-only@0.0.1: {} + + cliui@6.0.0: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + cliui@8.0.1: + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + clone@1.0.4: {} + + clsx@2.1.1: {} + + co@4.6.0: {} + + collect-v8-coverage@1.0.2: {} + + color-convert@1.9.3: + dependencies: + color-name: 1.1.3 + + color-convert@2.0.1: + dependencies: + color-name: 1.1.4 + + color-name@1.1.3: {} + + color-name@1.1.4: {} + + combined-stream@1.0.8: + dependencies: + delayed-stream: 1.0.0 + + comma-separated-tokens@2.0.3: {} + + commander@4.1.1: {} + + component-emitter@1.3.1: {} + + compressible@2.0.18: + dependencies: + mime-db: 1.52.0 + + compression@1.7.4: + dependencies: + accepts: 1.3.8 + bytes: 3.0.0 + compressible: 2.0.18 + debug: 2.6.9 + on-headers: 1.0.2 + safe-buffer: 5.1.2 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + concat-map@0.0.1: {} + + concat-stream@2.0.0: + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 3.6.2 + typedarray: 0.0.6 + + confbox@0.1.7: {} + + constant-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case: 2.0.2 + + content-disposition@0.5.4: + dependencies: + safe-buffer: 5.2.1 + + content-type@1.0.5: {} + + convert-source-map@2.0.0: {} + + cookie-signature@1.0.6: {} + + cookie-signature@1.2.1: {} + + cookie@0.4.2: {} + + cookie@0.6.0: {} + + cookiejar@2.1.4: {} + + core-js-compat@3.37.0: + dependencies: + browserslist: 4.23.0 + + core-util-is@1.0.3: {} + + cors@2.8.5: + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + create-jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)): + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + create-require@1.1.1: + optional: true + + cross-spawn@5.1.0: + dependencies: + lru-cache: 4.1.5 + shebang-command: 1.2.0 + which: 1.3.1 + + cross-spawn@7.0.3: + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + css-what@6.1.0: {} + + cssesc@3.0.0: {} + + cssom@0.3.8: {} + + cssom@0.5.0: {} + + cssstyle@2.3.0: + dependencies: + cssom: 0.3.8 + + cssstyle@4.0.1: + dependencies: + rrweb-cssom: 0.6.0 + + csstype@3.1.3: {} + + csv-generate@3.4.3: {} + + csv-parse@4.16.3: {} + + csv-stringify@5.6.5: {} + + csv@5.5.3: + dependencies: + csv-generate: 3.4.3 + csv-parse: 4.16.3 + csv-stringify: 5.6.5 + stream-transform: 2.1.3 + + damerau-levenshtein@1.0.8: {} + + data-uri-to-buffer@3.0.1: {} + + data-urls@3.0.2: + dependencies: + abab: 2.0.6 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + + data-urls@5.0.0: + dependencies: + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + + data-view-buffer@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + data-view-byte-offset@1.0.0: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-data-view: 1.0.1 + + debug@2.6.9: + dependencies: + ms: 2.0.0 + + debug@3.2.7: + dependencies: + ms: 2.1.3 + + debug@4.3.4: + dependencies: + ms: 2.1.2 + + decamelize-keys@1.1.1: + dependencies: + decamelize: 1.2.0 + map-obj: 1.0.1 + + decamelize@1.2.0: {} + + decimal.js@10.4.3: {} + + decode-named-character-reference@1.0.2: + dependencies: + character-entities: 2.0.2 + + dedent@1.5.3: {} + + deep-eql@4.1.3: + dependencies: + type-detect: 4.0.8 + + deep-is@0.1.4: {} + + deep-object-diff@1.1.9: {} + + deepmerge@4.3.1: {} + + defaults@1.0.4: + dependencies: + clone: 1.0.4 + + define-data-property@1.1.4: + dependencies: + es-define-property: 1.0.0 + es-errors: 1.3.0 + gopd: 1.0.1 + + define-properties@1.2.1: + dependencies: + define-data-property: 1.1.4 + has-property-descriptors: 1.0.2 + object-keys: 1.1.1 + + del@7.1.0: + dependencies: + globby: 13.2.2 + graceful-fs: 4.2.11 + is-glob: 4.0.3 + is-path-cwd: 3.0.0 + is-path-inside: 4.0.0 + p-map: 5.5.0 + rimraf: 3.0.2 + slash: 4.0.0 + + delayed-stream@1.0.0: {} + + depd@2.0.0: {} + + dequal@2.0.3: {} + + destroy@1.2.0: {} + + detect-file@1.0.0: {} + + detect-indent@6.1.0: {} + + detect-indent@7.0.1: {} + + detect-newline@3.1.0: {} + + detect-newline@4.0.1: {} + + devlop@1.1.0: + dependencies: + dequal: 2.0.3 + + dezalgo@1.0.4: + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + + diff-sequences@29.6.3: {} + + diff@4.0.2: + optional: true + + diff@5.2.0: {} + + dir-glob@3.0.1: + dependencies: + path-type: 4.0.0 + + doctrine@2.1.0: + dependencies: + esutils: 2.0.3 + + dom-accessibility-api@0.5.16: {} + + domexception@4.0.0: + dependencies: + webidl-conversions: 7.0.0 + + dot-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + dotenv@16.0.3: {} + + dotenv@16.4.5: {} + + duplexify@3.7.1: + dependencies: + end-of-stream: 1.4.4 + inherits: 2.0.4 + readable-stream: 2.3.8 + stream-shift: 1.0.3 + + eastasianwidth@0.2.0: {} + + ee-first@1.1.1: {} + + electron-to-chromium@1.4.758: {} + + emittery@0.13.1: {} + + emoji-regex@10.3.0: {} + + emoji-regex@8.0.0: {} + + emoji-regex@9.2.2: {} + + encodeurl@1.0.2: {} + + end-of-stream@1.4.4: + dependencies: + once: 1.4.0 + + enhanced-resolve@5.16.1: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + enquirer@2.4.1: + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + entities@4.5.0: {} + + err-code@2.0.3: {} + + error-ex@1.3.2: + dependencies: + is-arrayish: 0.2.1 + + es-abstract@1.23.3: + dependencies: + array-buffer-byte-length: 1.0.1 + arraybuffer.prototype.slice: 1.0.3 + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + data-view-buffer: 1.0.1 + data-view-byte-length: 1.0.1 + data-view-byte-offset: 1.0.0 + es-define-property: 1.0.0 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + es-set-tostringtag: 2.0.3 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.4 + get-symbol-description: 1.0.2 + globalthis: 1.0.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + internal-slot: 1.0.7 + is-array-buffer: 3.0.4 + is-callable: 1.2.7 + is-data-view: 1.0.1 + is-negative-zero: 2.0.3 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.3 + is-string: 1.0.7 + is-typed-array: 1.1.13 + is-weakref: 1.0.2 + object-inspect: 1.13.1 + object-keys: 1.1.1 + object.assign: 4.1.5 + regexp.prototype.flags: 1.5.2 + safe-array-concat: 1.1.2 + safe-regex-test: 1.0.3 + string.prototype.trim: 1.2.9 + string.prototype.trimend: 1.0.8 + string.prototype.trimstart: 1.0.8 + typed-array-buffer: 1.0.2 + typed-array-byte-length: 1.0.1 + typed-array-byte-offset: 1.0.2 + typed-array-length: 1.0.6 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.15 + + es-define-property@1.0.0: + dependencies: + get-intrinsic: 1.2.4 + + es-errors@1.3.0: {} + + es-iterator-helpers@1.0.19: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-set-tostringtag: 2.0.3 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + has-property-descriptors: 1.0.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + iterator.prototype: 1.1.2 + safe-array-concat: 1.1.2 + + es-module-lexer@1.5.2: {} + + es-object-atoms@1.0.0: + dependencies: + es-errors: 1.3.0 + + es-set-tostringtag@2.0.3: + dependencies: + get-intrinsic: 1.2.4 + has-tostringtag: 1.0.2 + hasown: 2.0.2 + + es-shim-unscopables@1.0.2: + dependencies: + hasown: 2.0.2 + + es-to-primitive@1.2.1: + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + esbuild-plugin-react18-css@0.0.4: + dependencies: + autoprefixer: 10.4.19(postcss@8.4.38) + postcss: 8.4.38 + postcss-modules: 6.0.0(postcss@8.4.38) + sass: 1.77.0 + + esbuild-plugin-react18@0.1.5: {} + + esbuild-plugins-node-modules-polyfill@1.6.3(esbuild@0.17.6): + dependencies: + '@jspm/core': 2.0.1 + esbuild: 0.17.6 + local-pkg: 0.5.0 + resolve.exports: 2.0.2 + + esbuild@0.17.6: + optionalDependencies: + '@esbuild/android-arm': 0.17.6 + '@esbuild/android-arm64': 0.17.6 + '@esbuild/android-x64': 0.17.6 + '@esbuild/darwin-arm64': 0.17.6 + '@esbuild/darwin-x64': 0.17.6 + '@esbuild/freebsd-arm64': 0.17.6 + '@esbuild/freebsd-x64': 0.17.6 + '@esbuild/linux-arm': 0.17.6 + '@esbuild/linux-arm64': 0.17.6 + '@esbuild/linux-ia32': 0.17.6 + '@esbuild/linux-loong64': 0.17.6 + '@esbuild/linux-mips64el': 0.17.6 + '@esbuild/linux-ppc64': 0.17.6 + '@esbuild/linux-riscv64': 0.17.6 + '@esbuild/linux-s390x': 0.17.6 + '@esbuild/linux-x64': 0.17.6 + '@esbuild/netbsd-x64': 0.17.6 + '@esbuild/openbsd-x64': 0.17.6 + '@esbuild/sunos-x64': 0.17.6 + '@esbuild/win32-arm64': 0.17.6 + '@esbuild/win32-ia32': 0.17.6 + '@esbuild/win32-x64': 0.17.6 + + esbuild@0.19.12: + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + + esbuild@0.20.2: + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + + escalade@3.1.2: {} + + escape-html@1.0.3: {} + + escape-string-regexp@1.0.5: {} + + escape-string-regexp@2.0.0: {} + + escape-string-regexp@4.0.0: {} + + escape-string-regexp@5.0.0: {} + + escodegen@2.1.0: + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + eslint-config-prettier@9.1.0(eslint@9.2.0): + dependencies: + eslint: 9.2.0 + + eslint-config-turbo@1.13.3(eslint@9.2.0): + dependencies: + eslint: 9.2.0 + eslint-plugin-turbo: 1.13.3(eslint@9.2.0) + + eslint-import-resolver-alias@1.1.2(eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@9.2.0)): + dependencies: + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@9.2.0) + + eslint-import-resolver-node@0.3.9: + dependencies: + debug: 3.2.7 + is-core-module: 2.13.1 + resolve: 1.22.8 + transitivePeerDependencies: + - supports-color + + eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@9.2.0): + dependencies: + debug: 4.3.4 + enhanced-resolve: 5.16.1 + eslint: 9.2.0 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@9.2.0))(eslint@9.2.0) + eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@9.2.0) + fast-glob: 3.3.2 + get-tsconfig: 4.7.4 + is-core-module: 2.13.1 + is-glob: 4.0.3 + transitivePeerDependencies: + - '@typescript-eslint/parser' + - eslint-import-resolver-node + - eslint-import-resolver-webpack + - supports-color + + eslint-mdx@3.1.5(eslint@9.2.0): + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint: 9.2.0 + espree: 9.6.1 + estree-util-visit: 2.0.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + synckit: 0.9.0 + tslib: 2.6.2 + unified: 11.0.4 + unified-engine: 11.2.1 + unist-util-visit: 5.0.0 + uvu: 0.5.6 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + eslint-module-utils@2.8.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@9.2.0))(eslint@9.2.0): + dependencies: + debug: 3.2.7 + optionalDependencies: + '@typescript-eslint/parser': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + eslint: 9.2.0 + eslint-import-resolver-node: 0.3.9 + eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@9.2.0) + transitivePeerDependencies: + - supports-color + + eslint-plugin-eslint-comments@3.2.0(eslint@9.2.0): + dependencies: + escape-string-regexp: 1.0.5 + eslint: 9.2.0 + ignore: 5.3.1 + + eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-typescript@3.6.1)(eslint@9.2.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlastindex: 1.2.5 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 9.2.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint-plugin-import@2.29.1)(eslint@9.2.0))(eslint@9.2.0) + hasown: 2.0.2 + is-core-module: 2.13.1 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.8 + object.groupby: 1.0.3 + object.values: 1.2.0 + semver: 6.3.1 + tsconfig-paths: 3.15.0 + optionalDependencies: + '@typescript-eslint/parser': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + + eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(typescript@5.4.5): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@9.2.0)(typescript@5.4.5) + eslint: 9.2.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5) + jest: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-jsx-a11y@6.8.0(eslint@9.2.0): + dependencies: + '@babel/runtime': 7.24.5 + aria-query: 5.3.0 + array-includes: 3.1.8 + array.prototype.flatmap: 1.3.2 + ast-types-flow: 0.0.8 + axe-core: 4.7.0 + axobject-query: 3.2.1 + damerau-levenshtein: 1.0.8 + emoji-regex: 9.2.2 + es-iterator-helpers: 1.0.19 + eslint: 9.2.0 + hasown: 2.0.2 + jsx-ast-utils: 3.3.5 + language-tags: 1.0.9 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + + eslint-plugin-markdown@3.0.1(eslint@9.2.0): + dependencies: + eslint: 9.2.0 + mdast-util-from-markdown: 0.8.5 + transitivePeerDependencies: + - supports-color + + eslint-plugin-mdx@3.1.5(eslint@9.2.0): + dependencies: + eslint: 9.2.0 + eslint-mdx: 3.1.5(eslint@9.2.0) + eslint-plugin-markdown: 3.0.1(eslint@9.2.0) + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + tslib: 2.6.2 + unified: 11.0.4 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + + eslint-plugin-only-warn@1.1.0: {} + + eslint-plugin-playwright@1.6.0(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(typescript@5.4.5))(eslint@9.2.0): + dependencies: + eslint: 9.2.0 + globals: 13.24.0 + optionalDependencies: + eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(typescript@5.4.5) + + eslint-plugin-react-hooks@4.6.2(eslint@9.2.0): + dependencies: + eslint: 9.2.0 + + eslint-plugin-react@7.34.1(eslint@9.2.0): + dependencies: + array-includes: 3.1.8 + array.prototype.findlast: 1.2.5 + array.prototype.flatmap: 1.3.2 + array.prototype.toreversed: 1.1.2 + array.prototype.tosorted: 1.1.3 + doctrine: 2.1.0 + es-iterator-helpers: 1.0.19 + eslint: 9.2.0 + estraverse: 5.3.0 + jsx-ast-utils: 3.3.5 + minimatch: 3.1.2 + object.entries: 1.1.8 + object.fromentries: 2.0.8 + object.hasown: 1.1.4 + object.values: 1.2.0 + prop-types: 15.8.1 + resolve: 2.0.0-next.5 + semver: 6.3.1 + string.prototype.matchall: 4.0.11 + + eslint-plugin-storybook@0.8.0(eslint@9.2.0)(typescript@5.4.5): + dependencies: + '@storybook/csf': 0.0.1 + '@typescript-eslint/utils': 5.62.0(eslint@9.2.0)(typescript@5.4.5) + eslint: 9.2.0 + requireindex: 1.2.0 + ts-dedent: 2.2.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-testing-library@6.2.2(eslint@9.2.0)(typescript@5.4.5): + dependencies: + '@typescript-eslint/utils': 5.62.0(eslint@9.2.0)(typescript@5.4.5) + eslint: 9.2.0 + transitivePeerDependencies: + - supports-color + - typescript + + eslint-plugin-tsdoc@0.2.17: + dependencies: + '@microsoft/tsdoc': 0.14.2 + '@microsoft/tsdoc-config': 0.16.2 + + eslint-plugin-turbo@1.13.3(eslint@9.2.0): + dependencies: + dotenv: 16.0.3 + eslint: 9.2.0 + + eslint-plugin-unicorn@51.0.1(eslint@9.2.0): + dependencies: + '@babel/helper-validator-identifier': 7.24.5 + '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0) + '@eslint/eslintrc': 2.1.4 + ci-info: 4.0.0 + clean-regexp: 1.0.0 + core-js-compat: 3.37.0 + eslint: 9.2.0 + esquery: 1.5.0 + indent-string: 4.0.0 + is-builtin-module: 3.2.1 + jsesc: 3.0.2 + pluralize: 8.0.0 + read-pkg-up: 7.0.1 + regexp-tree: 0.1.27 + regjsparser: 0.10.0 + semver: 7.6.1 + strip-indent: 3.0.0 + transitivePeerDependencies: + - supports-color + + eslint-plugin-vitest@0.3.26(@typescript-eslint/eslint-plugin@7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5)(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)): + dependencies: + '@typescript-eslint/utils': 7.8.0(eslint@9.2.0)(typescript@5.4.5) + eslint: 9.2.0 + optionalDependencies: + '@typescript-eslint/eslint-plugin': 7.8.0(@typescript-eslint/parser@7.8.0(eslint@9.2.0)(typescript@5.4.5))(eslint@9.2.0)(typescript@5.4.5) + vitest: 1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0) + transitivePeerDependencies: + - supports-color + - typescript + + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + eslint-scope@8.0.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + + eslint-visitor-keys@2.1.0: {} + + eslint-visitor-keys@3.4.3: {} + + eslint-visitor-keys@4.0.0: {} + + eslint@9.2.0: + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@9.2.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 3.0.2 + '@eslint/js': 9.2.0 + '@humanwhocodes/config-array': 0.13.0 + '@humanwhocodes/module-importer': 1.0.1 + '@humanwhocodes/retry': 0.2.4 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + escape-string-regexp: 4.0.0 + eslint-scope: 8.0.1 + eslint-visitor-keys: 4.0.0 + espree: 10.0.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 8.0.0 + find-up: 5.0.0 + glob-parent: 6.0.2 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + + espree@10.0.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 4.0.0 + + espree@9.6.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + + esprima@4.0.1: {} + + esquery@1.5.0: + dependencies: + estraverse: 5.3.0 + + esrecurse@4.3.0: + dependencies: + estraverse: 5.3.0 + + estraverse@4.3.0: {} + + estraverse@5.3.0: {} + + estree-util-attach-comments@2.1.1: + dependencies: + '@types/estree': 1.0.5 + + estree-util-build-jsx@2.2.2: + dependencies: + '@types/estree-jsx': 1.0.5 + estree-util-is-identifier-name: 2.1.0 + estree-walker: 3.0.3 + + estree-util-is-identifier-name@1.1.0: {} + + estree-util-is-identifier-name@2.1.0: {} + + estree-util-is-identifier-name@3.0.0: {} + + estree-util-to-js@1.2.0: + dependencies: + '@types/estree-jsx': 1.0.5 + astring: 1.8.6 + source-map: 0.7.4 + + estree-util-value-to-estree@1.3.0: + dependencies: + is-plain-obj: 3.0.0 + + estree-util-visit@1.2.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 2.0.10 + + estree-util-visit@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/unist': 3.0.2 + + estree-walker@3.0.3: + dependencies: + '@types/estree': 1.0.5 + + esutils@2.0.3: {} + + etag@1.8.1: {} + + eval@0.1.8: + dependencies: + '@types/node': 20.12.10 + require-like: 0.1.2 + + event-target-shim@5.0.1: {} + + execa@5.1.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + execa@8.0.1: + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + + exit-hook@2.2.1: {} + + exit@0.1.2: {} + + expand-tilde@2.0.2: + dependencies: + homedir-polyfill: 1.0.3 + + expect@29.7.0: + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + + express@4.19.2: + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.2 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.6.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + extend@3.0.2: {} + + extendable-error@0.1.7: {} + + external-editor@3.1.0: + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + fast-deep-equal@3.1.3: {} + + fast-glob@3.3.2: + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + + fast-json-stable-stringify@2.1.0: {} + + fast-levenshtein@2.0.6: {} + + fast-safe-stringify@2.1.1: {} + + fastq@1.17.1: + dependencies: + reusify: 1.0.4 + + fault@2.0.1: + dependencies: + format: 0.2.2 + + fb-watchman@2.0.2: + dependencies: + bser: 2.1.1 + + file-entry-cache@8.0.0: + dependencies: + flat-cache: 4.0.1 + + fill-range@7.0.1: + dependencies: + to-regex-range: 5.0.1 + + finalhandler@1.2.0: + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + find-up@4.1.0: + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + + find-yarn-workspace-root2@1.2.16: + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + + findup-sync@5.0.0: + dependencies: + detect-file: 1.0.0 + is-glob: 4.0.3 + micromatch: 4.0.5 + resolve-dir: 1.0.1 + + fined@2.0.0: + dependencies: + expand-tilde: 2.0.2 + is-plain-object: 5.0.0 + object.defaults: 1.1.0 + object.pick: 1.3.0 + parse-filepath: 1.0.2 + + flagged-respawn@2.0.0: {} + + flat-cache@4.0.1: + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + + flatted@3.3.1: {} + + for-each@0.3.3: + dependencies: + is-callable: 1.2.7 + + for-in@1.0.2: {} + + for-own@1.0.0: + dependencies: + for-in: 1.0.2 + + foreground-child@3.1.1: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + form-data@4.0.0: + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + format@0.2.2: {} + + formidable@3.5.1: + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + + forwarded@0.2.0: {} + + fraction.js@4.3.7: {} + + fresh@0.5.2: {} + + fs-constants@1.0.0: {} + + fs-extra@10.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + fs-extra@7.0.1: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-extra@8.1.0: + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + fs-minipass@2.1.0: + dependencies: + minipass: 3.3.6 + + fs-minipass@3.0.3: + dependencies: + minipass: 7.1.0 + + fs.realpath@1.0.0: {} + + fsevents@2.3.3: + optional: true + + function-bind@1.1.2: {} + + function.prototype.name@1.1.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + functions-have-names: 1.2.3 + + functions-have-names@1.2.3: {} + + generic-names@4.0.0: + dependencies: + loader-utils: 3.2.1 + + gensync@1.0.0-beta.2: {} + + get-caller-file@2.0.5: {} + + get-east-asian-width@1.2.0: {} + + get-func-name@2.0.2: {} + + get-intrinsic@1.2.4: + dependencies: + es-errors: 1.3.0 + function-bind: 1.1.2 + has-proto: 1.0.3 + has-symbols: 1.0.3 + hasown: 2.0.2 + + get-package-type@0.1.0: {} + + get-port@5.1.1: {} + + get-stdin@9.0.0: {} + + get-stream@6.0.1: {} + + get-stream@8.0.1: {} + + get-symbol-description@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + + get-tsconfig@4.7.4: + dependencies: + resolve-pkg-maps: 1.0.0 + + git-hooks-list@3.1.0: {} + + glob-parent@5.1.2: + dependencies: + is-glob: 4.0.3 + + glob-parent@6.0.2: + dependencies: + is-glob: 4.0.3 + + glob@10.3.10: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.0 + path-scurry: 1.10.2 + + glob@10.3.12: + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.4 + minipass: 7.1.0 + path-scurry: 1.10.2 + + glob@7.2.3: + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + global-modules@1.0.0: + dependencies: + global-prefix: 1.0.2 + is-windows: 1.0.2 + resolve-dir: 1.0.1 + + global-prefix@1.0.2: + dependencies: + expand-tilde: 2.0.2 + homedir-polyfill: 1.0.3 + ini: 1.3.8 + is-windows: 1.0.2 + which: 1.3.1 + + globals@11.12.0: {} + + globals@13.24.0: + dependencies: + type-fest: 0.20.2 + + globals@14.0.0: {} + + globalthis@1.0.4: + dependencies: + define-properties: 1.2.1 + gopd: 1.0.1 + + globby@11.1.0: + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + globby@13.2.2: + dependencies: + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 4.0.0 + + globrex@0.1.2: {} + + gopd@1.0.1: + dependencies: + get-intrinsic: 1.2.4 + + graceful-fs@4.2.11: {} + + grapheme-splitter@1.0.4: {} + + graphemer@1.4.0: {} + + gunzip-maybe@1.4.2: + dependencies: + browserify-zlib: 0.1.4 + is-deflate: 1.0.0 + is-gzip: 1.0.0 + peek-stream: 1.1.3 + pumpify: 1.5.1 + through2: 2.0.5 + + handlebars@4.7.8: + dependencies: + minimist: 1.2.8 + neo-async: 2.6.2 + source-map: 0.6.1 + wordwrap: 1.0.0 + optionalDependencies: + uglify-js: 3.17.4 + + hard-rejection@2.1.0: {} + + has-bigints@1.0.2: {} + + has-flag@3.0.0: {} + + has-flag@4.0.0: {} + + has-property-descriptors@1.0.2: + dependencies: + es-define-property: 1.0.0 + + has-proto@1.0.3: {} + + has-symbols@1.0.3: {} + + has-tostringtag@1.0.2: + dependencies: + has-symbols: 1.0.3 + + hasown@2.0.2: + dependencies: + function-bind: 1.1.2 + + hast-util-to-estree@2.3.3: + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/unist': 2.0.10 + comma-separated-tokens: 2.0.3 + estree-util-attach-comments: 2.1.1 + estree-util-is-identifier-name: 2.1.0 + hast-util-whitespace: 2.0.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdxjs-esm: 1.3.1 + property-information: 6.5.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 4.0.4 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + + hast-util-whitespace@2.0.1: {} + + header-case@2.0.4: + dependencies: + capital-case: 1.0.4 + tslib: 2.6.2 + + hexoid@1.0.0: {} + + homedir-polyfill@1.0.3: + dependencies: + parse-passwd: 1.0.0 + + hosted-git-info@2.8.9: {} + + hosted-git-info@6.1.1: + dependencies: + lru-cache: 7.18.3 + + html-encoding-sniffer@3.0.0: + dependencies: + whatwg-encoding: 2.0.0 + + html-encoding-sniffer@4.0.0: + dependencies: + whatwg-encoding: 3.1.1 + + html-escaper@2.0.2: {} + + http-errors@2.0.0: + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + http-proxy-agent@5.0.0: + dependencies: + '@tootallnate/once': 2.0.0 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + http-proxy-agent@7.0.2: + dependencies: + agent-base: 7.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + https-proxy-agent@7.0.4: + dependencies: + agent-base: 7.1.1 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + human-id@1.0.2: {} + + human-signals@2.1.0: {} + + human-signals@5.0.0: {} + + iconv-lite@0.4.24: + dependencies: + safer-buffer: 2.1.2 + + iconv-lite@0.6.3: + dependencies: + safer-buffer: 2.1.2 + + icss-utils@5.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + + ieee754@1.2.1: {} + + ignore@5.3.1: {} + + immutable@4.3.5: {} + + import-fresh@3.3.0: + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + import-local@3.1.0: + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + + import-meta-resolve@4.1.0: {} + + imurmurhash@0.1.4: {} + + indent-string@4.0.0: {} + + indent-string@5.0.0: {} + + inflight@1.0.6: + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + inherits@2.0.4: {} + + ini@1.3.8: {} + + ini@4.1.2: {} + + inline-style-parser@0.1.1: {} + + inquirer@9.2.20: + dependencies: + '@inquirer/figures': 1.0.1 + '@ljharb/through': 2.3.13 + ansi-escapes: 4.3.2 + chalk: 5.3.0 + cli-cursor: 3.1.0 + cli-width: 4.1.0 + external-editor: 3.1.0 + lodash: 4.17.21 + mute-stream: 1.0.0 + ora: 5.4.1 + run-async: 3.0.0 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 6.2.0 + + internal-slot@1.0.7: + dependencies: + es-errors: 1.3.0 + hasown: 2.0.2 + side-channel: 1.0.6 + + interpret@3.1.1: {} + + ipaddr.js@1.9.1: {} + + is-absolute@1.0.0: + dependencies: + is-relative: 1.0.0 + is-windows: 1.0.2 + + is-alphabetical@1.0.4: {} + + is-alphabetical@2.0.1: {} + + is-alphanumerical@1.0.4: + dependencies: + is-alphabetical: 1.0.4 + is-decimal: 1.0.4 + + is-alphanumerical@2.0.1: + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + is-arguments@1.1.1: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-array-buffer@3.0.4: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-arrayish@0.2.1: {} + + is-async-function@2.0.0: + dependencies: + has-tostringtag: 1.0.2 + + is-bigint@1.0.4: + dependencies: + has-bigints: 1.0.2 + + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + + is-boolean-object@1.1.2: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-buffer@2.0.5: {} + + is-builtin-module@3.2.1: + dependencies: + builtin-modules: 3.3.0 + + is-callable@1.2.7: {} + + is-core-module@2.13.1: + dependencies: + hasown: 2.0.2 + + is-data-view@1.0.1: + dependencies: + is-typed-array: 1.1.13 + + is-date-object@1.0.5: + dependencies: + has-tostringtag: 1.0.2 + + is-decimal@1.0.4: {} + + is-decimal@2.0.1: {} + + is-deflate@1.0.0: {} + + is-empty@1.2.0: {} + + is-extglob@2.1.1: {} + + is-finalizationregistry@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-fullwidth-code-point@3.0.0: {} + + is-generator-fn@2.1.0: {} + + is-generator-function@1.0.10: + dependencies: + has-tostringtag: 1.0.2 + + is-glob@4.0.3: + dependencies: + is-extglob: 2.1.1 + + is-gzip@1.0.0: {} + + is-hexadecimal@1.0.4: {} + + is-hexadecimal@2.0.1: {} + + is-interactive@1.0.0: {} + + is-interactive@2.0.0: {} + + is-map@2.0.3: {} + + is-negative-zero@2.0.3: {} + + is-number-object@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-number@7.0.0: {} + + is-path-cwd@3.0.0: {} + + is-path-inside@3.0.3: {} + + is-path-inside@4.0.0: {} + + is-plain-obj@1.1.0: {} + + is-plain-obj@3.0.0: {} + + is-plain-obj@4.1.0: {} + + is-plain-object@5.0.0: {} + + is-potential-custom-element-name@1.0.1: {} + + is-reference@3.0.2: + dependencies: + '@types/estree': 1.0.5 + + is-regex@1.1.4: + dependencies: + call-bind: 1.0.7 + has-tostringtag: 1.0.2 + + is-relative@1.0.0: + dependencies: + is-unc-path: 1.0.0 + + is-set@2.0.3: {} + + is-shared-array-buffer@1.0.3: + dependencies: + call-bind: 1.0.7 + + is-stream@2.0.1: {} + + is-stream@3.0.0: {} + + is-string@1.0.7: + dependencies: + has-tostringtag: 1.0.2 + + is-subdir@1.2.0: + dependencies: + better-path-resolve: 1.0.0 + + is-symbol@1.0.4: + dependencies: + has-symbols: 1.0.3 + + is-typed-array@1.1.13: + dependencies: + which-typed-array: 1.1.15 + + is-unc-path@1.0.0: + dependencies: + unc-path-regex: 0.1.2 + + is-unicode-supported@0.1.0: {} + + is-unicode-supported@1.3.0: {} + + is-unicode-supported@2.0.0: {} + + is-weakmap@2.0.2: {} + + is-weakref@1.0.2: + dependencies: + call-bind: 1.0.7 + + is-weakset@2.0.3: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + + is-windows@1.0.2: {} + + isarray@1.0.0: {} + + isarray@2.0.5: {} + + isbinaryfile@5.0.2: {} + + isbot@3.6.5: {} + + isexe@2.0.0: {} + + isobject@3.0.1: {} + + istanbul-lib-coverage@3.2.2: {} + + istanbul-lib-instrument@5.2.1: + dependencies: + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-instrument@6.0.2: + dependencies: + '@babel/core': 7.24.5 + '@babel/parser': 7.24.5 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-report@3.0.1: + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + + istanbul-lib-source-maps@4.0.1: + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + + istanbul-lib-source-maps@5.0.4: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + debug: 4.3.4 + istanbul-lib-coverage: 3.2.2 + transitivePeerDependencies: + - supports-color + + istanbul-reports@3.1.7: + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + + iterator.prototype@1.1.2: + dependencies: + define-properties: 1.2.1 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + reflect.getprototypeof: 1.0.6 + set-function-name: 2.0.2 + + jackspeak@2.3.6: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + javascript-stringify@2.1.0: {} + + jest-changed-files@29.7.0: + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + + jest-circus@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-cli@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jest-config@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)): + dependencies: + '@babel/core': 7.24.5 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.5) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + optionalDependencies: + '@types/node': 20.12.10 + ts-node: 10.9.2(@types/node@20.12.10)(typescript@5.4.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + + jest-diff@29.7.0: + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-docblock@29.7.0: + dependencies: + detect-newline: 3.1.0 + + jest-each@29.7.0: + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + + jest-environment-jsdom@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/jsdom': 20.0.1 + '@types/node': 20.12.10 + jest-mock: 29.7.0 + jest-util: 29.7.0 + jsdom: 20.0.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jest-environment-node@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + jest-mock: 29.7.0 + jest-util: 29.7.0 + + jest-get-type@29.6.3: {} + + jest-haste-map@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 20.12.10 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + + jest-leak-detector@29.7.0: + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-matcher-utils@29.7.0: + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + + jest-message-util@29.7.0: + dependencies: + '@babel/code-frame': 7.24.2 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + + jest-mock@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + jest-util: 29.7.0 + + jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + optionalDependencies: + jest-resolve: 29.7.0 + + jest-regex-util@29.6.3: {} + + jest-resolve-dependencies@29.7.0: + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + + jest-resolve@29.7.0: + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + + jest-runner@29.7.0: + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + + jest-runtime@29.7.0: + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + chalk: 4.1.2 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + + jest-snapshot@29.7.0: + dependencies: + '@babel/core': 7.24.5 + '@babel/generator': 7.24.5 + '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.5) + '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) + '@babel/types': 7.24.5 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.5) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.1 + transitivePeerDependencies: + - supports-color + + jest-util@29.7.0: + dependencies: + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + + jest-validate@29.7.0: + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + + jest-watcher@29.7.0: + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 20.12.10 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + + jest-worker@29.7.0: + dependencies: + '@types/node': 20.12.10 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)): + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + + jju@1.4.0: {} + + joycon@3.1.1: {} + + js-tokens@4.0.0: {} + + js-tokens@9.0.0: {} + + js-yaml@3.14.1: + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + + js-yaml@4.1.0: + dependencies: + argparse: 2.0.1 + + jsdom@20.0.3: + dependencies: + abab: 2.0.6 + acorn: 8.11.3 + acorn-globals: 7.0.1 + cssom: 0.5.0 + cssstyle: 2.3.0 + data-urls: 3.0.2 + decimal.js: 10.4.3 + domexception: 4.0.0 + escodegen: 2.1.0 + form-data: 4.0.0 + html-encoding-sniffer: 3.0.0 + http-proxy-agent: 5.0.0 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.9 + parse5: 7.1.2 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 4.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 2.0.0 + whatwg-mimetype: 3.0.0 + whatwg-url: 11.0.0 + ws: 8.17.0 + xml-name-validator: 4.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsdom@24.0.0: + dependencies: + cssstyle: 4.0.1 + data-urls: 5.0.0 + decimal.js: 10.4.3 + form-data: 4.0.0 + html-encoding-sniffer: 4.0.0 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.9 + parse5: 7.1.2 + rrweb-cssom: 0.6.0 + saxes: 6.0.0 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-xmlserializer: 5.0.0 + webidl-conversions: 7.0.0 + whatwg-encoding: 3.1.1 + whatwg-mimetype: 4.0.0 + whatwg-url: 14.0.0 + ws: 8.17.0 + xml-name-validator: 5.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + jsesc@0.5.0: {} + + jsesc@2.5.2: {} + + jsesc@3.0.2: {} + + json-buffer@3.0.1: {} + + json-parse-even-better-errors@2.3.1: {} + + json-parse-even-better-errors@3.0.2: {} + + json-schema-traverse@0.4.1: {} + + json-stable-stringify-without-jsonify@1.0.1: {} + + json5@1.0.2: + dependencies: + minimist: 1.2.8 + + json5@2.2.3: {} + + jsonc-parser@3.2.1: {} + + jsonfile@4.0.0: + optionalDependencies: + graceful-fs: 4.2.11 + + jsonfile@6.1.0: + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + jsx-ast-utils@3.3.5: + dependencies: + array-includes: 3.1.8 + array.prototype.flat: 1.3.2 + object.assign: 4.1.5 + object.values: 1.2.0 + + keyv@4.5.4: + dependencies: + json-buffer: 3.0.1 + + kind-of@6.0.3: {} + + kleur@3.0.3: {} + + kleur@4.1.5: {} + + language-subtag-registry@0.3.22: {} + + language-tags@1.0.9: + dependencies: + language-subtag-registry: 0.3.22 + + leven@3.1.0: {} + + levn@0.4.1: + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + + liftoff@4.0.0: + dependencies: + extend: 3.0.2 + findup-sync: 5.0.0 + fined: 2.0.0 + flagged-respawn: 2.0.0 + is-plain-object: 5.0.0 + object.map: 1.0.1 + rechoir: 0.8.0 + resolve: 1.22.8 + + lilconfig@3.1.1: {} + + lines-and-columns@1.2.4: {} + + lines-and-columns@2.0.4: {} + + load-plugin@6.0.3: + dependencies: + '@npmcli/config': 8.3.1 + import-meta-resolve: 4.1.0 + + load-tsconfig@0.2.5: {} + + load-yaml-file@0.2.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + loader-utils@3.2.1: {} + + local-pkg@0.5.0: + dependencies: + mlly: 1.7.0 + pkg-types: 1.1.0 + + locate-path@5.0.0: + dependencies: + p-locate: 4.1.0 + + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + + lodash.camelcase@4.3.0: {} + + lodash.debounce@4.0.8: {} + + lodash.get@4.4.2: {} + + lodash.memoize@4.1.2: {} + + lodash.merge@4.6.2: {} + + lodash.sortby@4.7.0: {} + + lodash.startcase@4.4.0: {} + + lodash@4.17.21: {} + + log-symbols@4.1.0: + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + log-symbols@6.0.0: + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + + longest-streak@3.1.0: {} + + loose-envify@1.4.0: + dependencies: + js-tokens: 4.0.0 + + loupe@2.3.7: + dependencies: + get-func-name: 2.0.2 + + lower-case@2.0.2: + dependencies: + tslib: 2.6.2 + + lru-cache@10.2.2: {} + + lru-cache@4.1.5: + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + + lru-cache@5.1.1: + dependencies: + yallist: 3.1.1 + + lru-cache@7.18.3: {} + + lunr@2.3.9: {} + + lz-string@1.5.0: {} + + magic-string@0.30.10: + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + + magicast@0.3.4: + dependencies: + '@babel/parser': 7.24.5 + '@babel/types': 7.24.5 + source-map-js: 1.2.0 + + make-dir@4.0.0: + dependencies: + semver: 7.6.1 + + make-error@1.3.6: {} + + make-iterator@1.0.1: + dependencies: + kind-of: 6.0.3 + + makeerror@1.0.12: + dependencies: + tmpl: 1.0.5 + + map-cache@0.2.2: {} + + map-obj@1.0.1: {} + + map-obj@4.3.0: {} + + markdown-extensions@1.1.1: {} + + marked@4.3.0: {} + + mdast-util-definitions@5.1.2: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + unist-util-visit: 4.1.2 + + mdast-util-from-markdown@0.8.5: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-string: 2.0.0 + micromark: 2.11.4 + parse-entities: 2.0.0 + unist-util-stringify-position: 2.0.3 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@1.3.1: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + decode-named-character-reference: 1.0.2 + mdast-util-to-string: 3.2.0 + micromark: 3.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-decode-string: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-stringify-position: 3.0.3 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + mdast-util-from-markdown@2.0.0: + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + mdast-util-frontmatter@1.0.1: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-to-markdown: 1.5.0 + micromark-extension-frontmatter: 1.1.1 + + mdast-util-mdx-expression@1.3.2: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-expression@2.0.0: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@2.1.4: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + ccount: 2.0.1 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-remove-position: 4.0.2 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx-jsx@3.1.2: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.4 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@2.0.1: + dependencies: + mdast-util-from-markdown: 1.3.1 + mdast-util-mdx-expression: 1.3.2 + mdast-util-mdx-jsx: 2.1.4 + mdast-util-mdxjs-esm: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdx@3.0.0: + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@1.3.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + mdast-util-to-markdown: 1.5.0 + transitivePeerDependencies: + - supports-color + + mdast-util-mdxjs-esm@2.0.1: + dependencies: + '@types/estree-jsx': 1.0.5 + '@types/hast': 3.0.4 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + + mdast-util-phrasing@3.0.1: + dependencies: + '@types/mdast': 3.0.15 + unist-util-is: 5.2.1 + + mdast-util-phrasing@4.1.0: + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + + mdast-util-to-hast@12.3.0: + dependencies: + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-definitions: 5.1.2 + micromark-util-sanitize-uri: 1.2.0 + trim-lines: 3.0.1 + unist-util-generated: 2.0.1 + unist-util-position: 4.0.4 + unist-util-visit: 4.1.2 + + mdast-util-to-markdown@1.5.0: + dependencies: + '@types/mdast': 3.0.15 + '@types/unist': 2.0.10 + longest-streak: 3.1.0 + mdast-util-phrasing: 3.0.1 + mdast-util-to-string: 3.2.0 + micromark-util-decode-string: 1.1.0 + unist-util-visit: 4.1.2 + zwitch: 2.0.4 + + mdast-util-to-markdown@2.1.0: + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + mdast-util-to-string@2.0.0: {} + + mdast-util-to-string@3.2.0: + dependencies: + '@types/mdast': 3.0.15 + + mdast-util-to-string@4.0.0: + dependencies: + '@types/mdast': 4.0.3 + + media-query-parser@2.0.2: + dependencies: + '@babel/runtime': 7.24.5 + + media-typer@0.3.0: {} + + meow@6.1.1: + dependencies: + '@types/minimist': 1.2.5 + camelcase-keys: 6.2.2 + decamelize-keys: 1.1.1 + hard-rejection: 2.1.0 + minimist-options: 4.1.0 + normalize-package-data: 2.5.0 + read-pkg-up: 7.0.1 + redent: 3.0.0 + trim-newlines: 3.0.1 + type-fest: 0.13.1 + yargs-parser: 18.1.3 + + merge-descriptors@1.0.1: {} + + merge-stream@2.0.0: {} + + merge2@1.4.1: {} + + methods@1.1.2: {} + + micromark-core-commonmark@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-factory-destination: 1.1.0 + micromark-factory-label: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-factory-title: 1.1.0 + micromark-factory-whitespace: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-classify-character: 1.1.0 + micromark-util-html-tag-name: 1.2.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-core-commonmark@2.0.1: + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-frontmatter@1.1.1: + dependencies: + fault: 2.0.1 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-extension-mdx-expression@1.0.8: + dependencies: + '@types/estree': 1.0.5 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-extension-mdx-expression@3.0.0: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-extension-mdx-jsx@1.0.5: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + estree-util-is-identifier-name: 2.1.0 + micromark-factory-mdx-expression: 1.0.9 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + + micromark-extension-mdx-jsx@3.0.0: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdx-md@1.0.1: + dependencies: + micromark-util-types: 1.1.0 + + micromark-extension-mdx-md@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-extension-mdxjs-esm@1.0.5: + dependencies: + '@types/estree': 1.0.5 + micromark-core-commonmark: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + + micromark-extension-mdxjs-esm@3.0.0: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-extension-mdxjs@1.0.1: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + micromark-extension-mdx-expression: 1.0.8 + micromark-extension-mdx-jsx: 1.0.5 + micromark-extension-mdx-md: 1.0.1 + micromark-extension-mdxjs-esm: 1.0.5 + micromark-util-combine-extensions: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-extension-mdxjs@3.0.0: + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-destination@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-destination@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-label@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-factory-label@2.0.0: + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-mdx-expression@1.0.9: + dependencies: + '@types/estree': 1.0.5 + micromark-util-character: 1.2.0 + micromark-util-events-to-acorn: 1.2.3 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + unist-util-position-from-estree: 1.1.2 + uvu: 0.5.6 + vfile-message: 3.1.4 + + micromark-factory-mdx-expression@2.0.1: + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.1.0 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + + micromark-factory-space@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-types: 1.1.0 + + micromark-factory-space@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-types: 2.0.0 + + micromark-factory-title@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-title@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-factory-whitespace@1.1.0: + dependencies: + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-factory-whitespace@2.0.0: + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-character@1.2.0: + dependencies: + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-character@2.1.0: + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-chunked@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-chunked@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-classify-character@1.1.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-classify-character@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-combine-extensions@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-types: 1.1.0 + + micromark-util-combine-extensions@2.0.0: + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-decode-numeric-character-reference@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-decode-numeric-character-reference@2.0.1: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-decode-string@1.1.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 1.2.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-decode-string@2.0.0: + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + micromark-util-encode@1.1.0: {} + + micromark-util-encode@2.0.0: {} + + micromark-util-events-to-acorn@1.2.3: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 2.0.10 + estree-util-visit: 1.2.1 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + vfile-message: 3.1.4 + + micromark-util-events-to-acorn@2.0.2: + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + + micromark-util-html-tag-name@1.2.0: {} + + micromark-util-html-tag-name@2.0.0: {} + + micromark-util-normalize-identifier@1.1.0: + dependencies: + micromark-util-symbol: 1.1.0 + + micromark-util-normalize-identifier@2.0.0: + dependencies: + micromark-util-symbol: 2.0.0 + + micromark-util-resolve-all@1.1.0: + dependencies: + micromark-util-types: 1.1.0 + + micromark-util-resolve-all@2.0.0: + dependencies: + micromark-util-types: 2.0.0 + + micromark-util-sanitize-uri@1.2.0: + dependencies: + micromark-util-character: 1.2.0 + micromark-util-encode: 1.1.0 + micromark-util-symbol: 1.1.0 + + micromark-util-sanitize-uri@2.0.0: + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + micromark-util-subtokenize@1.1.0: + dependencies: + micromark-util-chunked: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + + micromark-util-subtokenize@2.0.1: + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + micromark-util-symbol@1.1.0: {} + + micromark-util-symbol@2.0.0: {} + + micromark-util-types@1.1.0: {} + + micromark-util-types@2.0.0: {} + + micromark@2.11.4: + dependencies: + debug: 4.3.4 + parse-entities: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromark@3.2.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + micromark-core-commonmark: 1.1.0 + micromark-factory-space: 1.1.0 + micromark-util-character: 1.2.0 + micromark-util-chunked: 1.1.0 + micromark-util-combine-extensions: 1.1.0 + micromark-util-decode-numeric-character-reference: 1.1.0 + micromark-util-encode: 1.1.0 + micromark-util-normalize-identifier: 1.1.0 + micromark-util-resolve-all: 1.1.0 + micromark-util-sanitize-uri: 1.2.0 + micromark-util-subtokenize: 1.1.0 + micromark-util-symbol: 1.1.0 + micromark-util-types: 1.1.0 + uvu: 0.5.6 + transitivePeerDependencies: + - supports-color + + micromark@4.0.0: + dependencies: + '@types/debug': 4.1.12 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + micromatch@4.0.5: + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + + mime-db@1.52.0: {} + + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + + mime@1.6.0: {} + + mime@2.6.0: {} + + mimic-fn@2.1.0: {} + + mimic-fn@4.0.0: {} + + min-indent@1.0.1: {} + + minimatch@3.1.2: + dependencies: + brace-expansion: 1.1.11 + + minimatch@9.0.4: + dependencies: + brace-expansion: 2.0.1 + + minimist-options@4.1.0: + dependencies: + arrify: 1.0.1 + is-plain-obj: 1.1.0 + kind-of: 6.0.3 + + minimist@1.2.8: {} + + minipass-collect@1.0.2: + dependencies: + minipass: 3.3.6 + + minipass-flush@1.0.5: + dependencies: + minipass: 3.3.6 + + minipass-pipeline@1.2.4: + dependencies: + minipass: 3.3.6 + + minipass@3.3.6: + dependencies: + yallist: 4.0.0 + + minipass@5.0.0: {} + + minipass@7.1.0: {} + + minizlib@2.1.2: + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + + mixme@0.5.10: {} + + mkdirp-classic@0.5.3: {} + + mkdirp@1.0.4: {} + + mkdirp@3.0.1: {} + + mlly@1.7.0: + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.1.0 + ufo: 1.5.3 + + modern-ahocorasick@1.0.1: {} + + morgan@1.10.0: + dependencies: + basic-auth: 2.0.1 + debug: 2.6.9 + depd: 2.0.0 + on-finished: 2.3.0 + on-headers: 1.0.2 + transitivePeerDependencies: + - supports-color + + mri@1.2.0: {} + + mrmime@1.0.1: {} + + ms@2.0.0: {} + + ms@2.1.2: {} + + ms@2.1.3: {} + + mute-stream@1.0.0: {} + + mz@2.7.0: + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + + nanoid@3.3.7: {} + + natural-compare@1.4.0: {} + + negotiator@0.6.3: {} + + neo-async@2.6.2: {} + + next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.76.0): + dependencies: + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001616 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 + sass: 1.76.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0): + dependencies: + '@next/env': 14.2.3 + '@swc/helpers': 0.5.5 + busboy: 1.6.0 + caniuse-lite: 1.0.30001616 + graceful-fs: 4.2.11 + postcss: 8.4.31 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) + optionalDependencies: + '@next/swc-darwin-arm64': 14.2.3 + '@next/swc-darwin-x64': 14.2.3 + '@next/swc-linux-arm64-gnu': 14.2.3 + '@next/swc-linux-arm64-musl': 14.2.3 + '@next/swc-linux-x64-gnu': 14.2.3 + '@next/swc-linux-x64-musl': 14.2.3 + '@next/swc-win32-arm64-msvc': 14.2.3 + '@next/swc-win32-ia32-msvc': 14.2.3 + '@next/swc-win32-x64-msvc': 14.2.3 + sass: 1.77.0 + transitivePeerDependencies: + - '@babel/core' + - babel-plugin-macros + + nextjs-themes@3.1.1(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1): + dependencies: + '@types/react': 18.3.1 + r18gs: 0.1.4(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + next: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) + + no-case@3.0.4: + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + + node-int64@0.4.0: {} + + node-plop@0.32.0: + dependencies: + '@types/inquirer': 9.0.7 + change-case: 4.1.2 + del: 7.1.0 + globby: 13.2.2 + handlebars: 4.7.8 + inquirer: 9.2.20 + isbinaryfile: 5.0.2 + lodash.get: 4.4.2 + lower-case: 2.0.2 + mkdirp: 3.0.1 + resolve: 1.22.8 + title-case: 3.0.3 + upper-case: 2.0.2 + + node-releases@2.0.14: {} + + nopt@7.2.1: + dependencies: + abbrev: 2.0.0 + + normalize-package-data@2.5.0: + dependencies: + hosted-git-info: 2.8.9 + resolve: 1.22.8 + semver: 5.7.2 + validate-npm-package-license: 3.0.4 + + normalize-package-data@5.0.0: + dependencies: + hosted-git-info: 6.1.1 + is-core-module: 2.13.1 + semver: 7.6.1 + validate-npm-package-license: 3.0.4 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-install-checks@6.3.0: + dependencies: + semver: 7.6.1 + + npm-normalize-package-bin@3.0.1: {} + + npm-package-arg@10.1.0: + dependencies: + hosted-git-info: 6.1.1 + proc-log: 3.0.0 + semver: 7.6.1 + validate-npm-package-name: 5.0.1 + + npm-pick-manifest@8.0.2: + dependencies: + npm-install-checks: 6.3.0 + npm-normalize-package-bin: 3.0.1 + npm-package-arg: 10.1.0 + semver: 7.6.1 + + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + nwsapi@2.2.9: {} + + object-assign@4.1.1: {} + + object-inspect@1.13.1: {} + + object-keys@1.1.1: {} + + object.assign@4.1.5: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + object.defaults@1.1.0: + dependencies: + array-each: 1.0.1 + array-slice: 1.1.0 + for-own: 1.0.0 + isobject: 3.0.1 + + object.entries@1.1.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + object.fromentries@2.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.groupby@1.0.3: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + + object.hasown@1.1.4: + dependencies: + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + object.map@1.0.1: + dependencies: + for-own: 1.0.0 + make-iterator: 1.0.1 + + object.pick@1.3.0: + dependencies: + isobject: 3.0.1 + + object.values@1.2.0: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + on-finished@2.3.0: + dependencies: + ee-first: 1.1.1 + + on-finished@2.4.1: + dependencies: + ee-first: 1.1.1 + + on-headers@1.0.2: {} + + once@1.4.0: + dependencies: + wrappy: 1.0.2 + + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + + onetime@6.0.0: + dependencies: + mimic-fn: 4.0.0 + + optionator@0.9.4: + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + + ora@5.4.1: + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.2 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + ora@8.0.1: + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.0.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.1.0 + strip-ansi: 7.1.0 + + os-tmpdir@1.0.2: {} + + outdent@0.5.0: {} + + outdent@0.8.0: {} + + p-filter@2.1.0: + dependencies: + p-map: 2.1.0 + + p-limit@2.3.0: + dependencies: + p-try: 2.2.0 + + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-limit@5.0.0: + dependencies: + yocto-queue: 1.0.0 + + p-locate@4.1.0: + dependencies: + p-limit: 2.3.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + + p-map@2.1.0: {} + + p-map@4.0.0: + dependencies: + aggregate-error: 3.1.0 + + p-map@5.5.0: + dependencies: + aggregate-error: 4.0.1 + + p-try@2.2.0: {} + + pako@0.2.9: {} + + param-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + parent-module@1.0.1: + dependencies: + callsites: 3.1.0 + + parse-entities@2.0.0: + dependencies: + character-entities: 1.2.4 + character-entities-legacy: 1.1.4 + character-reference-invalid: 1.1.4 + is-alphanumerical: 1.0.4 + is-decimal: 1.0.4 + is-hexadecimal: 1.0.4 + + parse-entities@4.0.1: + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + parse-filepath@1.0.2: + dependencies: + is-absolute: 1.0.0 + map-cache: 0.2.2 + path-root: 0.1.1 + + parse-json@5.2.0: + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + parse-json@7.1.1: + dependencies: + '@babel/code-frame': 7.24.2 + error-ex: 1.3.2 + json-parse-even-better-errors: 3.0.2 + lines-and-columns: 2.0.4 + type-fest: 3.13.1 + + parse-ms@2.1.0: {} + + parse-passwd@1.0.0: {} + + parse5@7.1.2: + dependencies: + entities: 4.5.0 + + parseurl@1.3.3: {} + + pascal-case@3.1.2: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + + path-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + path-exists@4.0.0: {} + + path-is-absolute@1.0.1: {} + + path-key@3.1.1: {} + + path-key@4.0.0: {} + + path-parse@1.0.7: {} + + path-root-regex@0.1.2: {} + + path-root@0.1.1: + dependencies: + path-root-regex: 0.1.2 + + path-scurry@1.10.2: + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.0 + + path-to-regexp@0.1.7: {} + + path-type@4.0.0: {} + + pathe@1.1.2: {} + + pathval@1.1.1: {} + + peek-stream@1.1.3: + dependencies: + buffer-from: 1.1.2 + duplexify: 3.7.1 + through2: 2.0.5 + + periscopic@3.1.0: + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + + picocolors@1.0.0: {} + + picomatch@2.3.1: {} + + pidtree@0.6.0: {} + + pify@4.0.1: {} + + pirates@4.0.6: {} + + pkg-dir@4.2.0: + dependencies: + find-up: 4.1.0 + + pkg-types@1.1.0: + dependencies: + confbox: 0.1.7 + mlly: 1.7.0 + pathe: 1.1.2 + + plop@4.0.1: + dependencies: + '@types/liftoff': 4.0.3 + chalk: 5.3.0 + interpret: 3.1.1 + liftoff: 4.0.0 + minimist: 1.2.8 + node-plop: 0.32.0 + ora: 8.0.1 + v8flags: 4.0.1 + + pluralize@8.0.0: {} + + possible-typed-array-names@1.0.0: {} + + postcss-discard-duplicates@5.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + + postcss-load-config@4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)): + dependencies: + lilconfig: 3.1.1 + yaml: 2.4.2 + optionalDependencies: + postcss: 8.4.38 + ts-node: 10.9.2(@types/node@20.12.10)(typescript@5.4.5) + + postcss-modules-extract-imports@3.1.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + + postcss-modules-local-by-default@4.0.5(postcss@8.4.38): + dependencies: + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + + postcss-modules-scope@3.2.0(postcss@8.4.38): + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + + postcss-modules-values@4.0.0(postcss@8.4.38): + dependencies: + icss-utils: 5.1.0(postcss@8.4.38) + postcss: 8.4.38 + + postcss-modules@6.0.0(postcss@8.4.38): + dependencies: + generic-names: 4.0.0 + icss-utils: 5.1.0(postcss@8.4.38) + lodash.camelcase: 4.3.0 + postcss: 8.4.38 + postcss-modules-extract-imports: 3.1.0(postcss@8.4.38) + postcss-modules-local-by-default: 4.0.5(postcss@8.4.38) + postcss-modules-scope: 3.2.0(postcss@8.4.38) + postcss-modules-values: 4.0.0(postcss@8.4.38) + string-hash: 1.1.3 + + postcss-selector-parser@6.0.16: + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + + postcss-value-parser@4.2.0: {} + + postcss@8.4.31: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + postcss@8.4.38: + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + + preferred-pm@3.1.3: + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + + prelude-ls@1.2.1: {} + + prettier-plugin-packagejson@2.5.0(prettier@3.2.5): + dependencies: + sort-package-json: 2.10.0 + synckit: 0.9.0 + optionalDependencies: + prettier: 3.2.5 + + prettier@2.8.8: {} + + prettier@3.2.5: {} + + pretty-format@27.5.1: + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + pretty-format@29.7.0: + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + + pretty-ms@7.0.1: + dependencies: + parse-ms: 2.1.0 + + prism-react-renderer@2.3.1(react@18.3.1): + dependencies: + '@types/prismjs': 1.26.4 + clsx: 2.1.1 + react: 18.3.1 + + proc-log@3.0.0: {} + + proc-log@4.2.0: {} + + process-nextick-args@2.0.1: {} + + promise-inflight@1.0.1: {} + + promise-retry@2.0.1: + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + + prompts@2.4.2: + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + + prop-types@15.8.1: + dependencies: + loose-envify: 1.4.0 + object-assign: 4.1.1 + react-is: 16.13.1 + + property-information@6.5.0: {} + + proxy-addr@2.0.7: + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + pseudomap@1.0.2: {} + + psl@1.9.0: {} + + pump@2.0.1: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pump@3.0.0: + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + pumpify@1.5.1: + dependencies: + duplexify: 3.7.1 + inherits: 2.0.4 + pump: 2.0.1 + + punycode@2.3.1: {} + + pure-rand@6.1.0: {} + + qs@6.11.0: + dependencies: + side-channel: 1.0.6 + + qs@6.12.1: + dependencies: + side-channel: 1.0.6 + + querystringify@2.2.0: {} + + queue-microtask@1.2.3: {} + + quick-lru@4.0.1: {} + + r18gs@0.1.4(@types/react@18.3.1)(react@18.3.1): + dependencies: + '@types/react': 18.3.1 + react: 18.3.1 + + r18gs@1.0.2(@types/react@18.3.1)(react@18.3.1): + dependencies: + '@types/react': 18.3.1 + react: 18.3.1 + + range-parser@1.2.1: {} + + raw-body@2.5.2: + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + react-dom@18.2.0(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-dom@18.3.1(react@18.3.1): + dependencies: + loose-envify: 1.4.0 + react: 18.3.1 + scheduler: 0.23.2 + + react-is@16.13.1: {} + + react-is@17.0.2: {} + + react-is@18.3.1: {} + + react-live@4.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + prism-react-renderer: 2.3.1(react@18.3.1) + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + sucrase: 3.35.0 + use-editable: 2.3.3(react@18.3.1) + + react-refresh@0.14.2: {} + + react-router-dom@6.23.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1): + dependencies: + '@remix-run/router': 1.16.0 + react: 18.3.1 + react-dom: 18.3.1(react@18.3.1) + react-router: 6.23.0(react@18.3.1) + + react-router@6.23.0(react@18.3.1): + dependencies: + '@remix-run/router': 1.16.0 + react: 18.3.1 + + react18-themes@3.1.0(@remix-run/node@2.9.1(typescript@5.4.5))(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1): + dependencies: + '@types/react': 18.3.1 + r18gs: 0.1.4(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + '@remix-run/node': 2.9.1(typescript@5.4.5) + '@remix-run/react': 2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5) + next: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) + + react@18.3.1: + dependencies: + loose-envify: 1.4.0 + + read-package-json-fast@3.0.2: + dependencies: + json-parse-even-better-errors: 3.0.2 + npm-normalize-package-bin: 3.0.1 + + read-pkg-up@7.0.1: + dependencies: + find-up: 4.1.0 + read-pkg: 5.2.0 + type-fest: 0.8.1 + + read-pkg@5.2.0: + dependencies: + '@types/normalize-package-data': 2.4.4 + normalize-package-data: 2.5.0 + parse-json: 5.2.0 + type-fest: 0.6.0 + + read-yaml-file@1.1.0: + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + + readable-stream@2.3.8: + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + readable-stream@3.6.2: + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + + rechoir@0.8.0: + dependencies: + resolve: 1.22.8 + + redent@3.0.0: + dependencies: + indent-string: 4.0.0 + strip-indent: 3.0.0 + + reflect.getprototypeof@1.0.6: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + globalthis: 1.0.4 + which-builtin-type: 1.1.3 + + regenerator-runtime@0.14.1: {} + + regexp-tree@0.1.27: {} + + regexp.prototype.flags@1.5.2: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-errors: 1.3.0 + set-function-name: 2.0.2 + + regjsparser@0.10.0: + dependencies: + jsesc: 0.5.0 + + remark-frontmatter@4.0.1: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-frontmatter: 1.0.1 + micromark-extension-frontmatter: 1.1.1 + unified: 10.1.2 + + remark-mdx-frontmatter@1.1.1: + dependencies: + estree-util-is-identifier-name: 1.1.0 + estree-util-value-to-estree: 1.3.0 + js-yaml: 4.1.0 + toml: 3.0.0 + + remark-mdx@2.3.0: + dependencies: + mdast-util-mdx: 2.0.1 + micromark-extension-mdxjs: 1.0.1 + transitivePeerDependencies: + - supports-color + + remark-mdx@3.0.1: + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + + remark-parse@10.0.2: + dependencies: + '@types/mdast': 3.0.15 + mdast-util-from-markdown: 1.3.1 + unified: 10.1.2 + transitivePeerDependencies: + - supports-color + + remark-parse@11.0.0: + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + + remark-rehype@10.1.0: + dependencies: + '@types/hast': 2.3.10 + '@types/mdast': 3.0.15 + mdast-util-to-hast: 12.3.0 + unified: 10.1.2 + + remark-stringify@11.0.0: + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + + require-directory@2.1.1: {} + + require-like@0.1.2: {} + + require-main-filename@2.0.0: {} + + requireindex@1.2.0: {} + + requires-port@1.0.0: {} + + resolve-cwd@3.0.0: + dependencies: + resolve-from: 5.0.0 + + resolve-dir@1.0.1: + dependencies: + expand-tilde: 2.0.2 + global-modules: 1.0.0 + + resolve-from@4.0.0: {} + + resolve-from@5.0.0: {} + + resolve-pkg-maps@1.0.0: {} + + resolve.exports@2.0.2: {} + + resolve@1.19.0: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + + resolve@1.22.8: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + resolve@2.0.0-next.5: + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + restore-cursor@3.1.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + restore-cursor@4.0.0: + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + retry@0.12.0: {} + + reusify@1.0.4: {} + + rimraf@3.0.2: + dependencies: + glob: 7.2.3 + + rollup@4.17.2: + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.17.2 + '@rollup/rollup-android-arm64': 4.17.2 + '@rollup/rollup-darwin-arm64': 4.17.2 + '@rollup/rollup-darwin-x64': 4.17.2 + '@rollup/rollup-linux-arm-gnueabihf': 4.17.2 + '@rollup/rollup-linux-arm-musleabihf': 4.17.2 + '@rollup/rollup-linux-arm64-gnu': 4.17.2 + '@rollup/rollup-linux-arm64-musl': 4.17.2 + '@rollup/rollup-linux-powerpc64le-gnu': 4.17.2 + '@rollup/rollup-linux-riscv64-gnu': 4.17.2 + '@rollup/rollup-linux-s390x-gnu': 4.17.2 + '@rollup/rollup-linux-x64-gnu': 4.17.2 + '@rollup/rollup-linux-x64-musl': 4.17.2 + '@rollup/rollup-win32-arm64-msvc': 4.17.2 + '@rollup/rollup-win32-ia32-msvc': 4.17.2 + '@rollup/rollup-win32-x64-msvc': 4.17.2 + fsevents: 2.3.3 + + rrweb-cssom@0.6.0: {} + + run-async@3.0.0: {} + + run-parallel@1.2.0: + dependencies: + queue-microtask: 1.2.3 + + rxjs@7.8.1: + dependencies: + tslib: 2.6.2 + + sade@1.8.1: + dependencies: + mri: 1.2.0 + + safe-array-concat@1.1.2: + dependencies: + call-bind: 1.0.7 + get-intrinsic: 1.2.4 + has-symbols: 1.0.3 + isarray: 2.0.5 + + safe-buffer@5.1.2: {} + + safe-buffer@5.2.1: {} + + safe-regex-test@1.0.3: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-regex: 1.1.4 + + safer-buffer@2.1.2: {} + + sass@1.76.0: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.5 + source-map-js: 1.2.0 + optional: true + + sass@1.77.0: + dependencies: + chokidar: 3.6.0 + immutable: 4.3.5 + source-map-js: 1.2.0 + + saxes@6.0.0: + dependencies: + xmlchars: 2.2.0 + + scheduler@0.23.2: + dependencies: + loose-envify: 1.4.0 + + semver@5.7.2: {} + + semver@6.3.1: {} + + semver@7.6.1: {} + + send@0.18.0: + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + sentence-case@3.0.4: + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + upper-case-first: 2.0.2 + + serve-static@1.15.0: + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + server-only@0.0.1: {} + + set-blocking@2.0.0: {} + + set-cookie-parser@2.6.0: {} + + set-function-length@1.2.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + function-bind: 1.1.2 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-property-descriptors: 1.0.2 + + set-function-name@2.0.2: + dependencies: + define-data-property: 1.1.4 + es-errors: 1.3.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.2 + + setprototypeof@1.2.0: {} + + shebang-command@1.2.0: + dependencies: + shebang-regex: 1.0.0 + + shebang-command@2.0.0: + dependencies: + shebang-regex: 3.0.0 + + shebang-regex@1.0.0: {} + + shebang-regex@3.0.0: {} + + shiki@0.14.7: + dependencies: + ansi-sequence-parser: 1.1.1 + jsonc-parser: 3.2.1 + vscode-oniguruma: 1.7.0 + vscode-textmate: 8.0.0 + + side-channel@1.0.6: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + get-intrinsic: 1.2.4 + object-inspect: 1.13.1 + + siginfo@2.0.0: {} + + signal-exit@3.0.7: {} + + signal-exit@4.1.0: {} + + sisteransi@1.0.5: {} + + slash@3.0.0: {} + + slash@4.0.0: {} + + smartwrap@2.0.2: + dependencies: + array.prototype.flat: 1.3.2 + breakword: 1.0.6 + grapheme-splitter: 1.0.4 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 15.4.1 + + snake-case@3.0.4: + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + + sort-object-keys@1.1.3: {} + + sort-package-json@2.10.0: + dependencies: + detect-indent: 7.0.1 + detect-newline: 4.0.1 + get-stdin: 9.0.0 + git-hooks-list: 3.1.0 + globby: 13.2.2 + is-plain-obj: 4.1.0 + semver: 7.6.1 + sort-object-keys: 1.1.3 + + source-map-js@1.2.0: {} + + source-map-support@0.5.13: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map-support@0.5.21: + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + source-map@0.6.1: {} + + source-map@0.7.4: {} + + source-map@0.8.0-beta.0: + dependencies: + whatwg-url: 7.1.0 + + space-separated-tokens@2.0.2: {} + + spawndamnit@2.0.0: + dependencies: + cross-spawn: 5.1.0 + signal-exit: 3.0.7 + + spdx-correct@3.2.0: + dependencies: + spdx-expression-parse: 3.0.1 + spdx-license-ids: 3.0.17 + + spdx-exceptions@2.5.0: {} + + spdx-expression-parse@3.0.1: + dependencies: + spdx-exceptions: 2.5.0 + spdx-license-ids: 3.0.17 + + spdx-license-ids@3.0.17: {} + + sprintf-js@1.0.3: {} + + ssri@10.0.6: + dependencies: + minipass: 7.1.0 + + stack-utils@2.0.6: + dependencies: + escape-string-regexp: 2.0.0 + + stackback@0.0.2: {} + + statuses@2.0.1: {} + + std-env@3.7.0: {} + + stdin-discarder@0.2.2: {} + + stream-shift@1.0.3: {} + + stream-slice@0.1.2: {} + + stream-transform@2.1.3: + dependencies: + mixme: 0.5.10 + + streamsearch@1.1.0: {} + + string-hash@1.1.3: {} + + string-length@4.0.2: + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + + string-width@4.2.3: + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + string-width@5.1.2: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + string-width@6.1.0: + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.3.0 + strip-ansi: 7.1.0 + + string-width@7.1.0: + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + + string.prototype.matchall@4.0.11: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-errors: 1.3.0 + es-object-atoms: 1.0.0 + get-intrinsic: 1.2.4 + gopd: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.7 + regexp.prototype.flags: 1.5.2 + set-function-name: 2.0.2 + side-channel: 1.0.6 + + string.prototype.trim@1.2.9: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-abstract: 1.23.3 + es-object-atoms: 1.0.0 + + string.prototype.trimend@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string.prototype.trimstart@1.0.8: + dependencies: + call-bind: 1.0.7 + define-properties: 1.2.1 + es-object-atoms: 1.0.0 + + string_decoder@1.1.1: + dependencies: + safe-buffer: 5.1.2 + + string_decoder@1.3.0: + dependencies: + safe-buffer: 5.2.1 + + stringify-entities@4.0.4: + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + strip-ansi@6.0.1: + dependencies: + ansi-regex: 5.0.1 + + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.0.1 + + strip-bom@3.0.0: {} + + strip-bom@4.0.0: {} + + strip-final-newline@2.0.0: {} + + strip-final-newline@3.0.0: {} + + strip-indent@3.0.0: + dependencies: + min-indent: 1.0.1 + + strip-json-comments@3.1.1: {} + + strip-literal@2.1.0: + dependencies: + js-tokens: 9.0.0 + + style-to-object@0.4.4: + dependencies: + inline-style-parser: 0.1.1 + + styled-jsx@5.1.1(@babel/core@7.24.5)(react@18.3.1): + dependencies: + client-only: 0.0.1 + react: 18.3.1 + optionalDependencies: + '@babel/core': 7.24.5 + + sucrase@3.35.0: + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.12 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + + superagent@9.0.2: + dependencies: + component-emitter: 1.3.1 + cookiejar: 2.1.4 + debug: 4.3.4 + fast-safe-stringify: 2.1.1 + form-data: 4.0.0 + formidable: 3.5.1 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.12.1 + transitivePeerDependencies: + - supports-color + + supertest@7.0.0: + dependencies: + methods: 1.1.2 + superagent: 9.0.2 + transitivePeerDependencies: + - supports-color + + supports-color@5.5.0: + dependencies: + has-flag: 3.0.0 + + supports-color@7.2.0: + dependencies: + has-flag: 4.0.0 + + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + + supports-color@9.4.0: {} + + supports-preserve-symlinks-flag@1.0.0: {} + + symbol-tree@3.2.4: {} + + synckit@0.9.0: + dependencies: + '@pkgr/core': 0.1.1 + tslib: 2.6.2 + + tapable@2.2.1: {} + + tar-fs@2.1.1: + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + + tar-stream@2.2.0: + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + + tar@6.2.1: + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + + term-size@2.2.1: {} + + test-exclude@6.0.0: + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + + text-table@0.2.0: {} + + thenify-all@1.6.0: + dependencies: + thenify: 3.3.1 + + thenify@3.3.1: + dependencies: + any-promise: 1.3.0 + + through2@2.0.5: + dependencies: + readable-stream: 2.3.8 + xtend: 4.0.2 + + tinybench@2.8.0: {} + + tinypool@0.8.4: {} + + tinyspy@2.2.1: {} + + title-case@3.0.3: + dependencies: + tslib: 2.6.2 + + tmp@0.0.33: + dependencies: + os-tmpdir: 1.0.2 + + tmpl@1.0.5: {} + + to-fast-properties@2.0.0: {} + + to-regex-range@5.0.1: + dependencies: + is-number: 7.0.0 + + toidentifier@1.0.1: {} + + toml@3.0.0: {} + + tough-cookie@4.1.4: + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + + tr46@1.0.1: + dependencies: + punycode: 2.3.1 + + tr46@3.0.0: + dependencies: + punycode: 2.3.1 + + tr46@5.0.0: + dependencies: + punycode: 2.3.1 + + tree-kill@1.2.2: {} + + trim-lines@3.0.1: {} + + trim-newlines@3.0.1: {} + + trough@2.2.0: {} + + ts-api-utils@1.3.0(typescript@5.4.5): + dependencies: + typescript: 5.4.5 + + ts-dedent@2.2.0: {} + + ts-interface-checker@0.1.13: {} + + ts-jest@29.1.2(@babel/core@7.24.5)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.24.5))(jest@29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)))(typescript@5.4.5): + dependencies: + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@20.12.10)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.1 + typescript: 5.4.5 + yargs-parser: 21.1.1 + optionalDependencies: + '@babel/core': 7.24.5 + '@jest/types': 29.6.3 + babel-jest: 29.7.0(@babel/core@7.24.5) + + ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5): + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 20.12.10 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + optional: true + + tsconfck@3.0.3(typescript@5.4.5): + optionalDependencies: + typescript: 5.4.5 + + tsconfig-paths@3.15.0: + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tsconfig-paths@4.2.0: + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + + tslib@1.14.1: {} + + tslib@2.6.2: {} + + tsup@8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))(typescript@5.4.5): + dependencies: + bundle-require: 4.1.0(esbuild@0.19.12) + cac: 6.7.14 + chokidar: 3.6.0 + debug: 4.3.4 + esbuild: 0.19.12 + execa: 5.1.1 + globby: 11.1.0 + joycon: 3.1.1 + postcss-load-config: 4.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5)) + resolve-from: 5.0.0 + rollup: 4.17.2 + source-map: 0.8.0-beta.0 + sucrase: 3.35.0 + tree-kill: 1.2.2 + optionalDependencies: + postcss: 8.4.38 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + - ts-node + + tsutils@3.21.0(typescript@5.4.5): + dependencies: + tslib: 1.14.1 + typescript: 5.4.5 + + tty-table@4.2.3: + dependencies: + chalk: 4.1.2 + csv: 5.5.3 + kleur: 4.1.5 + smartwrap: 2.0.2 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + yargs: 17.7.2 + + turbo-darwin-64@1.13.3: + optional: true + + turbo-darwin-arm64@1.13.3: + optional: true + + turbo-linux-64@1.13.3: + optional: true + + turbo-linux-arm64@1.13.3: + optional: true + + turbo-stream@2.0.1: {} + + turbo-windows-64@1.13.3: + optional: true + + turbo-windows-arm64@1.13.3: + optional: true + + turbo@1.13.3: + optionalDependencies: + turbo-darwin-64: 1.13.3 + turbo-darwin-arm64: 1.13.3 + turbo-linux-64: 1.13.3 + turbo-linux-arm64: 1.13.3 + turbo-windows-64: 1.13.3 + turbo-windows-arm64: 1.13.3 + + type-check@0.4.0: + dependencies: + prelude-ls: 1.2.1 + + type-detect@4.0.8: {} + + type-fest@0.13.1: {} + + type-fest@0.20.2: {} + + type-fest@0.21.3: {} + + type-fest@0.6.0: {} + + type-fest@0.8.1: {} + + type-fest@3.13.1: {} + + type-is@1.6.18: + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + typed-array-buffer@1.0.2: + dependencies: + call-bind: 1.0.7 + es-errors: 1.3.0 + is-typed-array: 1.1.13 + + typed-array-byte-length@1.0.1: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-byte-offset@1.0.2: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + + typed-array-length@1.0.6: + dependencies: + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-proto: 1.0.3 + is-typed-array: 1.1.13 + possible-typed-array-names: 1.0.0 + + typedarray@0.0.6: {} + + typedoc-plugin-extras@3.0.0(typedoc@0.25.13(typescript@5.4.5)): + dependencies: + typedoc: 0.25.13(typescript@5.4.5) + + typedoc-plugin-inline-sources@1.0.2(typedoc@0.25.13(typescript@5.4.5)): + dependencies: + typedoc: 0.25.13(typescript@5.4.5) + + typedoc-plugin-mdn-links@3.1.24(typedoc@0.25.13(typescript@5.4.5)): + dependencies: + typedoc: 0.25.13(typescript@5.4.5) + + typedoc-plugin-missing-exports@2.2.0(typedoc@0.25.13(typescript@5.4.5)): + dependencies: + typedoc: 0.25.13(typescript@5.4.5) + + typedoc-plugin-rename-defaults@0.7.0(typedoc@0.25.13(typescript@5.4.5)): + dependencies: + camelcase: 8.0.0 + typedoc: 0.25.13(typescript@5.4.5) + + typedoc-plugin-zod@1.1.2(typedoc@0.25.13(typescript@5.4.5)): + dependencies: + typedoc: 0.25.13(typescript@5.4.5) + + typedoc@0.25.13(typescript@5.4.5): + dependencies: + lunr: 2.3.9 + marked: 4.3.0 + minimatch: 9.0.4 + shiki: 0.14.7 + typescript: 5.4.5 + + typescript@5.4.5: {} + + ufo@1.5.3: {} + + uglify-js@3.17.4: + optional: true + + unbox-primitive@1.0.2: + dependencies: + call-bind: 1.0.7 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + unc-path-regex@0.1.2: {} + + undici-types@5.26.5: {} + + undici@6.16.0: {} + + unified-engine@11.2.1: + dependencies: + '@types/concat-stream': 2.0.3 + '@types/debug': 4.1.12 + '@types/is-empty': 1.2.3 + '@types/node': 20.12.10 + '@types/unist': 3.0.2 + concat-stream: 2.0.0 + debug: 4.3.4 + extend: 3.0.2 + glob: 10.3.12 + ignore: 5.3.1 + is-empty: 1.2.0 + is-plain-obj: 4.1.0 + load-plugin: 6.0.3 + parse-json: 7.1.1 + trough: 2.2.0 + unist-util-inspect: 8.0.0 + vfile: 6.0.1 + vfile-message: 4.0.2 + vfile-reporter: 8.1.1 + vfile-statistics: 3.0.0 + yaml: 2.4.2 + transitivePeerDependencies: + - supports-color + + unified@10.1.2: + dependencies: + '@types/unist': 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + + unified@11.0.4: + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + + unique-filename@3.0.0: + dependencies: + unique-slug: 4.0.0 + + unique-slug@4.0.0: + dependencies: + imurmurhash: 0.1.4 + + unist-util-generated@2.0.1: {} + + unist-util-inspect@8.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-is@5.2.1: + dependencies: + '@types/unist': 2.0.10 + + unist-util-is@6.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position-from-estree@1.1.2: + dependencies: + '@types/unist': 2.0.10 + + unist-util-position-from-estree@2.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-position@4.0.4: + dependencies: + '@types/unist': 2.0.10 + + unist-util-remove-position@4.0.2: + dependencies: + '@types/unist': 2.0.10 + unist-util-visit: 4.1.2 + + unist-util-remove-position@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + + unist-util-stringify-position@2.0.3: + dependencies: + '@types/unist': 2.0.10 + + unist-util-stringify-position@3.0.3: + dependencies: + '@types/unist': 2.0.10 + + unist-util-stringify-position@4.0.0: + dependencies: + '@types/unist': 3.0.2 + + unist-util-visit-parents@5.1.3: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + + unist-util-visit-parents@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + unist-util-visit@4.1.2: + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + + unist-util-visit@5.0.0: + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + universalify@0.1.2: {} + + universalify@0.2.0: {} + + universalify@2.0.1: {} + + unpipe@1.0.0: {} + + update-browserslist-db@1.0.15(browserslist@4.23.0): + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.0 + + upper-case-first@2.0.2: + dependencies: + tslib: 2.6.2 + + upper-case@2.0.2: + dependencies: + tslib: 2.6.2 + + uri-js@4.4.1: + dependencies: + punycode: 2.3.1 + + url-parse@1.5.10: + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + + use-editable@2.3.3(react@18.3.1): + dependencies: + react: 18.3.1 + + util-deprecate@1.0.2: {} + + util@0.12.5: + dependencies: + inherits: 2.0.4 + is-arguments: 1.1.1 + is-generator-function: 1.0.10 + is-typed-array: 1.1.13 + which-typed-array: 1.1.15 + + utils-merge@1.0.1: {} + + uvu@0.5.6: + dependencies: + dequal: 2.0.3 + diff: 5.2.0 + kleur: 4.1.5 + sade: 1.8.1 + + v8-compile-cache-lib@3.0.1: + optional: true + + v8-to-istanbul@9.2.0: + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + + v8flags@4.0.1: {} + + validate-npm-package-license@3.0.4: + dependencies: + spdx-correct: 3.2.0 + spdx-expression-parse: 3.0.1 + + validate-npm-package-name@5.0.1: {} + + vary@1.1.2: {} + + vfile-message@3.1.4: + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 3.0.3 + + vfile-message@4.0.2: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + + vfile-reporter@8.1.1: + dependencies: + '@types/supports-color': 8.1.3 + string-width: 6.1.0 + supports-color: 9.4.0 + unist-util-stringify-position: 4.0.0 + vfile: 6.0.1 + vfile-message: 4.0.2 + vfile-sort: 4.0.0 + vfile-statistics: 3.0.0 + + vfile-sort@4.0.0: + dependencies: + vfile: 6.0.1 + vfile-message: 4.0.2 + + vfile-statistics@3.0.0: + dependencies: + vfile: 6.0.1 + vfile-message: 4.0.2 + + vfile@5.3.7: + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + + vfile@6.0.1: + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + + vite-node@1.6.0(@types/node@20.12.10)(sass@1.77.0): + dependencies: + cac: 6.7.14 + debug: 4.3.4 + pathe: 1.1.2 + picocolors: 1.0.0 + vite: 5.2.11(@types/node@20.12.10)(sass@1.77.0) + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vite-tsconfig-paths@4.3.2(typescript@5.4.5)(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0)): + dependencies: + debug: 4.3.4 + globrex: 0.1.2 + tsconfck: 3.0.3(typescript@5.4.5) + optionalDependencies: + vite: 5.2.11(@types/node@20.12.10)(sass@1.77.0) + transitivePeerDependencies: + - supports-color + - typescript + + vite@5.2.11(@types/node@20.12.10)(sass@1.77.0): + dependencies: + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.17.2 + optionalDependencies: + '@types/node': 20.12.10 + fsevents: 2.3.3 + sass: 1.77.0 + + vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0): + dependencies: + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.4 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.0 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.2.11(@types/node@20.12.10)(sass@1.77.0) + vite-node: 1.6.0(@types/node@20.12.10)(sass@1.77.0) + why-is-node-running: 2.2.2 + optionalDependencies: + '@types/node': 20.12.10 + jsdom: 24.0.0 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + + vscode-oniguruma@1.7.0: {} + + vscode-textmate@8.0.0: {} + + w3c-xmlserializer@4.0.0: + dependencies: + xml-name-validator: 4.0.0 + + w3c-xmlserializer@5.0.0: + dependencies: + xml-name-validator: 5.0.0 + + walk-up-path@3.0.1: {} + + walker@1.0.8: + dependencies: + makeerror: 1.0.12 + + wcwidth@1.0.1: + dependencies: + defaults: 1.0.4 + + web-encoding@1.1.5: + dependencies: + util: 0.12.5 + optionalDependencies: + '@zxing/text-encoding': 0.9.0 + + web-streams-polyfill@3.3.3: {} + + webidl-conversions@4.0.2: {} + + webidl-conversions@7.0.0: {} + + whatwg-encoding@2.0.0: + dependencies: + iconv-lite: 0.6.3 + + whatwg-encoding@3.1.1: + dependencies: + iconv-lite: 0.6.3 + + whatwg-mimetype@3.0.0: {} + + whatwg-mimetype@4.0.0: {} + + whatwg-url@11.0.0: + dependencies: + tr46: 3.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@14.0.0: + dependencies: + tr46: 5.0.0 + webidl-conversions: 7.0.0 + + whatwg-url@7.1.0: + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + + which-boxed-primitive@1.0.2: + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + which-builtin-type@1.1.3: + dependencies: + function.prototype.name: 1.1.6 + has-tostringtag: 1.0.2 + is-async-function: 2.0.0 + is-date-object: 1.0.5 + is-finalizationregistry: 1.0.2 + is-generator-function: 1.0.10 + is-regex: 1.1.4 + is-weakref: 1.0.2 + isarray: 2.0.5 + which-boxed-primitive: 1.0.2 + which-collection: 1.0.2 + which-typed-array: 1.1.15 + + which-collection@1.0.2: + dependencies: + is-map: 2.0.3 + is-set: 2.0.3 + is-weakmap: 2.0.2 + is-weakset: 2.0.3 + + which-module@2.0.1: {} + + which-pm@2.0.0: + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + + which-typed-array@1.1.15: + dependencies: + available-typed-arrays: 1.0.7 + call-bind: 1.0.7 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.2 + + which@1.3.1: + dependencies: + isexe: 2.0.0 + + which@2.0.2: + dependencies: + isexe: 2.0.0 + + which@3.0.1: + dependencies: + isexe: 2.0.0 + + why-is-node-running@2.2.2: + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + + word-wrap@1.2.5: {} + + wordwrap@1.0.0: {} + + wrap-ansi@6.2.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + wrappy@1.0.2: {} + + write-file-atomic@4.0.2: + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + + ws@7.5.9: {} + + ws@8.17.0: {} + + xml-name-validator@4.0.0: {} + + xml-name-validator@5.0.0: {} + + xmlchars@2.2.0: {} + + xtend@4.0.2: {} + + y18n@4.0.3: {} + + y18n@5.0.8: {} + + yallist@2.1.2: {} + + yallist@3.1.1: {} + + yallist@4.0.0: {} + + yaml@2.4.2: {} + + yargs-parser@18.1.3: + dependencies: + camelcase: 5.3.1 + decamelize: 1.2.0 + + yargs-parser@21.1.1: {} + + yargs@15.4.1: + dependencies: + cliui: 6.0.0 + decamelize: 1.2.0 + find-up: 4.1.0 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + require-main-filename: 2.0.0 + set-blocking: 2.0.0 + string-width: 4.2.3 + which-module: 2.0.1 + y18n: 4.0.3 + yargs-parser: 18.1.3 + + yargs@17.7.2: + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + yn@3.1.1: + optional: true + + yocto-queue@0.1.0: {} + + yocto-queue@1.0.0: {} + + zwitch@2.0.4: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..a7594d70 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,5 @@ +packages: + - "examples/*" + - "packages/*" + - "lib" + - "scripts" diff --git a/popper.png b/popper.png new file mode 100644 index 0000000000000000000000000000000000000000..e91cc83630a300e91689110aecb689e15a9a737b GIT binary patch literal 125685 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ⅆ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 f1.title.localeCompare(f2.title)); + +const readMeLines = [ + "# Featured packages built with this template.", + "", + "> This file is automatically generated. Please refrain from editing it directly. To add your package, update `scripts/featured.json` in alphabetical order.", + "", +]; + +featured.forEach(f => { + readMeLines.push(`- [${f.title}](${f.href}) - ${f.description}`); +}); + +readMeLines.push(""); + +fs.writeFileSync(path.resolve(__dirname, "..", "FEATURED.md"), readMeLines.join("\n")); diff --git a/scripts/featured.json b/scripts/featured.json new file mode 100644 index 00000000..8831ae2e --- /dev/null +++ b/scripts/featured.json @@ -0,0 +1,37 @@ +[ + { + "title": "React18 Global Store", + "description": "A simple yet elegant, light weight, react18 global store to replace Zustand for better tree shaking.", + "href": "https://github.com/react18-tools/react18-global-store" + }, + { + "title": "Nextjs-Themes", + "description": "🤟 👉 Theme with confidence and Unleash the Power of React Server Components", + "href": "https://github.com/react18-tools/nextjs-themes" + }, + { + "title": "esbuild-plugin-react18", + "description": "An esbuild plugin for compiling libraries compatible with React 18 server and client component, Nextjs13, and Nextjs14", + "href": "https://github.com/react18-tools/esbuild-plugin-react18" + }, + { + "title": "Zustand Sync Tabs", + "description": "Zustand middleware to easily sync Zustand state between tabs / windows / iframes (Same Origin)", + "href": "https://github.com/react18-tools/zustand-sync-tabs" + }, + { + "title": "Persist-And-Sync", + "description": "Zustand middleware to easily persist and sync Zustand state between tabs / windows / iframes (Same Origin)", + "href": "https://github.com/react18-tools/persist-and-sync" + }, + { + "title": "React 18 Themes", + "description": "🤟 👉 Unleash the Power of React Server Components", + "href": "https://github.com/react18-tools/react18-themes" + }, + { + "title": "esbuild-plugin-react18-css", + "description": "ESBuild plugin to handle CSS/SCSS modules, autoprefixer, etc.", + "href": "https://github.com/react18-tools/esbuild-plugin-react18-css" + } +] diff --git a/scripts/manual-publish.js b/scripts/manual-publish.js new file mode 100644 index 00000000..4132b4c3 --- /dev/null +++ b/scripts/manual-publish.js @@ -0,0 +1,68 @@ +/** + * allow only patch changes from release branches. + * Major and minor changes allowed only from main branch. + * pre-release only from branch containing dev or alpha in the branchname + */ + +/** Let the following error be thrown by npm. There are situations where publish could have failed for different reasons. */ +// throws an exception if process.env.oldv === process.env.v The library version is not up to date, error(" Not able to release to the same version. + +const { execSync } = require("child_process"); + +const BRANCH = process.env.BRANCH; +const DEFAULT_BRANCH = process.env.DEFAULT_BRANCH; + +const isLatestRelease = BRANCH === DEFAULT_BRANCH || BRANCH.includes("release-"); +let tag = "latest"; + +const OLD_VERSION = require("../lib/package.json").version; +if (!isLatestRelease) { + /** pre-release branch name should be the tag name (e.g., beta, canery, etc.) or tag name followed by a '-' and version or other specifiers. e.g. beta-2.0 */ + tag = BRANCH.split("-")[0]; + try { + execSync(`pnpm changeset pre enter ${tag}`); + } catch (e) { + console.log({ e }); + } +} +/** Apply changeset */ +execSync("pnpm changeset version"); +const NEW_VERSION = require("../lib/package.json").version; + +// exit pre mode -- to avoid collision with full releases +try { + execSync("pnpm changeset pre exit"); +} catch {} + +const [newMajor, newMinor] = NEW_VERSION.split("."); +const [oldMajor, oldMinor] = OLD_VERSION.split("."); + +const isNotPatch = newMajor !== oldMajor || newMinor !== oldMinor; + +const pushCmd = `git add . && git commit -m "Apply changesets and update CHANGELOG" && git push origin ${BRANCH}`; + +if (isNotPatch && BRANCH === DEFAULT_BRANCH) { + execSync(pushCmd); + /** Create new release branch for every Major or Minor release */ + const releaseBranch = `release-${newMajor}.${newMinor}`; + execSync(`git checkout -b ${releaseBranch} && git push origin ${releaseBranch}`); +} else if (isLatestRelease) { + /** New version must be valid SEMVER version. No pre-release (beta/alpha etc.) */ + if (!/^\d+\.\d+.\d+$/.test(NEW_VERSION)) throw new Error("Invalid version"); + + if (isNotPatch) + throw new Error("Major or Minor changes can be published only from the default branch."); + + // Push changes back to the repo + execSync(pushCmd); +} else { + execSync(pushCmd); +} + +/** Create release */ +execSync(`cd lib && pnpm build && npm publish --provenance --access public --tag ${tag}`); + +/** Create GitHub release */ +execSync( + `gh release create ${NEW_VERSION} --generate-notes${isLatestRelease ? " --latest" : ""} -n "$(sed '1,/^## /d;/^## /,$d' CHANGELOG.md)" --title "Release v${NEW_VERSION}"`, +); diff --git a/scripts/package.json b/scripts/package.json new file mode 100644 index 00000000..cecf59af --- /dev/null +++ b/scripts/package.json @@ -0,0 +1,7 @@ +{ + "name": "@repo/scripts", + "version": "0.0.0", + "description": "", + "main": "rebrand.js", + "scripts": {} +} diff --git a/scripts/publish.js b/scripts/publish.js new file mode 100644 index 00000000..d2f7ac9b --- /dev/null +++ b/scripts/publish.js @@ -0,0 +1,39 @@ +/** It is assumed that this is called only from the default branch. */ +const { execSync } = require("child_process"); + +// Apply changesets if any -- e.g., coming from pre-release branches +try { + execSync("pnpm changeset pre exit"); +} catch {} +try { + execSync("pnpm changeset version"); + execSync( + `git add . && git commit -m "Apply changesets and update CHANGELOG" && git push origin ${process.env.BRANCH}`, + ); +} catch { + // no changesets to be applied +} + +const LATEST_VERSION = execSync("npm view react18-loaders version").toString(); +const VERSION = require("../lib/package.json").version; + +console.log({ VERSION, LATEST_VERSION }); + +const [newMajor, newMinor] = VERSION.split("."); +const [oldMajor, oldMinor] = LATEST_VERSION.split("."); + +const isPatch = newMajor === oldMajor && newMinor === oldMinor; + +if (!isPatch) { + /** Create new release branch for every Major or Minor release */ + const releaseBranch = `release-${newMajor}.${newMinor}`; + execSync(`git checkout -b ${releaseBranch} && git push origin ${releaseBranch}`); +} + +/** Create release */ +execSync("cd lib && pnpm build && npm publish --provenance --access public"); + +/** Create GitHub release */ +execSync( + `gh release create ${VERSION} --generate-notes --latest -n "$(sed '1,/^## /d;/^## /,$d' CHANGELOG.md)" --title "Release v${VERSION}"`, +); diff --git a/scripts/rebrand.config.json b/scripts/rebrand.config.json new file mode 100644 index 00000000..369c88b9 --- /dev/null +++ b/scripts/rebrand.config.json @@ -0,0 +1,6 @@ +{ + "owner": "react18-tools", + "npm_user": "mayank1513", + "repo": "esbuild-plugin-react18", + "packageName": "esbuild-plugin-react18" +} diff --git a/scripts/rebrand.js b/scripts/rebrand.js new file mode 100644 index 00000000..b1dcc213 --- /dev/null +++ b/scripts/rebrand.js @@ -0,0 +1,136 @@ +const fs = require("fs"); +const path = require("path"); +const rebrandConfig = require("./rebrand.config.json"); +const packageJSON = require("../lib/package.json"); + +const rootDir = process.cwd(); +const oldPkgName = packageJSON.name; +const [oldOwner, oldRepo] = packageJSON.repository.split(":")[1].split("/"); + +const { packageName, owner, repo } = rebrandConfig; + +// Rebrand lib packageJSON +packageJSON.name = packageName; +packageJSON.description = ""; +packageJSON.version = "0.0.0"; +packageJSON.repository = `github:${owner}/${repo}`; +packageJSON.funding.pop(); +packageJSON.bugs = `https://github.com/${owner}/${repo}/issues`; +packageJSON.homepage = `https://github.com/${owner}/${repo}/#readme`; +packageJSON.funding.unshift({ + type: "github", + url: `https://github.com/sponsors/${owner}`, +}); +packageJSON.keywords = packageJSON.keywords.slice(2); + +fs.writeFileSync( + path.resolve(rootDir, "lib", "package.json"), + JSON.stringify(packageJSON, null, 2), +); + +const updatePkgAndRemoveChangelogs = dir => { + // update package.json for packages and examples + const pkgPath = path.resolve(dir, "package.json"); + const pkg = JSON.parse(fs.readFileSync(pkgPath, "utf-8")); + pkg.version = "0.0.0"; + if (pkg.dependencies?.[oldPkgName]) { + pkg.dependencies[oldPkgName] = "latest"; + pkg.dependencies[packageJSON.name] = "workspace:*"; + } else if (pkg.devDependencies?.[oldPkgName]) { + pkg.devDependencies[oldPkgName] = "latest"; + pkg.dependencies[packageJSON.name] = "workspace:*"; + } + + fs.writeFileSync(pkgPath, JSON.stringify(pkg, null, 2)); + + // Delete old changelogs + try { + fs.unlinkSync(path.resolve(dir, "CHANGELOG.md")); + } catch { + /* empty */ + } +}; + +["examples", "packages"].forEach(dir => { + fs.readdirSync(path.resolve(rootDir, dir)).forEach(f => + updatePkgAndRemoveChangelogs(path.resolve(rootDir, dir, f)), + ); +}); + +try { + fs.unlinkSync(path.resolve(rootDir, "lib", "CHANGELOG.md")); +} catch { + /* empty */ +} + +// Update README +const readme = fs + .readFileSync(path.resolve(rootDir, "lib", "README.md"), "utf-8") + .replace(new RegExp(oldPkgName, "g"), packageName) + .replace(new RegExp(oldOwner, "g"), owner) + .replace(new RegExp(oldRepo, "g"), repo) + .replace( + new RegExp(oldPkgName.replace("-", " "), "ig"), + packageName + .split("-") + .map(w => w[0].toUpperCase() + w.slice(1)) + .join(" "), + ) + .replace(/> This package also.*[^\n]/, ""); +fs.writeFileSync(path.resolve(rootDir, "README.md"), readme); +fs.writeFileSync(path.resolve(rootDir, "lib", "README.md"), readme); + +// Update TODO.md +const todoPath = path.resolve(rootDir, "TODO.md"); +const todo = fs + .readFileSync(todoPath, "utf-8") + .replace("[repo settings]", `[repo settings](https://github.com/${owner}/${repo}/settings/pages)`) + .replace( + "[repository secret]", + `[repository secret]((https://github.com/${owner}/${repo}/settings/secrets/actions))`, + ) + .replace( + "[private vulnerability reporting]", + `[private vulnerability reporting](https://github.com/${owner}/${repo}/security)`, + ) + .replace("- [ ] Create a new GitHub repository", "- [x] Create a new GitHub repository"); +fs.writeFileSync(todoPath, todo); + +// Update workflows +const workflowsPath = path.resolve(rootDir, ".github", "workflows"); +/** Update publish and manual-publish workflows */ +const updatePublishFlow = name => { + const publishWorkflowPath = path.resolve(workflowsPath, name); + const publishWorkflow = fs + .readFileSync(publishWorkflowPath, "utf-8") + .replace("# - name", "- name") + .replace("# run", " run") + .replace(oldOwner, owner); + fs.writeFileSync(publishWorkflowPath, publishWorkflow); +}; + +updatePublishFlow("publish.yml"); +updatePublishFlow("manual-publish.yml"); + +fs.unlinkSync(path.resolve(workflowsPath, "setup.yml")); + +const docsWorkflowPath = path.resolve(workflowsPath, "docs.yml"); +fs.writeFileSync( + docsWorkflowPath, + fs.readFileSync(docsWorkflowPath, "utf-8").replace(oldOwner, owner), +); + +// clean up +const rootPackageJSON = require("../package.json"); +const { exec } = require("child_process"); +delete rootPackageJSON.scripts.postinstall; +try { + fs.writeFileSync(path.resolve(rootDir, "package.json"), JSON.stringify(rootPackageJSON, null, 2)); +} catch (e) { + console.error(e); +} + +// clean lib/src and craete commit +exec( + 'rm -rf ./lib/src/ && git add . && git commit -m "Rebrand 💖 Mayank Kumar Chaudhari [skip ci]" && turbo telemetry disable', +); diff --git a/templates/component.hbs b/templates/component.hbs new file mode 100644 index 00000000..22e6165d --- /dev/null +++ b/templates/component.hbs @@ -0,0 +1,24 @@ +import { HTMLProps } from "react"; +import styles from "./{{ kebabCase name }}.module.scss"; + +interface {{ pascalCase name }}Props extends HTMLProps { +} + +/** + * {{ description }} + * + * @example + * ```tsx + * <{{ pascalCase name }} /> + * ``` + * + * @source - Source code + */ +export function {{ pascalCase name }}({ children, ...props }: {{ pascalCase name }}Props) { + const className = [props.className, styles["{{ kebabCase name }}"]].filter(Boolean).join(" "); + return ( +
+ {children} +
+ ); +} diff --git a/templates/component.module.hbs b/templates/component.module.hbs new file mode 100644 index 00000000..686b6082 --- /dev/null +++ b/templates/component.module.hbs @@ -0,0 +1,3 @@ +.{{ kebabCase name }} { + /* create your container styles here */ +} \ No newline at end of file diff --git a/templates/component.test.hbs b/templates/component.test.hbs new file mode 100644 index 00000000..47d5a426 --- /dev/null +++ b/templates/component.test.hbs @@ -0,0 +1,13 @@ +import { cleanup, render, screen } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { {{ pascalCase name }} } from "./{{ kebabCase name }}"; + +describe.concurrent("{{ kebabCase name }}", () => { + afterEach(cleanup); + + test("Dummy test - test if renders without errors", ({ expect }) => { + const clx = "my-class"; + render(<{{ pascalCase name }} className={clx} />); + expect(screen.getByTestId("{{ kebabCase name }}").classList).toContain(clx); + }); +}); diff --git a/tsconfig.docs.json b/tsconfig.docs.json new file mode 100644 index 00000000..54d11d9d --- /dev/null +++ b/tsconfig.docs.json @@ -0,0 +1,9 @@ +{ + "extends": "@repo/typescript-config/react-library.json", + "compilerOptions": { + "lib": ["dom", "ES2015"], + "types": ["node"] + }, + "include": ["./lib/src/**/*.*"], + "exclude": ["**/*.test.tsx", "**/index.ts", "dist", "build", "node_modules"] +} diff --git a/turbo.json b/turbo.json new file mode 100644 index 00000000..aa44592a --- /dev/null +++ b/turbo.json @@ -0,0 +1,25 @@ +{ + "$schema": "https://turbo.build/schema.json", + "pipeline": { + "build": { + "dependsOn": ["^build"] + }, + "test": { + "outputs": ["coverage/**"], + "dependsOn": ["^build"] + }, + "lint": { + "dependsOn": ["^build"] + }, + "typecheck": { + "dependsOn": ["^build"] + }, + "dev": { + "dependsOn": ["^build"], + "persistent": true + }, + "clean": { + "cache": false + } + } +} diff --git a/typedoc.config.js b/typedoc.config.js new file mode 100644 index 00000000..db6843c8 --- /dev/null +++ b/typedoc.config.js @@ -0,0 +1,20 @@ +/** @type {import('typedoc').TypeDocOptions} */ +module.exports = { + tsconfig: "tsconfig.docs.json", + name: "React18 Loaders", + entryPoints: ["./lib/src"], + exclude: ["**/*.test.tsx", "**/index.ts", "**/declaration.d.ts"], + entryPointStrategy: "Expand", + out: "./docs", + commentStyle: "all", + searchInComments: true, + excludeExternals: true, + plugin: [ + "typedoc-plugin-mdn-links", + "typedoc-plugin-rename-defaults", + "typedoc-plugin-missing-exports", + "typedoc-plugin-zod", + "typedoc-plugin-inline-sources", + // "typedoc-plugin-extras", + ], +}; From cff6a053ef5e2c76ffc9ffd094482bc97248b9ed Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 11:16:16 +0530 Subject: [PATCH 03/24] =?UTF-8?q?Rebrand=20=F0=9F=92=96=20Mayank=20Ku?= =?UTF-8?q?mar=20Chaudhari=20[skip=20ci]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/manual-publish.yml | 4 +- .github/workflows/publish.yml | 4 +- .github/workflows/setup.yml | 35 ------ README.md | 116 +++++++++++------- TODO.md | 8 +- examples/express/package.json | 2 +- examples/nextjs/package.json | 5 +- examples/remix/package.json | 7 +- examples/vite/package.json | 7 +- lib/CHANGELOG.md | 49 -------- lib/README.md | 36 +++--- lib/package.json | 22 ++-- lib/src/client/index.ts | 10 -- lib/src/client/loader-container/index.ts | 3 - .../loader-container.module.scss | 13 -- .../loader-container.test.tsx | 11 -- .../loader-container/loader-container.tsx | 16 --- lib/src/constants.ts | 3 - lib/src/declaration.d.ts | 2 - lib/src/hooks/index.ts | 1 - lib/src/hooks/use-loader.test.tsx | 16 --- lib/src/hooks/use-loader.ts | 11 -- lib/src/index.ts | 9 -- lib/src/server/bars/bars1/bars1.module.scss | 28 ----- lib/src/server/bars/bars1/bars1.test.tsx | 11 -- lib/src/server/bars/bars1/bars1.tsx | 14 --- lib/src/server/bars/bars1/index.ts | 1 - lib/src/server/bars/bars2/bars2.module.scss | 45 ------- lib/src/server/bars/bars2/bars2.test.tsx | 11 -- lib/src/server/bars/bars2/bars2.tsx | 14 --- lib/src/server/bars/bars2/index.ts | 1 - lib/src/server/bars/index.ts | 4 - lib/src/server/common/base/base.test.tsx | 12 -- lib/src/server/common/base/base.tsx | 38 ------ lib/src/server/common/base/index.ts | 1 - lib/src/server/common/index.ts | 3 - lib/src/server/dots/dots1/dots1.module.scss | 16 --- lib/src/server/dots/dots1/dots1.test.tsx | 11 -- lib/src/server/dots/dots1/dots1.tsx | 14 --- lib/src/server/dots/dots1/index.ts | 1 - lib/src/server/dots/dots2/dots2.module.scss | 37 ------ lib/src/server/dots/dots2/dots2.test.tsx | 11 -- lib/src/server/dots/dots2/dots2.tsx | 19 --- lib/src/server/dots/dots2/index.ts | 1 - lib/src/server/dots/index.ts | 4 - lib/src/server/index.ts | 9 -- package.json | 5 +- packages/config-eslint/package.json | 2 +- packages/config-typescript/package.json | 2 +- packages/shared/CHANGELOG.md | 42 ------- packages/shared/package.json | 7 +- 51 files changed, 127 insertions(+), 627 deletions(-) delete mode 100644 .github/workflows/setup.yml delete mode 100644 lib/CHANGELOG.md delete mode 100644 lib/src/client/index.ts delete mode 100644 lib/src/client/loader-container/index.ts delete mode 100644 lib/src/client/loader-container/loader-container.module.scss delete mode 100644 lib/src/client/loader-container/loader-container.test.tsx delete mode 100644 lib/src/client/loader-container/loader-container.tsx delete mode 100644 lib/src/constants.ts delete mode 100644 lib/src/declaration.d.ts delete mode 100644 lib/src/hooks/index.ts delete mode 100644 lib/src/hooks/use-loader.test.tsx delete mode 100644 lib/src/hooks/use-loader.ts delete mode 100644 lib/src/index.ts delete mode 100644 lib/src/server/bars/bars1/bars1.module.scss delete mode 100644 lib/src/server/bars/bars1/bars1.test.tsx delete mode 100644 lib/src/server/bars/bars1/bars1.tsx delete mode 100644 lib/src/server/bars/bars1/index.ts delete mode 100644 lib/src/server/bars/bars2/bars2.module.scss delete mode 100644 lib/src/server/bars/bars2/bars2.test.tsx delete mode 100644 lib/src/server/bars/bars2/bars2.tsx delete mode 100644 lib/src/server/bars/bars2/index.ts delete mode 100644 lib/src/server/bars/index.ts delete mode 100644 lib/src/server/common/base/base.test.tsx delete mode 100644 lib/src/server/common/base/base.tsx delete mode 100644 lib/src/server/common/base/index.ts delete mode 100644 lib/src/server/common/index.ts delete mode 100644 lib/src/server/dots/dots1/dots1.module.scss delete mode 100644 lib/src/server/dots/dots1/dots1.test.tsx delete mode 100644 lib/src/server/dots/dots1/dots1.tsx delete mode 100644 lib/src/server/dots/dots1/index.ts delete mode 100644 lib/src/server/dots/dots2/dots2.module.scss delete mode 100644 lib/src/server/dots/dots2/dots2.test.tsx delete mode 100644 lib/src/server/dots/dots2/dots2.tsx delete mode 100644 lib/src/server/dots/dots2/index.ts delete mode 100644 lib/src/server/dots/index.ts delete mode 100644 lib/src/server/index.ts delete mode 100644 packages/shared/CHANGELOG.md diff --git a/.github/workflows/manual-publish.yml b/.github/workflows/manual-publish.yml index 7fe9b255..0d74587c 100644 --- a/.github/workflows/manual-publish.yml +++ b/.github/workflows/manual-publish.yml @@ -32,8 +32,8 @@ jobs: run: | git config --global user.name "mayank1513" git config --global user.email "mayank.srmu@gmail.com" - # - name: Copy Readme file - # run: cp ../README.md . # todo: uncomment this line while rebranding + - name: Copy Readme file + run: cp ../README.md . # todo: uncomment this line while rebranding - name: Apply changesets, publish and create release, branches and tags run: node ./scripts/manual-publish.js env: diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml index 8c774974..f9026d15 100644 --- a/.github/workflows/publish.yml +++ b/.github/workflows/publish.yml @@ -34,8 +34,8 @@ jobs: run: | git config --global user.name "mayank1513" git config --global user.email "mayank.srmu@gmail.com" - # - name: Copy Readme file - # run: cp ../README.md . # will be uncommented while rebranding + - name: Copy Readme file + run: cp ../README.md . # will be uncommented while rebranding - name: Apply changesets, publish and create release, branches and tags run: node ./scripts/publish.js env: diff --git a/.github/workflows/setup.yml b/.github/workflows/setup.yml deleted file mode 100644 index 346ec6ef..00000000 --- a/.github/workflows/setup.yml +++ /dev/null @@ -1,35 +0,0 @@ -name: setup repo - -on: - create: - workflow_dispatch: - -jobs: - setup: - if: github.ref == 'refs/heads/main' - runs-on: ubuntu-latest - permissions: - contents: write - steps: - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: Setup Git - run: | - git config --global user.name "Mayank Chaudhari" - git config --global user.email "mayank.srmu@gmail.com" - git fetch - git checkout main - - name: Set up repo - run: | - sed -i -e "s/rebrand/postinstall/" package.json - sed -i -e "s/.*owner.*/\t\"owner\": \"${{ github.repository_owner }}\",/" ./scripts/rebrand.config.json - sed -i -e "s/.*npm_user.*/\t\"npm_user\": \"${{ github.repository_owner }}\",/" ./scripts/rebrand.config.json - sed -i -e "s/.*repo.*/\t\"repo\": \"${{ github.event.repository.name }}\",/" ./scripts/rebrand.config.json - sed -i -e "s/.*packageName.*/\t\"packageName\": \"${{ github.event.repository.name }}\"/" ./scripts/rebrand.config.json - git rm .tkb - - name: Push changes back to repo - run: | - git add . - git commit -m 'Craete rebrand config 💖 Mayank Kumar Chaudhari [skip ci]' - git push origin main diff --git a/README.md b/README.md index 834e2d8c..a1496c93 100644 --- a/README.md +++ b/README.md @@ -1,85 +1,111 @@ -# Turborepo Template +# Esbuild Plugin React18 -[![test](https://github.com/react18-tools/turborepo-template/actions/workflows/test.yml/badge.svg)](https://github.com/react18-tools/turborepo-template/actions/workflows/test.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/aa896ec14c570f3bb274/maintainability)](https://codeclimate.com/github/react18-tools/turborepo-template/maintainability) [![codecov](https://codecov.io/gh/react18-tools/turborepo-template/graph/badge.svg)](https://codecov.io/gh/react18-tools/turborepo-template) [![Version](https://img.shields.io/npm/v/react18-loaders.svg?colorB=green)](https://www.npmjs.com/package/react18-loaders) [![Downloads](https://img.jsdelivr.com/img.shields.io/npm/d18m/react18-loaders.svg)](https://www.npmjs.com/package/react18-loaders) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/react18-loaders) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/from-referrer/) +[![test](https://github.com/react18-tools/esbuild-plugin-react18/actions/workflows/test.yml/badge.svg)](https://github.com/react18-tools/esbuild-plugin-react18/actions/workflows/test.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/aa896ec14c570f3bb274/maintainability)](https://codeclimate.com/github/react18-tools/esbuild-plugin-react18/maintainability) [![codecov](https://codecov.io/gh/react18-tools/esbuild-plugin-react18/graph/badge.svg)](https://codecov.io/gh/react18-tools/esbuild-plugin-react18) [![Version](https://img.shields.io/npm/v/esbuild-plugin-react18.svg?colorB=green)](https://www.npmjs.com/package/esbuild-plugin-react18) [![Downloads](https://img.jsdelivr.com/img.shields.io/npm/d18m/esbuild-plugin-react18.svg)](https://www.npmjs.com/package/esbuild-plugin-react18) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/esbuild-plugin-react18) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/from-referrer/) -> [Explore featured packages built with this template.](./FEATURED.md) +Esbuild Plugin React18 is a comprehensive library designed to unlock the full potential of React 18 server components. It provides customizable loading animation components and a fullscreen loader container, seamlessly integrating with React and Next.js. -> Exciting news! We've launched a new course to help you master this template: [Craft Next Gen UI Libraries for React 18 and Next.js 14](https://www.udemy.com/course/craft-next-gen-ui-libraries-for-react-18-and-nextjs-14/?referralCode=46B8C7845ECCEA99E0EF) +✅ Fully Treeshakable (import from `esbuild-plugin-react18/client/loader-container`) -## Features +✅ Fully TypeScript Supported -This template offers the following pre-configured features. Additionally, your repository will automatically be rebranded with the help of workflows and post-install scripts. +✅ Leverages the power of React 18 Server components -✅ Monorepo powered by Turborepo and GitHub actions for automating building, testing, and deploying your library +✅ Compatible with all React 18 build systems/tools/frameworks -✅ Examples with Next.js, Vite, and Remix to showcase how your library can be utilized (Note: Remix is optional due to instability in monorepo setup and folder imports) +✅ Documented with [Typedoc](https://react18-tools.github.io/esbuild-plugin-react18) ([Docs](https://react18-tools.github.io/esbuild-plugin-react18)) -✅ Examples pre-configured for Light/Dark theme based on user preference +✅ Examples for Next.js, Vite, and Remix -✅ Examples ready to be deployed to Vercel +> Please consider starring [this repository](https://github.com/react18-tools/esbuild-plugin-react18) and sharing it with your friends. -✅ Typedoc setup for automatic documentation generation based on tsdoc comments +## Getting Started -✅ Code of Conduct and contributing files, ready for customization +### Installation -✅ Prettier and linter configured according to modern best practices (Feel free to add your flavor) +```bash +$ pnpm add esbuild-plugin-react18 +``` -✅ Recommended VSCode extensions - Prettier and [Kanban board](https://github.com/mayank1513/vscode-extension-trello-kanban-board) for code formatting and project management directly within your IDE +**_or_** -✅ Powerful code generators - try `yarn plop` +```bash +$ npm install esbuild-plugin-react18 +``` -✅ Test setup with Vitest - A modern and fast testing framework supporting Jest-like APIs +**_or_** -✅ Workflows to automate testing on every pull-request or code push event +```bash +$ yarn add esbuild-plugin-react18 +``` -✅ Workflow to automatically publish and create GitHub releases when you update your library's `package.json` file. +### Import Styles -✅ Workflow to automatically rebrand the entire template based on your repository name. (Refer [TODO.md](./TODO.md)) +You can import styles globally or within specific components. -✅ Plus, this readme file includes a quick checklist for configuring Codecov and other badges, setting up your docs website on GitHub pages, and more. See [Checklist](./TODO.md). +```css +/* globals.css */ +@import "esbuild-plugin-react18/dist"; +``` -### Creates a library that is +```tsx +// layout.tsx +import "esbuild-plugin-react18/dist/index.css"; +``` -✅ Fully Treeshakable (e.g., import {Bars1, Bars2} from `react18-loaders/dist/server/bars`) +For selective imports: -✅ Fully TypeScript Supported +```css +/* globals.css */ +@import "esbuild-plugin-react18/dist/client"; /** required if you are using LoaderContainer */ +@import "esbuild-plugin-react18/dist/server/bars/bars1"; +``` -✅ Leverages the power of React 18 Server components +### Usage -✅ Compatible with all React 18 build systems/tools/frameworks - -✅ Documented with [Typedoc](https://react18-tools.github.io/turborepo-template) ([Docs](https://react18-tools.github.io/turborepo-template)) +Using loaders is straightforward. -## Getting Started: +```tsx +import { Bars1 } from "esbuild-plugin-react18/dist/server/bars/bars1"; -This template is based on one of the official Turbo Repo starters but comes with a plethora of additional features specifically designed for developing and publishing JavaScript/TypeScript libraries, especially for React 18. +export default function MyComponent() { + return someCondition ? : <>Something else...; +} +``` -To get started, simply click on the `"Use this template"` button to create a new repository based on this template. Customize it according to your requirements for your next JavaScript/TypeScript/React/Next.js library or project. +For detailed API and options, refer to [the API documentation](https://react18-tools.github.io/esbuild-plugin-react18). -For detailed instructions and a checklist, please refer to [TODO.md](./TODO.md). +**Using LoaderContainer** -## What's Different from Turborepo official templates? +`LoaderContainer` is a fullscreen component. You can add this component directly in your layout and then use `useLoader` hook to toggle its visibility. -Compared to the default scaffold from create-turbo, this template offers: +```tsx +// layout.tsx + + ... +``` -- Unit tests with `vitest` -- Build setup with `tsup` and `esbuild-plugin-react18` that supports React Server components out of the box -- **Automatic file generation** - - Simply run `yarn plop` and follow the prompts to auto-generate your new component with test files and dependency linking, adhering to best practices automatically -- GitHub actions/workflows to auto-publish your package when the version changes -- GitHub action/workflow + pre-install scripts to automatically rebrand your repo on creation +```tsx +// some other page or component +import { useLoader } from "esbuild-plugin-react18/dist/hooks"; -### 🤩 Don't forget to star [this repository](https://github.com/react18-tools/turborepo-template)! +export default MyComponent() { + const { setLoading } = useLoader(); + useCallback(()=>{ + setLoading(true); + ...do some work + setLoading(false); + }, []) + ... +} +``` -Looking for a hands-on course to get started with Turborepo? Check out [React and Next.js with TypeScript](https://mayank-chaudhari.vercel.app/courses/react-and-next-js-with-typescript) and [The Game of Chess with Next.js, React, and TypeScript](https://www.udemy.com/course/game-of-chess-with-nextjs-react-and-typescript/?referralCode=851A28F10B254A8523FE) +## License -![Repo Stats](https://repobeats.axiom.co/api/embed/2ef1a24385037998386148afe5a98ded6006f410.svg "Repobeats analytics image") +This library is licensed under the MPL-2.0 open-source license. -## License -Licensed under the MPL-2.0 open-source license. -> Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work. +> Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work.
diff --git a/TODO.md b/TODO.md index a68e00cd..78518a55 100644 --- a/TODO.md +++ b/TODO.md @@ -1,7 +1,7 @@ ## Step-by-Step Instructions and Checklist - [ ] Star [this repository](https://github.com/react18-tools/turborepo-template/) for easy access and to show your support -- [ ] Create a new GitHub repository using this template. +- [x] Create a new GitHub repository using this template. - Click the `Use this template` button at the top right -> `Create a new repository` - Click `Create repository` and wait for the setup workflow to finish rebranding your repo. - [ ] Install and set up Node.js and your IDE (VSCode recommended) @@ -13,10 +13,10 @@ - [ ] Install dependencies using `pnpm` - Run `pnpm i` to install dependencies; the `rebrand` script will automatically rebrand the repo, adjust workflows, and create a commit - [ ] Run `yarn plop`, and follow prompts to generate server or client components for your library -- [ ] 🌟 Enable [private vulnerability reporting] +- [ ] 🌟 Enable [private vulnerability reporting](https://github.com/react18-tools/esbuild-plugin-react18/security) - [ ] Set up `CodeCov` - Visit Codecov and set up your repo - - Create [repository secret] for `CODECOV_TOKEN` + - Create [repository secret]((https://github.com/react18-tools/esbuild-plugin-react18/settings/secrets/actions)) for `CODECOV_TOKEN` - [ ] Set up `CodeClimate` - Visit CodeClimate and set up your repo - Create [repository secret] for `CC_TEST_REPORTER_ID` @@ -30,7 +30,7 @@ - [ ] Create your library and update examples - [ ] Update README as required - [ ] Set up GitHub pages to deploy docs - - Go to [repo settings] -> pages (On the left panel); Select deploy from a branch; Then Select `main` and `/docs` + - Go to [repo settings](https://github.com/react18-tools/esbuild-plugin-react18/settings/pages) -> pages (On the left panel); Select deploy from a branch; Then Select `main` and `/docs` - [ ] (Optional) Set up [Deepsource](https://app.deepsource.com/login) for static code analysis - [ ] Push your changes/Create PR and see your library being automatically tested and published - [ ] Optionally deploy your examples to Vercel. diff --git a/examples/express/package.json b/examples/express/package.json index 1b33dd86..ba8c9f0f 100644 --- a/examples/express/package.json +++ b/examples/express/package.json @@ -37,4 +37,4 @@ "tsup": "^8.0.2", "typescript": "^5.4.5" } -} +} \ No newline at end of file diff --git a/examples/nextjs/package.json b/examples/nextjs/package.json index 88971c07..d03d908e 100644 --- a/examples/nextjs/package.json +++ b/examples/nextjs/package.json @@ -18,7 +18,8 @@ "nextjs-themes": "^3.1.1", "react": "^18.3.1", "react-dom": "^18.3.1", - "react18-loaders": "workspace:*" + "react18-loaders": "latest", + "esbuild-plugin-react18": "workspace:*" }, "devDependencies": { "@next/eslint-plugin-next": "^14.2.3", @@ -29,4 +30,4 @@ "@types/react-dom": "^18.3.0", "typescript": "^5.4.5" } -} +} \ No newline at end of file diff --git a/examples/remix/package.json b/examples/remix/package.json index f2628c1a..479eebad 100644 --- a/examples/remix/package.json +++ b/examples/remix/package.json @@ -19,8 +19,9 @@ "@repo/shared": "workspace:*", "react": "^18.3.1", "react-dom": "^18.3.1", - "react18-loaders": "workspace:*", - "react18-themes": "^3.1.0" + "react18-loaders": "latest", + "react18-themes": "^3.1.0", + "esbuild-plugin-react18": "workspace:*" }, "devDependencies": { "@remix-run/dev": "^2.9.1", @@ -33,4 +34,4 @@ "engines": { "node": ">=18" } -} +} \ No newline at end of file diff --git a/examples/vite/package.json b/examples/vite/package.json index abc79f80..460075f7 100644 --- a/examples/vite/package.json +++ b/examples/vite/package.json @@ -14,8 +14,9 @@ "@repo/shared": "workspace:*", "react": "^18.3.1", "react-dom": "^18.3.1", - "react18-loaders": "workspace:*", - "react18-themes": "^3.1.0" + "react18-loaders": "latest", + "react18-themes": "^3.1.0", + "esbuild-plugin-react18": "workspace:*" }, "devDependencies": { "@repo/eslint-config": "workspace:*", @@ -26,4 +27,4 @@ "typescript": "^5.4.5", "vite": "^5.2.11" } -} +} \ No newline at end of file diff --git a/lib/CHANGELOG.md b/lib/CHANGELOG.md deleted file mode 100644 index 2b9bddde..00000000 --- a/lib/CHANGELOG.md +++ /dev/null @@ -1,49 +0,0 @@ -# react18-loaders - -## 1.0.0 - -### Minor Changes - -- d80cde0: test minor - -### Patch Changes - -- 6ad42c8: test patch canary - -## 1.0.0-canary.1 - -### Minor Changes - -- d80cde0: test minor - -### Patch Changes - -- 6ad42c8: test patch canary - -## 1.0.0-canary.0 - -### Major Changes - -- b1f029b: test major - -### Minor Changes - -- d80cde0: test minor - -### Patch Changes - -- 6ad42c8: test patch canary - -## 0.0.2 - -### Patch Changes - -- 1d4dec0: debug creation of release and pushing back to the repo -- 52eb814: Test canary -- ea8e4ee: test canary release - -## 0.0.1 - -### Patch Changes - -- 0c17b4a: Fix: add z-index for loader container diff --git a/lib/README.md b/lib/README.md index 582f6c2d..a1496c93 100644 --- a/lib/README.md +++ b/lib/README.md @@ -1,10 +1,10 @@ -# React18 Loaders +# Esbuild Plugin React18 -[![test](https://github.com/react18-tools/turborepo-template/actions/workflows/test.yml/badge.svg)](https://github.com/react18-tools/turborepo-template/actions/workflows/test.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/aa896ec14c570f3bb274/maintainability)](https://codeclimate.com/github/react18-tools/turborepo-template/maintainability) [![codecov](https://codecov.io/gh/react18-tools/turborepo-template/graph/badge.svg)](https://codecov.io/gh/react18-tools/turborepo-template) [![Version](https://img.shields.io/npm/v/react18-loaders.svg?colorB=green)](https://www.npmjs.com/package/react18-loaders) [![Downloads](https://img.jsdelivr.com/img.shields.io/npm/d18m/react18-loaders.svg)](https://www.npmjs.com/package/react18-loaders) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/react18-loaders) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/from-referrer/) +[![test](https://github.com/react18-tools/esbuild-plugin-react18/actions/workflows/test.yml/badge.svg)](https://github.com/react18-tools/esbuild-plugin-react18/actions/workflows/test.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/aa896ec14c570f3bb274/maintainability)](https://codeclimate.com/github/react18-tools/esbuild-plugin-react18/maintainability) [![codecov](https://codecov.io/gh/react18-tools/esbuild-plugin-react18/graph/badge.svg)](https://codecov.io/gh/react18-tools/esbuild-plugin-react18) [![Version](https://img.shields.io/npm/v/esbuild-plugin-react18.svg?colorB=green)](https://www.npmjs.com/package/esbuild-plugin-react18) [![Downloads](https://img.jsdelivr.com/img.shields.io/npm/d18m/esbuild-plugin-react18.svg)](https://www.npmjs.com/package/esbuild-plugin-react18) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/esbuild-plugin-react18) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/from-referrer/) -React18 Loaders is a comprehensive library designed to unlock the full potential of React 18 server components. It provides customizable loading animation components and a fullscreen loader container, seamlessly integrating with React and Next.js. +Esbuild Plugin React18 is a comprehensive library designed to unlock the full potential of React 18 server components. It provides customizable loading animation components and a fullscreen loader container, seamlessly integrating with React and Next.js. -✅ Fully Treeshakable (import from `react18-loaders/client/loader-container`) +✅ Fully Treeshakable (import from `esbuild-plugin-react18/client/loader-container`) ✅ Fully TypeScript Supported @@ -12,30 +12,30 @@ React18 Loaders is a comprehensive library designed to unlock the full potential ✅ Compatible with all React 18 build systems/tools/frameworks -✅ Documented with [Typedoc](https://react18-tools.github.io/turborepo-template) ([Docs](https://react18-tools.github.io/turborepo-template)) +✅ Documented with [Typedoc](https://react18-tools.github.io/esbuild-plugin-react18) ([Docs](https://react18-tools.github.io/esbuild-plugin-react18)) ✅ Examples for Next.js, Vite, and Remix -> Please consider starring [this repository](https://github.com/react18-tools/turborepo-template) and sharing it with your friends. +> Please consider starring [this repository](https://github.com/react18-tools/esbuild-plugin-react18) and sharing it with your friends. ## Getting Started ### Installation ```bash -$ pnpm add react18-loaders +$ pnpm add esbuild-plugin-react18 ``` **_or_** ```bash -$ npm install react18-loaders +$ npm install esbuild-plugin-react18 ``` **_or_** ```bash -$ yarn add react18-loaders +$ yarn add esbuild-plugin-react18 ``` ### Import Styles @@ -44,20 +44,20 @@ You can import styles globally or within specific components. ```css /* globals.css */ -@import "react18-loaders/dist"; +@import "esbuild-plugin-react18/dist"; ``` ```tsx // layout.tsx -import "react18-loaders/dist/index.css"; +import "esbuild-plugin-react18/dist/index.css"; ``` For selective imports: ```css /* globals.css */ -@import "react18-loaders/dist/client"; /** required if you are using LoaderContainer */ -@import "react18-loaders/dist/server/bars/bars1"; +@import "esbuild-plugin-react18/dist/client"; /** required if you are using LoaderContainer */ +@import "esbuild-plugin-react18/dist/server/bars/bars1"; ``` ### Usage @@ -65,14 +65,14 @@ For selective imports: Using loaders is straightforward. ```tsx -import { Bars1 } from "react18-loaders/dist/server/bars/bars1"; +import { Bars1 } from "esbuild-plugin-react18/dist/server/bars/bars1"; export default function MyComponent() { return someCondition ? : <>Something else...; } ``` -For detailed API and options, refer to [the API documentation](https://react18-tools.github.io/turborepo-template). +For detailed API and options, refer to [the API documentation](https://react18-tools.github.io/esbuild-plugin-react18). **Using LoaderContainer** @@ -86,7 +86,7 @@ For detailed API and options, refer to [the API documentation](https://react18-t ```tsx // some other page or component -import { useLoader } from "react18-loaders/dist/hooks"; +import { useLoader } from "esbuild-plugin-react18/dist/hooks"; export default MyComponent() { const { setLoading } = useLoader(); @@ -103,9 +103,9 @@ export default MyComponent() { This library is licensed under the MPL-2.0 open-source license. -> This package also serves as an example demonstrating how to build and publish a `React.js` library compatible with React Server Components. -> Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work. + +> Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work.
diff --git a/lib/package.json b/lib/package.json index 10734cc7..0d9d1473 100644 --- a/lib/package.json +++ b/lib/package.json @@ -1,16 +1,16 @@ { - "name": "react18-loaders", + "name": "esbuild-plugin-react18", "author": "Mayank Kumar Chaudhari ", "private": false, - "version": "1.0.0", - "description": "A comprehensive library that unleashes the full potential of React 18 server components, providing customizable loading animation components alongside a fullscreen loader container. Designed to seamlessly integrate with React and Next.js.", + "version": "0.0.0", + "description": "", "license": "MPL-2.0", "main": "./dist/index.js", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", - "repository": "github:react18-tools/turborepo-template", - "bugs": "https://github.com/react18-tools/turborepo-template/issues", - "homepage": "https://turborepo-template-three.vercel.app/", + "repository": "github:react18-tools/esbuild-plugin-react18", + "bugs": "https://github.com/react18-tools/esbuild-plugin-react18/issues", + "homepage": "https://github.com/react18-tools/esbuild-plugin-react18/#readme", "sideEffects": false, "files": [ "dist/**" @@ -59,16 +59,14 @@ "funding": [ { "type": "github", - "url": "https://github.com/sponsors/mayank1513" + "url": "https://github.com/sponsors/react18-tools" }, { - "type": "individual", - "url": "https://pages.razorpay.com/mayank1513" + "type": "github", + "url": "https://github.com/sponsors/mayank1513" } ], "keywords": [ - "Loading animations", - "Fullscreen loader", "React", "React Loaders", "React 18", @@ -86,4 +84,4 @@ "Modern", "Seamless integration" ] -} +} \ No newline at end of file diff --git a/lib/src/client/index.ts b/lib/src/client/index.ts deleted file mode 100644 index e7e26776..00000000 --- a/lib/src/client/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -"use client"; - -/** - * Server components and client components need to be exported from separate files as - * directive on top of the file from which component is imported takes effect. - * i.e., server component re-exported from file with "use client" will behave as client component - * */ - -// client component exports -export * from "./loader-container"; diff --git a/lib/src/client/loader-container/index.ts b/lib/src/client/loader-container/index.ts deleted file mode 100644 index f262bb1d..00000000 --- a/lib/src/client/loader-container/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -"use client"; - -export * from "./loader-container"; diff --git a/lib/src/client/loader-container/loader-container.module.scss b/lib/src/client/loader-container/loader-container.module.scss deleted file mode 100644 index 3a6dc2dd..00000000 --- a/lib/src/client/loader-container/loader-container.module.scss +++ /dev/null @@ -1,13 +0,0 @@ -.container { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - display: flex; - align-items: center; - justify-content: center; - backdrop-filter: blur(3px); - background: #87ceeb85; - z-index: 1000; -} diff --git a/lib/src/client/loader-container/loader-container.test.tsx b/lib/src/client/loader-container/loader-container.test.tsx deleted file mode 100644 index 273f42a0..00000000 --- a/lib/src/client/loader-container/loader-container.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { cleanup, render } from "@testing-library/react"; -import { afterEach, describe, test } from "vitest"; -import { LoaderContainer } from "./loader-container"; - -describe.concurrent("loader-container", () => { - afterEach(cleanup); - - test("check if renders without erros", () => { - render(); - }); -}); diff --git a/lib/src/client/loader-container/loader-container.tsx b/lib/src/client/loader-container/loader-container.tsx deleted file mode 100644 index 9e146548..00000000 --- a/lib/src/client/loader-container/loader-container.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import styles from "./loader-container.module.scss"; -import useRGS from "r18gs"; -import { LOADER_RGS_KEY } from "../../constants"; - -interface LoaderContainerProps extends React.HTMLProps { - children?: React.ReactNode; -} - -/** - * # LoaderContainer - * A full screen container for the loading animation. - */ -export function LoaderContainer({ children }: LoaderContainerProps) { - const [loading] = useRGS(LOADER_RGS_KEY, false); - return loading ?
{children}
: null; -} diff --git a/lib/src/constants.ts b/lib/src/constants.ts deleted file mode 100644 index 6a07b259..00000000 --- a/lib/src/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -/** generate uuid to avoid conflicting keys */ -const uuid = () => (Date.now() * Math.random()).toString(16).slice(2, 8); -export const LOADER_RGS_KEY = `loader-${uuid()}`; diff --git a/lib/src/declaration.d.ts b/lib/src/declaration.d.ts deleted file mode 100644 index e6c7b7b2..00000000 --- a/lib/src/declaration.d.ts +++ /dev/null @@ -1,2 +0,0 @@ -declare module "*.module.css"; -declare module "*.module.scss"; diff --git a/lib/src/hooks/index.ts b/lib/src/hooks/index.ts deleted file mode 100644 index 5e7fac64..00000000 --- a/lib/src/hooks/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./use-loader"; diff --git a/lib/src/hooks/use-loader.test.tsx b/lib/src/hooks/use-loader.test.tsx deleted file mode 100644 index 304d696b..00000000 --- a/lib/src/hooks/use-loader.test.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { cleanup, render, renderHook, act } from "@testing-library/react"; -import { afterEach, describe, test } from "vitest"; -import { LoaderContainer } from "../client"; -import { useLoader } from "./use-loader"; - -describe.concurrent("loader-container", () => { - afterEach(cleanup); - - test("Test hook", ({ expect }) => { - const { result } = renderHook(() => useLoader()); - const { container } = render(); - expect(container.childElementCount).toBe(0); - act(() => result.current.setLoading(true)); - expect(container.childElementCount).toBe(1); - }); -}); diff --git a/lib/src/hooks/use-loader.ts b/lib/src/hooks/use-loader.ts deleted file mode 100644 index c14e7a70..00000000 --- a/lib/src/hooks/use-loader.ts +++ /dev/null @@ -1,11 +0,0 @@ -import useRGS from "r18gs"; -import { LOADER_RGS_KEY } from "../constants"; - -/** - * - * @returns - */ -export function useLoader() { - const [loading, setLoading] = useRGS(LOADER_RGS_KEY); - return { loading, setLoading }; -} diff --git a/lib/src/index.ts b/lib/src/index.ts deleted file mode 100644 index db127bb1..00000000 --- a/lib/src/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -"use client"; -/** - * Don't export client side components from here. - * - * Hooks are okay to export from here as they do not require "use client" directive. - */ - -export * from "./client"; -export * from "./hooks"; diff --git a/lib/src/server/bars/bars1/bars1.module.scss b/lib/src/server/bars/bars1/bars1.module.scss deleted file mode 100644 index 9e896efb..00000000 --- a/lib/src/server/bars/bars1/bars1.module.scss +++ /dev/null @@ -1,28 +0,0 @@ -/* HTML:
*/ -.loader { - width: 45px; - aspect-ratio: 1; - --c: #000; - --b: no-repeat repeating-linear-gradient(90deg, var(--c) 0 calc(100% / 7), #0000 0 calc(200% / 7)); - background: var(--b), var(--b), var(--b), var(--b); - background-size: 140% 26%; - animation: l27 0.75s infinite linear; -} -@keyframes l27 { - 0%, - 20% { - background-position: - 0 calc(0 * 100% / 3), - 100% calc(1 * 100% / 3), - 0 calc(2 * 100% / 3), - 100% calc(3 * 100% / 3); - } - 80%, - 100% { - background-position: - 100% calc(0 * 100% / 3), - 0 calc(1 * 100% / 3), - 100% calc(2 * 100% / 3), - 0 calc(3 * 100% / 3); - } -} diff --git a/lib/src/server/bars/bars1/bars1.test.tsx b/lib/src/server/bars/bars1/bars1.test.tsx deleted file mode 100644 index a840b77d..00000000 --- a/lib/src/server/bars/bars1/bars1.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { cleanup, render } from "@testing-library/react"; -import { afterEach, describe, test } from "vitest"; -import { Bars1 } from "./bars1"; - -describe.concurrent("bars1", () => { - afterEach(cleanup); - - test("check if renders without errors", () => { - render(); - }); -}); diff --git a/lib/src/server/bars/bars1/bars1.tsx b/lib/src/server/bars/bars1/bars1.tsx deleted file mode 100644 index f4ffd57b..00000000 --- a/lib/src/server/bars/bars1/bars1.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import styles from "./bars1.module.scss"; -import { Base, BaseProps } from "../../common"; - -/** - * A simple loader with 3 dots. - * - * @example - * - * - * @source - */ -export function Bars1(props: BaseProps) { - return ; -} diff --git a/lib/src/server/bars/bars1/index.ts b/lib/src/server/bars/bars1/index.ts deleted file mode 100644 index 451cb05b..00000000 --- a/lib/src/server/bars/bars1/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./bars1"; diff --git a/lib/src/server/bars/bars2/bars2.module.scss b/lib/src/server/bars/bars2/bars2.module.scss deleted file mode 100644 index dc655553..00000000 --- a/lib/src/server/bars/bars2/bars2.module.scss +++ /dev/null @@ -1,45 +0,0 @@ -/* HTML:
*/ -.loader { - width: 45px; - aspect-ratio: 1; - --c: #000; - --b: no-repeat linear-gradient(var(--c) 0 0); - background: - var(--b) 0% 50%, - var(--b) 50% 50%, - var(--b) 100% 50%; - background-size: 20% 100%; - animation: l1 1s infinite linear; -} -@keyframes l1 { - 0% { - background-size: - 20% 100%, - 20% 100%, - 20% 100%; - } - 33% { - background-size: - 20% 10%, - 20% 100%, - 20% 100%; - } - 50% { - background-size: - 20% 100%, - 20% 10%, - 20% 100%; - } - 66% { - background-size: - 20% 100%, - 20% 100%, - 20% 10%; - } - 100% { - background-size: - 20% 100%, - 20% 100%, - 20% 100%; - } -} diff --git a/lib/src/server/bars/bars2/bars2.test.tsx b/lib/src/server/bars/bars2/bars2.test.tsx deleted file mode 100644 index 8372373c..00000000 --- a/lib/src/server/bars/bars2/bars2.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { cleanup, render } from "@testing-library/react"; -import { afterEach, describe, test } from "vitest"; -import { Bars2 } from "./bars2"; - -describe.concurrent("bars2", () => { - afterEach(cleanup); - - test("check if renders without errors", () => { - render(); - }); -}); diff --git a/lib/src/server/bars/bars2/bars2.tsx b/lib/src/server/bars/bars2/bars2.tsx deleted file mode 100644 index 775640ee..00000000 --- a/lib/src/server/bars/bars2/bars2.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import styles from "./bars2.module.scss"; -import { Base, BaseProps } from "../../common"; - -/** - * A simple loader with 3 dots. - * - * @example - * - * - * @source - */ -export function Bars2(props: BaseProps) { - return ; -} diff --git a/lib/src/server/bars/bars2/index.ts b/lib/src/server/bars/bars2/index.ts deleted file mode 100644 index 9781c2d9..00000000 --- a/lib/src/server/bars/bars2/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./bars2"; diff --git a/lib/src/server/bars/index.ts b/lib/src/server/bars/index.ts deleted file mode 100644 index 71c72f95..00000000 --- a/lib/src/server/bars/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -// bars component exports - -export * from "./bars1"; -export * from "./bars2"; diff --git a/lib/src/server/common/base/base.test.tsx b/lib/src/server/common/base/base.test.tsx deleted file mode 100644 index a39e7763..00000000 --- a/lib/src/server/common/base/base.test.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import { cleanup, render } from "@testing-library/react"; -import { afterEach, describe, test } from "vitest"; -import { Base } from "./base"; - -describe.concurrent("base", () => { - afterEach(cleanup); - - test("check if h1 heading exists", ({ expect }) => { - const { container } = render(); - expect(container.children[0].classList).toContain("my-clx"); - }); -}); diff --git a/lib/src/server/common/base/base.tsx b/lib/src/server/common/base/base.tsx deleted file mode 100644 index bf276433..00000000 --- a/lib/src/server/common/base/base.tsx +++ /dev/null @@ -1,38 +0,0 @@ -import { HTMLProps } from "react"; - -/** Interface declaring the common properties of the loaders */ -export interface BaseProps extends HTMLProps { - /** width of the loader element in pixels or a string with a length unit. */ - width?: number | string; - /** height of the loader element in pixels or a string with a length unit. */ - height?: number | string; - /** Color of the dots - CSS compatible color */ - color?: string; -} - -/** Other props - loaderClass is included here as we will extend BaseProps for other loaders */ -interface OtherProps { - /** Loader class name */ - loaderClass: string; - dotRadius?: number | string; -} - -/** - * Base component to avoid code duplication - * - * default values should be specified in css files - so no need to set them in JSX - */ -export function Base({ - width, - height, - color, - loaderClass, - dotRadius, - ...props -}: BaseProps & OtherProps) { - const style = { ...props.style, width, height, "--c": color }; - // @ts-expect-error -- it is intensional - if (dotRadius) style["--r"] = dotRadius; - const className = [props.className, loaderClass].filter(Boolean).join(" "); - return
; -} diff --git a/lib/src/server/common/base/index.ts b/lib/src/server/common/base/index.ts deleted file mode 100644 index 955fdd14..00000000 --- a/lib/src/server/common/base/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./base"; diff --git a/lib/src/server/common/index.ts b/lib/src/server/common/index.ts deleted file mode 100644 index 40b78e78..00000000 --- a/lib/src/server/common/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -// common component exports - -export * from "./base"; diff --git a/lib/src/server/dots/dots1/dots1.module.scss b/lib/src/server/dots/dots1/dots1.module.scss deleted file mode 100644 index c84414f9..00000000 --- a/lib/src/server/dots/dots1/dots1.module.scss +++ /dev/null @@ -1,16 +0,0 @@ -/* HTML:
*/ -.loader { - --c: #000; - width: 60px; - aspect-ratio: 4; - background: radial-gradient(circle closest-side, var(--c) 90%, #0000) 0 / calc(100% / 3) 100% - space; - clip-path: inset(0 100% 0 0); - animation: anim 1s steps(4) infinite; -} - -@keyframes anim { - to { - clip-path: inset(0 -34% 0 0); - } -} diff --git a/lib/src/server/dots/dots1/dots1.test.tsx b/lib/src/server/dots/dots1/dots1.test.tsx deleted file mode 100644 index 91aae611..00000000 --- a/lib/src/server/dots/dots1/dots1.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { cleanup, render } from "@testing-library/react"; -import { afterEach, describe, test } from "vitest"; -import { Dots1 } from "./dots1"; - -describe.concurrent("dots1", () => { - afterEach(cleanup); - - test("check if renders without erros", () => { - render(); - }); -}); diff --git a/lib/src/server/dots/dots1/dots1.tsx b/lib/src/server/dots/dots1/dots1.tsx deleted file mode 100644 index ed048956..00000000 --- a/lib/src/server/dots/dots1/dots1.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import styles from "./dots1.module.scss"; -import { Base, BaseProps } from "../../common"; - -/** - * A simple loader with 3 dots. - * - * @example - * - * - * @source - */ -export function Dots1(props: BaseProps) { - return ; -} diff --git a/lib/src/server/dots/dots1/index.ts b/lib/src/server/dots/dots1/index.ts deleted file mode 100644 index 277e40de..00000000 --- a/lib/src/server/dots/dots1/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./dots1"; diff --git a/lib/src/server/dots/dots2/dots2.module.scss b/lib/src/server/dots/dots2/dots2.module.scss deleted file mode 100644 index 8933d160..00000000 --- a/lib/src/server/dots/dots2/dots2.module.scss +++ /dev/null @@ -1,37 +0,0 @@ -/* HTML:
*/ -.loader { - width: 32px; - aspect-ratio: 1; - --c: #000; - --dot-radius: 20%; - --_g: no-repeat radial-gradient(farthest-side, var(--c) 90%, #0000); - background: var(--_g), var(--_g), var(--_g), var(--_g); - background-size: calc(2 * var(--dot-radius)) calc(2 * var(--dot-radius)); - animation: anim 1s infinite; -} - -@keyframes anim { - 0% { - background-position: - 0 0, - 100% 0, - 100% 100%, - 0 100%; - } - 40%, - 50% { - background-position: - 100% 100%, - 100% 0, - 0 0, - 0 100%; - } - 90%, - 100% { - background-position: - 100% 100%, - 0 100%, - 0 0, - 100% 0; - } -} diff --git a/lib/src/server/dots/dots2/dots2.test.tsx b/lib/src/server/dots/dots2/dots2.test.tsx deleted file mode 100644 index 87f0284e..00000000 --- a/lib/src/server/dots/dots2/dots2.test.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import { cleanup, render } from "@testing-library/react"; -import { afterEach, describe, test } from "vitest"; -import { Dots2 } from "./dots2"; - -describe.concurrent("dots2", () => { - afterEach(cleanup); - - test("check if renders without errors", () => { - render(); - }); -}); diff --git a/lib/src/server/dots/dots2/dots2.tsx b/lib/src/server/dots/dots2/dots2.tsx deleted file mode 100644 index d911fa2b..00000000 --- a/lib/src/server/dots/dots2/dots2.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import styles from "./dots2.module.scss"; -import { Base, BaseProps } from "../../common"; - -interface Dots2Props extends BaseProps { - /** Radius of the dots in pixels or a string with a length unit. */ - dotRadius?: number | string; -} - -/** - * A simple loader with 3 dots. - * - * @example - * - * - * @source - */ -export function Dots2(props: Dots2Props) { - return ; -} diff --git a/lib/src/server/dots/dots2/index.ts b/lib/src/server/dots/dots2/index.ts deleted file mode 100644 index e7f74741..00000000 --- a/lib/src/server/dots/dots2/index.ts +++ /dev/null @@ -1 +0,0 @@ -export * from "./dots2"; diff --git a/lib/src/server/dots/index.ts b/lib/src/server/dots/index.ts deleted file mode 100644 index b7857aaa..00000000 --- a/lib/src/server/dots/index.ts +++ /dev/null @@ -1,4 +0,0 @@ -// dots component exports - -export * from "./dots1"; -export * from "./dots2"; diff --git a/lib/src/server/index.ts b/lib/src/server/index.ts deleted file mode 100644 index 58b74bca..00000000 --- a/lib/src/server/index.ts +++ /dev/null @@ -1,9 +0,0 @@ -/** - * need to export server components and client components from separate files as - * directive on top of the file from which component is imported takes effect. - * i.e., server component re-exported from file with "use client" will behave as client component - * */ - -// server component exports -export * from "./dots"; -export * from "./bars"; diff --git a/package.json b/package.json index 56aeabcc..a6058eab 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,7 @@ "format": "prettier --write \"**/*.{ts,tsx,md,css,scss}\"", "lint": "turbo lint", "test": "turbo test", - "typecheck": "turbo typecheck", - "postinstall": "node scripts/rebrand.js" + "typecheck": "turbo typecheck" }, "devDependencies": { "@changesets/cli": "^2.27.1", @@ -32,4 +31,4 @@ "dependencies": { "@types/node": "^20.12.10" } -} +} \ No newline at end of file diff --git a/packages/config-eslint/package.json b/packages/config-eslint/package.json index 65eaef13..47c1d573 100644 --- a/packages/config-eslint/package.json +++ b/packages/config-eslint/package.json @@ -10,4 +10,4 @@ "eslint-plugin-only-warn": "^1.1.0", "eslint-plugin-storybook": "^0.8.0" } -} +} \ No newline at end of file diff --git a/packages/config-typescript/package.json b/packages/config-typescript/package.json index 27c0e604..ac9f0b12 100644 --- a/packages/config-typescript/package.json +++ b/packages/config-typescript/package.json @@ -6,4 +6,4 @@ "publishConfig": { "access": "public" } -} +} \ No newline at end of file diff --git a/packages/shared/CHANGELOG.md b/packages/shared/CHANGELOG.md deleted file mode 100644 index a7f246d0..00000000 --- a/packages/shared/CHANGELOG.md +++ /dev/null @@ -1,42 +0,0 @@ -# @repo/shared - -## 0.0.3 - -### Patch Changes - -- Updated dependencies [6ad42c8] -- Updated dependencies [d80cde0] - - react18-loaders@1.0.0 - -## 0.0.3-canary.1 - -### Patch Changes - -- Updated dependencies [6ad42c8] -- Updated dependencies [d80cde0] - - react18-loaders@1.0.0-canary.1 - -## 0.0.3-canary.0 - -### Patch Changes - -- Updated dependencies [6ad42c8] -- Updated dependencies [d80cde0] -- Updated dependencies [b1f029b] - - react18-loaders@1.0.0-canary.0 - -## 0.0.2 - -### Patch Changes - -- Updated dependencies [1d4dec0] -- Updated dependencies [52eb814] -- Updated dependencies [ea8e4ee] - - react18-loaders@0.0.2 - -## 0.0.1 - -### Patch Changes - -- Updated dependencies [0c17b4a] - - react18-loaders@0.0.1 diff --git a/packages/shared/package.json b/packages/shared/package.json index aef398a0..2606c452 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -1,6 +1,6 @@ { "name": "@repo/shared", - "version": "0.0.3", + "version": "0.0.0", "private": true, "sideEffects": false, "main": "./dist/index.js", @@ -43,6 +43,7 @@ "nextjs-themes": "^3.1.1", "r18gs": "^1.0.2", "react-live": "^4.1.6", - "react18-loaders": "workspace:*" + "react18-loaders": "latest", + "esbuild-plugin-react18": "workspace:*" } -} +} \ No newline at end of file From 784b109de03aa2e27abe883933684f1752dc4dcf Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 13:14:37 +0530 Subject: [PATCH 04/24] pnpm i --- pnpm-lock.yaml | 91 ++++++++++++++++++++++---------------------------- 1 file changed, 40 insertions(+), 51 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e6805b35..744755af 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -118,6 +118,9 @@ importers: '@repo/shared': specifier: workspace:* version: link:../../packages/shared + esbuild-plugin-react18: + specifier: workspace:* + version: link:../../lib next: specifier: ^14.2.3 version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) @@ -131,8 +134,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react18-loaders: - specifier: workspace:* - version: link:../../lib + specifier: latest + version: 1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) devDependencies: '@next/eslint-plugin-next': specifier: ^14.2.3 @@ -179,6 +182,9 @@ importers: '@vercel/remix-entry-server': specifier: ^0.1.1 version: 0.1.1(react@18.3.1) + esbuild-plugin-react18: + specifier: workspace:* + version: link:../../lib react: specifier: ^18.3.1 version: 18.3.1 @@ -186,8 +192,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react18-loaders: - specifier: workspace:* - version: link:../../lib + specifier: latest + version: 1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) react18-themes: specifier: ^3.1.0 version: 3.1.0(@remix-run/node@2.9.1(typescript@5.4.5))(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) @@ -216,6 +222,9 @@ importers: '@repo/shared': specifier: workspace:* version: link:../../packages/shared + esbuild-plugin-react18: + specifier: workspace:* + version: link:../../lib react: specifier: ^18.3.1 version: 18.3.1 @@ -223,8 +232,8 @@ importers: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) react18-loaders: - specifier: workspace:* - version: link:../../lib + specifier: latest + version: 1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) react18-themes: specifier: ^3.1.0 version: 3.1.0(@remix-run/node@2.9.1(typescript@5.4.5))(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) @@ -255,7 +264,7 @@ importers: dependencies: next: specifier: 10 - 14 - version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.76.0) + version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) r18gs: specifier: ^1.0.2 version: 1.0.2(@types/react@18.3.1)(react@18.3.1) @@ -380,6 +389,9 @@ importers: '@repo/scripts': specifier: workspace:* version: link:../../scripts + esbuild-plugin-react18: + specifier: workspace:* + version: link:../../lib nextjs-themes: specifier: ^3.1.1 version: 3.1.1(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) @@ -390,8 +402,8 @@ importers: specifier: ^4.1.6 version: 4.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react18-loaders: - specifier: workspace:* - version: link:../../lib + specifier: latest + version: 1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -420,9 +432,6 @@ importers: '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) - esbuild-plugin-react18: - specifier: ^0.1.5 - version: 0.1.5 esbuild-plugin-react18-css: specifier: ^0.0.4 version: 0.0.4 @@ -5439,6 +5448,16 @@ packages: peerDependencies: react: '>=16.8' + react18-loaders@1.0.0: + resolution: {integrity: sha512-FEKh8r6XHOOrovwXSsA9gHMGPowijIrqSR3oUaWsI949mNVcpNpjvcpOs0icKXdSLCRB2RNy0pdfr/KllrhnFQ==} + peerDependencies: + '@types/react': 16.8 - 19 + next: 10 - 14 + react: 16.8 - 19 + peerDependenciesMeta: + next: + optional: true + react18-themes@3.1.0: resolution: {integrity: sha512-Wk5Zsv3/Hkb9o28yOcWgBf3xhy5OpBTCcm++szVjfrvfeRH0a85PyIH8puk47EYf3MEsnSiOtCwT286/lXmpTA==} peerDependencies: @@ -5648,11 +5667,6 @@ packages: safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - sass@1.76.0: - resolution: {integrity: sha512-nc3LeqvF2FNW5xGF1zxZifdW3ffIz5aBb7I7tSvOoNu7z1RQ6pFt9MBuiPtjgaI62YWrM/txjWlOCFiGtf2xpw==} - engines: {node: '>=14.0.0'} - hasBin: true - sass@1.77.0: resolution: {integrity: sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==} engines: {node: '>=14.0.0'} @@ -8535,7 +8549,7 @@ snapshots: '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.5) '@vanilla-extract/babel-plugin-debug-ids': 1.0.5 '@vanilla-extract/css': 1.15.1 - esbuild: 0.17.6 + esbuild: 0.19.12 eval: 0.1.8 find-up: 5.0.0 javascript-stringify: 2.1.0 @@ -12386,32 +12400,6 @@ snapshots: neo-async@2.6.2: {} - next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.76.0): - dependencies: - '@next/env': 14.2.3 - '@swc/helpers': 0.5.5 - busboy: 1.6.0 - caniuse-lite: 1.0.30001616 - graceful-fs: 4.2.11 - postcss: 8.4.31 - react: 18.3.1 - react-dom: 18.3.1(react@18.3.1) - styled-jsx: 5.1.1(@babel/core@7.24.5)(react@18.3.1) - optionalDependencies: - '@next/swc-darwin-arm64': 14.2.3 - '@next/swc-darwin-x64': 14.2.3 - '@next/swc-linux-arm64-gnu': 14.2.3 - '@next/swc-linux-arm64-musl': 14.2.3 - '@next/swc-linux-x64-gnu': 14.2.3 - '@next/swc-linux-x64-musl': 14.2.3 - '@next/swc-win32-arm64-msvc': 14.2.3 - '@next/swc-win32-ia32-msvc': 14.2.3 - '@next/swc-win32-x64-msvc': 14.2.3 - sass: 1.76.0 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0): dependencies: '@next/env': 14.2.3 @@ -13062,6 +13050,14 @@ snapshots: '@remix-run/router': 1.16.0 react: 18.3.1 + react18-loaders@1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1): + dependencies: + '@types/react': 18.3.1 + r18gs: 1.0.2(@types/react@18.3.1)(react@18.3.1) + react: 18.3.1 + optionalDependencies: + next: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) + react18-themes@3.1.0(@remix-run/node@2.9.1(typescript@5.4.5))(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1): dependencies: '@types/react': 18.3.1 @@ -13332,13 +13328,6 @@ snapshots: safer-buffer@2.1.2: {} - sass@1.76.0: - dependencies: - chokidar: 3.6.0 - immutable: 4.3.5 - source-map-js: 1.2.0 - optional: true - sass@1.77.0: dependencies: chokidar: 3.6.0 From 5b95b49e353a7271e33a2ad9b25ba82bbaf005d5 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 13:15:22 +0530 Subject: [PATCH 05/24] Copy source files from old repo --- lib/src/constants.ts | 8 ++ lib/src/index.ts | 200 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 208 insertions(+) create mode 100644 lib/src/constants.ts create mode 100644 lib/src/index.ts diff --git a/lib/src/constants.ts b/lib/src/constants.ts new file mode 100644 index 00000000..66cabdbb --- /dev/null +++ b/lib/src/constants.ts @@ -0,0 +1,8 @@ +const uuid = () => (Date.now() * Math.random()).toString(36).slice(0, 8); + +/** regExp */ +export const testPathRegExp = /.*\.(test|spec|check)\.(j|t)s(x)?$/i; + +export const name = "esbuild-plugin-react18-" + uuid(); +export const ignoreNamespace = "mayank1513-ignore-" + uuid(); +export const keepNamespace = "mayank1513-keep-" + uuid(); diff --git a/lib/src/index.ts b/lib/src/index.ts new file mode 100644 index 00000000..e16818e3 --- /dev/null +++ b/lib/src/index.ts @@ -0,0 +1,200 @@ +import type { BuildResult, OnLoadResult, Plugin, PluginBuild } from "esbuild"; +import fs from "node:fs"; +import path from "node:path"; +import { testPathRegExp, name, ignoreNamespace, keepNamespace } from "./constants"; + +interface ignorePattern { + pathPattern: RegExp; + contentPatterns?: RegExp[]; +} + +interface ReplacePattern { + pathPattern: RegExp; + replaceParams: { pattern: RegExp; substitute: string }[]; +} + +interface React18PluginOptions { + /** to not ignore tese files */ + keepTests?: boolean; + + /** to not remove `data-testid` attributes. If `keepTests` is true, + * `data-testid` attributes will not be removed irrespective of + * `keepTestIds` value. + * This attribute is useful when setting `sourceReplacePatterns` + */ + keepTestIds?: boolean; + + /** + * regExp patterns to match file paths to be ignored. + * If contentPatterns are provided, only the files at matching paths + * containing one or more of the content patterns will be ignored + */ + ignorePatterns?: ignorePattern[]; + + /** + * regExp patterns to find and replace in source files before build + * + * Use with caution! Make sure same file do not match multiple patterns + * to avoid any unexpected results. + * + * Caution! - if you have not enabled `keepTests`, we are already using + * `/.*\.(j|t)s(x)?$/` pattern to remove `data-testid` attributes. If your + * `sourceReplacePatterns` collide with these files, please set `keepTestIds` + * to `true` and handle removing testsids yourself. + */ + sourceReplacePatterns?: ReplacePattern[]; + + /** + * regExp patterns to find and replace in build files after build + * Use with caution! Make sure same file do not match multiple patterns + * to avoid any unexpected results. + */ + buildReplacePatterns?: ReplacePattern[]; +} + +function removeTests(build: PluginBuild, options: React18PluginOptions) { + build.onResolve({ filter: testPathRegExp }, args => ({ + path: args.path, + namespace: ignoreNamespace, + })); + if (!options.keepTestIds) { + /** remove data-testid */ + if (!options.sourceReplacePatterns) options.sourceReplacePatterns = []; + options.sourceReplacePatterns.push({ + pathPattern: /.*\.(j|t)s(x)?$/, + replaceParams: [{ pattern: /\s*data-testid="[^"]*"/gm, substitute: " " }], + }); + } +} + +function ignoreFiles(ignorePattern: ignorePattern, build: PluginBuild) { + build.onResolve({ filter: ignorePattern.pathPattern }, args => { + /** remove content to avoid building/transpiling test files unnecessarily*/ + const fullPath = path.resolve(args.resolveDir, args.path); + if (!ignorePattern.contentPatterns?.length || !fs.existsSync(fullPath)) + return { path: args.path, namespace: ignoreNamespace }; + + if (fs.lstatSync(fullPath).isDirectory()) return { path: fullPath, namespace: keepNamespace }; + + const text = fs.readFileSync(fullPath, "utf8"); + for (const contentPattern of ignorePattern.contentPatterns) + if (contentPattern.test(text)) return { path: args.path, namespace: ignoreNamespace }; + + return { path: fullPath, namespace: keepNamespace }; + }); +} + +function replacePatterns({ replaceParams }: ReplacePattern, text: string) { + replaceParams.forEach(({ pattern, substitute }) => { + text = text.replace(pattern, substitute); + }); + return text; +} + +function replaceSource(sourceReplacePattern: ReplacePattern, build: PluginBuild) { + if (sourceReplacePattern.replaceParams.length === 0) return; + /** Add namespace file to avoid conflict with ignored files */ + build.onLoad({ filter: sourceReplacePattern.pathPattern, namespace: "file" }, args => { + let text = fs.readFileSync(args.path, "utf8"); + /** todo: test if loader is a valid OnLoadResult.loader + * If it is not a valid loader error will be thrown + */ + const loader = args.path.slice(args.path.lastIndexOf(".") + 1); + const contents = replacePatterns(sourceReplacePattern, text); + return { contents, loader } as OnLoadResult; + }); +} + +function replaceBuild(buildReplacePattern: ReplacePattern, result: BuildResult) { + result.outputFiles + ?.filter(f => buildReplacePattern.pathPattern.test(f.path)) + .forEach( + f => (f.contents = new TextEncoder().encode(replacePatterns(buildReplacePattern, f.text))), + ); +} + +function onEndCallBack(result: BuildResult, options: React18PluginOptions, write?: boolean) { + /** remove empty file imports */ + const emptyChunkFiles = result.outputFiles + ?.filter(f => f.text.trim() === "" && f.path.includes("chunk")) + .map(f => f.path.split(path.sep).pop()); + + const emptyChunkImportRegExp = new RegExp( + `import *"[^"]*(${emptyChunkFiles?.join("|") || "--no-empty-chunks--"})";[\n\r ]*`, + "g", + ); + + /** fix use client and use server*/ + result.outputFiles + ?.filter(f => !f.path.endsWith(".map")) + .forEach(f => { + let txt = f.text; + txt = txt.replace( + /^(["']use strict["'];)?["']use client["'];?/i, + '"use client";\n"use strict";', + ); + + /** module level use server */ + txt = txt.replace( + /^(["']use strict["'];)?["']use server["'];?/i, + '"use server";\n"use strict";', + ); + + /** remove empty file imports */ + txt = txt.replace(emptyChunkImportRegExp, ""); + + f.contents = new TextEncoder().encode(txt); + }); + + /** handle buildReplacePatterns */ + options.buildReplacePatterns?.forEach(replacePattern => replaceBuild(replacePattern, result)); + + /** Do not generate {empty} test files if keepTests is not set to true */ + if (!options.keepTests) { + result.outputFiles = result.outputFiles?.filter(f => !testPathRegExp.test(f.path)); + } + + /** remove empty files */ + result.outputFiles = result.outputFiles?.filter(f => f.text.trim() !== ""); + /** assume true if undefined */ + if (write === undefined || write) { + result.outputFiles?.forEach(file => { + fs.mkdirSync(path.dirname(file.path), { recursive: true }); + fs.writeFileSync(file.path, file.contents); + }); + } +} + +function setup(build: PluginBuild, options: React18PluginOptions = {}) { + const write = build.initialOptions.write; + build.initialOptions.write = false; + + if (!options.keepTests) removeTests(build, options); + + options.ignorePatterns?.forEach(ignorePattern => ignoreFiles(ignorePattern, build)); + + options.sourceReplacePatterns?.forEach(replacePattern => replaceSource(replacePattern, build)); + + build.onLoad({ filter: /.*/, namespace: ignoreNamespace }, () => { + /** remove content to avoid building/transpiling ignored files*/ + return { contents: "" }; + }); + + build.onLoad({ filter: /.*/, namespace: keepNamespace }, args => { + if (fs.existsSync(args.path) && fs.lstatSync(args.path).isDirectory()) return { contents: "" }; + else { + const loader = args.path.slice(args.path.lastIndexOf(".") + 1); + return { contents: fs.readFileSync(args.path, "utf-8"), loader } as OnLoadResult; + } + }); + + build.onEnd(result => onEndCallBack(result, options, write)); +} + +/** This plugin prevents building test files by esbuild. DTS may still geenrate type files for the tests with only { } as file content*/ +const react18Plugin: (options?: React18PluginOptions) => Plugin = (options = {}) => ({ + name, + setup: build => setup(build, options), +}); + +export = react18Plugin; From 045c4e011d716d6858af36170d002584f9a24f55 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 13:18:07 +0530 Subject: [PATCH 06/24] Install esbuild --- lib/package.json | 1 + pnpm-lock.yaml | 251 ++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 247 insertions(+), 5 deletions(-) diff --git a/lib/package.json b/lib/package.json index 0d9d1473..08d41020 100644 --- a/lib/package.json +++ b/lib/package.json @@ -44,6 +44,7 @@ "vitest": "^1.6.0" }, "dependencies": { + "esbuild": "^0.21.1", "r18gs": "^1.0.2" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 744755af..0c8e916f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -135,7 +135,7 @@ importers: version: 18.3.1(react@18.3.1) react18-loaders: specifier: latest - version: 1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + version: 1.0.0(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) devDependencies: '@next/eslint-plugin-next': specifier: ^14.2.3 @@ -193,7 +193,7 @@ importers: version: 18.3.1(react@18.3.1) react18-loaders: specifier: latest - version: 1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + version: 1.0.0(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) react18-themes: specifier: ^3.1.0 version: 3.1.0(@remix-run/node@2.9.1(typescript@5.4.5))(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) @@ -233,7 +233,7 @@ importers: version: 18.3.1(react@18.3.1) react18-loaders: specifier: latest - version: 1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + version: 1.0.0(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) react18-themes: specifier: ^3.1.0 version: 3.1.0(@remix-run/node@2.9.1(typescript@5.4.5))(@remix-run/react@2.9.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.4.5))(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) @@ -262,6 +262,9 @@ importers: lib: dependencies: + esbuild: + specifier: ^0.21.1 + version: 0.21.1 next: specifier: 10 - 14 version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) @@ -403,7 +406,7 @@ importers: version: 4.1.6(react-dom@18.3.1(react@18.3.1))(react@18.3.1) react18-loaders: specifier: latest - version: 1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) + version: 1.0.0(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -778,6 +781,12 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.21.1': + resolution: {integrity: sha512-O7yppwipkXvnEPjzkSXJRk2g4bS8sUx9p9oXHq9MU/U7lxUzZVsnFZMDTmeeX9bfQxrFcvOacl/ENgOh0WP9pA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.17.6': resolution: {integrity: sha512-YnYSCceN/dUzUr5kdtUzB+wZprCafuD89Hs0Aqv9QSdwhYQybhXTaSTcrl6X/aWThn1a/j0eEpUBGOE7269REg==} engines: {node: '>=12'} @@ -796,6 +805,12 @@ packages: cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.21.1': + resolution: {integrity: sha512-jXhccq6es+onw7x8MxoFnm820mz7sGa9J14kLADclmiEUH4fyj+FjR6t0M93RgtlI/awHWhtF0Wgfhqgf9gDZA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.17.6': resolution: {integrity: sha512-bSC9YVUjADDy1gae8RrioINU6e1lCkg3VGVwm0QQ2E1CWcC4gnMce9+B6RpxuSsrsXsk1yojn7sp1fnG8erE2g==} engines: {node: '>=12'} @@ -814,6 +829,12 @@ packages: cpu: [arm] os: [android] + '@esbuild/android-arm@0.21.1': + resolution: {integrity: sha512-hh3jKWikdnTtHCglDAeVO3Oyh8MaH8xZUaWMiCCvJ9/c3NtPqZq+CACOlGTxhddypXhl+8B45SeceYBfB/e8Ow==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.17.6': resolution: {integrity: sha512-MVcYcgSO7pfu/x34uX9u2QIZHmXAB7dEiLQC5bBl5Ryqtpj9lT2sg3gNDEsrPEmimSJW2FXIaxqSQ501YLDsZQ==} engines: {node: '>=12'} @@ -832,6 +853,12 @@ packages: cpu: [x64] os: [android] + '@esbuild/android-x64@0.21.1': + resolution: {integrity: sha512-NPObtlBh4jQHE01gJeucqEhdoD/4ya2owSIS8lZYS58aR0x7oZo9lB2lVFxgTANSa5MGCBeoQtr+yA9oKCGPvA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.17.6': resolution: {integrity: sha512-bsDRvlbKMQMt6Wl08nHtFz++yoZHsyTOxnjfB2Q95gato+Yi4WnRl13oC2/PJJA9yLCoRv9gqT/EYX0/zDsyMA==} engines: {node: '>=12'} @@ -850,6 +877,12 @@ packages: cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.21.1': + resolution: {integrity: sha512-BLT7TDzqsVlQRmJfO/FirzKlzmDpBWwmCUlyggfzUwg1cAxVxeA4O6b1XkMInlxISdfPAOunV9zXjvh5x99Heg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.17.6': resolution: {integrity: sha512-xh2A5oPrYRfMFz74QXIQTQo8uA+hYzGWJFoeTE8EvoZGHb+idyV4ATaukaUvnnxJiauhs/fPx3vYhU4wiGfosg==} engines: {node: '>=12'} @@ -868,6 +901,12 @@ packages: cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.21.1': + resolution: {integrity: sha512-D3h3wBQmeS/vp93O4B+SWsXB8HvRDwMyhTNhBd8yMbh5wN/2pPWRW5o/hM3EKgk9bdKd9594lMGoTCTiglQGRQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.17.6': resolution: {integrity: sha512-EnUwjRc1inT4ccZh4pB3v1cIhohE2S4YXlt1OvI7sw/+pD+dIE4smwekZlEPIwY6PhU6oDWwITrQQm5S2/iZgg==} engines: {node: '>=12'} @@ -886,6 +925,12 @@ packages: cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.21.1': + resolution: {integrity: sha512-/uVdqqpNKXIxT6TyS/oSK4XE4xWOqp6fh4B5tgAwozkyWdylcX+W4YF2v6SKsL4wCQ5h1bnaSNjWPXG/2hp8AQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.17.6': resolution: {integrity: sha512-Uh3HLWGzH6FwpviUcLMKPCbZUAFzv67Wj5MTwK6jn89b576SR2IbEp+tqUHTr8DIl0iDmBAf51MVaP7pw6PY5Q==} engines: {node: '>=12'} @@ -904,6 +949,12 @@ packages: cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.21.1': + resolution: {integrity: sha512-paAkKN1n1jJitw+dAoR27TdCzxRl1FOEITx3h201R6NoXUojpMzgMLdkXVgCvaCSCqwYkeGLoe9UVNRDKSvQgw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.17.6': resolution: {integrity: sha512-bUR58IFOMJX523aDVozswnlp5yry7+0cRLCXDsxnUeQYJik1DukMY+apBsLOZJblpH+K7ox7YrKrHmJoWqVR9w==} engines: {node: '>=12'} @@ -922,6 +973,12 @@ packages: cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.21.1': + resolution: {integrity: sha512-G65d08YoH00TL7Xg4LaL3gLV21bpoAhQ+r31NUu013YB7KK0fyXIt05VbsJtpqh/6wWxoLJZOvQHYnodRrnbUQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.17.6': resolution: {integrity: sha512-7YdGiurNt7lqO0Bf/U9/arrPWPqdPqcV6JCZda4LZgEn+PTQ5SMEI4MGR52Bfn3+d6bNEGcWFzlIxiQdS48YUw==} engines: {node: '>=12'} @@ -940,6 +997,12 @@ packages: cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.21.1': + resolution: {integrity: sha512-tRHnxWJnvNnDpNVnsyDhr1DIQZUfCXlHSCDohbXFqmg9W4kKR7g8LmA3kzcwbuxbRMKeit8ladnCabU5f2traA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.17.6': resolution: {integrity: sha512-ujp8uoQCM9FRcbDfkqECoARsLnLfCUhKARTP56TFPog8ie9JG83D5GVKjQ6yVrEVdMie1djH86fm98eY3quQkQ==} engines: {node: '>=12'} @@ -958,6 +1021,12 @@ packages: cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.21.1': + resolution: {integrity: sha512-tt/54LqNNAqCz++QhxoqB9+XqdsaZOtFD/srEhHYwBd3ZUOepmR1Eeot8bS+Q7BiEvy9vvKbtpHf+r6q8hF5UA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.17.6': resolution: {integrity: sha512-y2NX1+X/Nt+izj9bLoiaYB9YXT/LoaQFYvCkVD77G/4F+/yuVXYCWz4SE9yr5CBMbOxOfBcy/xFL4LlOeNlzYQ==} engines: {node: '>=12'} @@ -976,6 +1045,12 @@ packages: cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.21.1': + resolution: {integrity: sha512-MhNalK6r0nZD0q8VzUBPwheHzXPr9wronqmZrewLfP7ui9Fv1tdPmg6e7A8lmg0ziQCziSDHxh3cyRt4YMhGnQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.17.6': resolution: {integrity: sha512-09AXKB1HDOzXD+j3FdXCiL/MWmZP0Ex9eR8DLMBVcHorrWJxWmY8Nms2Nm41iRM64WVx7bA/JVHMv081iP2kUA==} engines: {node: '>=12'} @@ -994,6 +1069,12 @@ packages: cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.21.1': + resolution: {integrity: sha512-YCKVY7Zen5rwZV+nZczOhFmHaeIxR4Zn3jcmNH53LbgF6IKRwmrMywqDrg4SiSNApEefkAbPSIzN39FC8VsxPg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.17.6': resolution: {integrity: sha512-AmLhMzkM8JuqTIOhxnX4ubh0XWJIznEynRnZAVdA2mMKE6FAfwT2TWKTwdqMG+qEaeyDPtfNoZRpJbD4ZBv0Tg==} engines: {node: '>=12'} @@ -1012,6 +1093,12 @@ packages: cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.21.1': + resolution: {integrity: sha512-bw7bcQ+270IOzDV4mcsKAnDtAFqKO0jVv3IgRSd8iM0ac3L8amvCrujRVt1ajBTJcpDaFhIX+lCNRKteoDSLig==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.17.6': resolution: {integrity: sha512-Y4Ri62PfavhLQhFbqucysHOmRamlTVK10zPWlqjNbj2XMea+BOs4w6ASKwQwAiqf9ZqcY9Ab7NOU4wIgpxwoSQ==} engines: {node: '>=12'} @@ -1030,6 +1117,12 @@ packages: cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.21.1': + resolution: {integrity: sha512-ARmDRNkcOGOm1AqUBSwRVDfDeD9hGYRfkudP2QdoonBz1ucWVnfBPfy7H4JPI14eYtZruRSczJxyu7SRYDVOcg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.17.6': resolution: {integrity: sha512-SPUiz4fDbnNEm3JSdUW8pBJ/vkop3M1YwZAVwvdwlFLoJwKEZ9L98l3tzeyMzq27CyepDQ3Qgoba44StgbiN5Q==} engines: {node: '>=12'} @@ -1048,6 +1141,12 @@ packages: cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.21.1': + resolution: {integrity: sha512-o73TcUNMuoTZlhwFdsgr8SfQtmMV58sbgq6gQq9G1xUiYnHMTmJbwq65RzMx89l0iya69lR4bxBgtWiiOyDQZA==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.17.6': resolution: {integrity: sha512-a3yHLmOodHrzuNgdpB7peFGPx1iJ2x6m+uDvhP2CKdr2CwOaqEFMeSqYAHU7hG+RjCq8r2NFujcd/YsEsFgTGw==} engines: {node: '>=12'} @@ -1066,6 +1165,12 @@ packages: cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.21.1': + resolution: {integrity: sha512-da4/1mBJwwgJkbj4fMH7SOXq2zapgTo0LKXX1VUZ0Dxr+e8N0WbS80nSZ5+zf3lvpf8qxrkZdqkOqFfm57gXwA==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-x64@0.17.6': resolution: {integrity: sha512-EanJqcU/4uZIBreTrnbnre2DXgXSa+Gjap7ifRfllpmyAU7YMvaXmljdArptTHmjrkkKm9BK6GH5D5Yo+p6y5A==} engines: {node: '>=12'} @@ -1084,6 +1189,12 @@ packages: cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.21.1': + resolution: {integrity: sha512-CPWs0HTFe5woTJN5eKPvgraUoRHrCtzlYIAv9wBC+FAyagBSaf+UdZrjwYyTGnwPGkThV4OCI7XibZOnPvONVw==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-x64@0.17.6': resolution: {integrity: sha512-xaxeSunhQRsTNGFanoOkkLtnmMn5QbA0qBhNet/XLVsc+OVkpIWPHcr3zTW2gxVU5YOHFbIHR9ODuaUdNza2Vw==} engines: {node: '>=12'} @@ -1102,6 +1213,12 @@ packages: cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.21.1': + resolution: {integrity: sha512-xxhTm5QtzNLc24R0hEkcH+zCx/o49AsdFZ0Cy5zSd/5tOj4X2g3/2AJB625NoadUuc4A8B3TenLJoYdWYOYCew==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.17.6': resolution: {integrity: sha512-gnMnMPg5pfMkZvhHee21KbKdc6W3GR8/JuE0Da1kjwpK6oiFU3nqfHuVPgUX2rsOx9N2SadSQTIYV1CIjYG+xw==} engines: {node: '>=12'} @@ -1120,6 +1237,12 @@ packages: cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.21.1': + resolution: {integrity: sha512-CWibXszpWys1pYmbr9UiKAkX6x+Sxw8HWtw1dRESK1dLW5fFJ6rMDVw0o8MbadusvVQx1a8xuOxnHXT941Hp1A==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.17.6': resolution: {integrity: sha512-G95n7vP1UnGJPsVdKXllAJPtqjMvFYbN20e8RK8LVLhlTiSOH1sd7+Gt7rm70xiG+I5tM58nYgwWrLs6I1jHqg==} engines: {node: '>=12'} @@ -1138,6 +1261,12 @@ packages: cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.21.1': + resolution: {integrity: sha512-jb5B4k+xkytGbGUS4T+Z89cQJ9DJ4lozGRSV+hhfmCPpfJ3880O31Q1srPCimm+V6UCbnigqD10EgDNgjvjerQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.17.6': resolution: {integrity: sha512-96yEFzLhq5bv9jJo5JhTs1gI+1cKQ83cUpyxHuGqXVwQtY5Eq54ZEsKs8veKtiKwlrNimtckHEkj4mRh4pPjsg==} engines: {node: '>=12'} @@ -1156,6 +1285,12 @@ packages: cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.21.1': + resolution: {integrity: sha512-PgyFvjJhXqHn1uxPhyN1wZ6dIomKjiLUQh1LjFvjiV1JmnkZ/oMPrfeEAZg5R/1ftz4LZWZr02kefNIQ5SKREQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.17.6': resolution: {integrity: sha512-n6d8MOyUrNp6G4VSpRcgjs5xj4A91svJSaiwLIDWVWEsZtpN5FA9NlBbZHDmAJc2e8e6SF4tkBD3HAvPF+7igA==} engines: {node: '>=12'} @@ -1174,6 +1309,12 @@ packages: cpu: [x64] os: [win32] + '@esbuild/win32-x64@0.21.1': + resolution: {integrity: sha512-W9NttRZQR5ehAiqHGDnvfDaGmQOm6Fi4vSlce8mjM75x//XKuVAByohlEX6N17yZnVXxQFuh4fDRunP8ca6bfA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + '@eslint-community/eslint-utils@4.4.0': resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -2947,6 +3088,11 @@ packages: engines: {node: '>=12'} hasBin: true + esbuild@0.21.1: + resolution: {integrity: sha512-GPqx+FX7mdqulCeQ4TsGZQ3djBJkx5k7zBGtqt9ycVlWNg8llJ4RO9n2vciu8BN2zAEs6lPbPl0asZsAh7oWzg==} + engines: {node: '>=12'} + hasBin: true + escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} engines: {node: '>=6'} @@ -7262,6 +7408,9 @@ snapshots: '@esbuild/aix-ppc64@0.20.2': optional: true + '@esbuild/aix-ppc64@0.21.1': + optional: true + '@esbuild/android-arm64@0.17.6': optional: true @@ -7271,6 +7420,9 @@ snapshots: '@esbuild/android-arm64@0.20.2': optional: true + '@esbuild/android-arm64@0.21.1': + optional: true + '@esbuild/android-arm@0.17.6': optional: true @@ -7280,6 +7432,9 @@ snapshots: '@esbuild/android-arm@0.20.2': optional: true + '@esbuild/android-arm@0.21.1': + optional: true + '@esbuild/android-x64@0.17.6': optional: true @@ -7289,6 +7444,9 @@ snapshots: '@esbuild/android-x64@0.20.2': optional: true + '@esbuild/android-x64@0.21.1': + optional: true + '@esbuild/darwin-arm64@0.17.6': optional: true @@ -7298,6 +7456,9 @@ snapshots: '@esbuild/darwin-arm64@0.20.2': optional: true + '@esbuild/darwin-arm64@0.21.1': + optional: true + '@esbuild/darwin-x64@0.17.6': optional: true @@ -7307,6 +7468,9 @@ snapshots: '@esbuild/darwin-x64@0.20.2': optional: true + '@esbuild/darwin-x64@0.21.1': + optional: true + '@esbuild/freebsd-arm64@0.17.6': optional: true @@ -7316,6 +7480,9 @@ snapshots: '@esbuild/freebsd-arm64@0.20.2': optional: true + '@esbuild/freebsd-arm64@0.21.1': + optional: true + '@esbuild/freebsd-x64@0.17.6': optional: true @@ -7325,6 +7492,9 @@ snapshots: '@esbuild/freebsd-x64@0.20.2': optional: true + '@esbuild/freebsd-x64@0.21.1': + optional: true + '@esbuild/linux-arm64@0.17.6': optional: true @@ -7334,6 +7504,9 @@ snapshots: '@esbuild/linux-arm64@0.20.2': optional: true + '@esbuild/linux-arm64@0.21.1': + optional: true + '@esbuild/linux-arm@0.17.6': optional: true @@ -7343,6 +7516,9 @@ snapshots: '@esbuild/linux-arm@0.20.2': optional: true + '@esbuild/linux-arm@0.21.1': + optional: true + '@esbuild/linux-ia32@0.17.6': optional: true @@ -7352,6 +7528,9 @@ snapshots: '@esbuild/linux-ia32@0.20.2': optional: true + '@esbuild/linux-ia32@0.21.1': + optional: true + '@esbuild/linux-loong64@0.17.6': optional: true @@ -7361,6 +7540,9 @@ snapshots: '@esbuild/linux-loong64@0.20.2': optional: true + '@esbuild/linux-loong64@0.21.1': + optional: true + '@esbuild/linux-mips64el@0.17.6': optional: true @@ -7370,6 +7552,9 @@ snapshots: '@esbuild/linux-mips64el@0.20.2': optional: true + '@esbuild/linux-mips64el@0.21.1': + optional: true + '@esbuild/linux-ppc64@0.17.6': optional: true @@ -7379,6 +7564,9 @@ snapshots: '@esbuild/linux-ppc64@0.20.2': optional: true + '@esbuild/linux-ppc64@0.21.1': + optional: true + '@esbuild/linux-riscv64@0.17.6': optional: true @@ -7388,6 +7576,9 @@ snapshots: '@esbuild/linux-riscv64@0.20.2': optional: true + '@esbuild/linux-riscv64@0.21.1': + optional: true + '@esbuild/linux-s390x@0.17.6': optional: true @@ -7397,6 +7588,9 @@ snapshots: '@esbuild/linux-s390x@0.20.2': optional: true + '@esbuild/linux-s390x@0.21.1': + optional: true + '@esbuild/linux-x64@0.17.6': optional: true @@ -7406,6 +7600,9 @@ snapshots: '@esbuild/linux-x64@0.20.2': optional: true + '@esbuild/linux-x64@0.21.1': + optional: true + '@esbuild/netbsd-x64@0.17.6': optional: true @@ -7415,6 +7612,9 @@ snapshots: '@esbuild/netbsd-x64@0.20.2': optional: true + '@esbuild/netbsd-x64@0.21.1': + optional: true + '@esbuild/openbsd-x64@0.17.6': optional: true @@ -7424,6 +7624,9 @@ snapshots: '@esbuild/openbsd-x64@0.20.2': optional: true + '@esbuild/openbsd-x64@0.21.1': + optional: true + '@esbuild/sunos-x64@0.17.6': optional: true @@ -7433,6 +7636,9 @@ snapshots: '@esbuild/sunos-x64@0.20.2': optional: true + '@esbuild/sunos-x64@0.21.1': + optional: true + '@esbuild/win32-arm64@0.17.6': optional: true @@ -7442,6 +7648,9 @@ snapshots: '@esbuild/win32-arm64@0.20.2': optional: true + '@esbuild/win32-arm64@0.21.1': + optional: true + '@esbuild/win32-ia32@0.17.6': optional: true @@ -7451,6 +7660,9 @@ snapshots: '@esbuild/win32-ia32@0.20.2': optional: true + '@esbuild/win32-ia32@0.21.1': + optional: true + '@esbuild/win32-x64@0.17.6': optional: true @@ -7460,6 +7672,9 @@ snapshots: '@esbuild/win32-x64@0.20.2': optional: true + '@esbuild/win32-x64@0.21.1': + optional: true + '@eslint-community/eslint-utils@4.4.0(eslint@9.2.0)': dependencies: eslint: 9.2.0 @@ -9756,6 +9971,32 @@ snapshots: '@esbuild/win32-ia32': 0.20.2 '@esbuild/win32-x64': 0.20.2 + esbuild@0.21.1: + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.1 + '@esbuild/android-arm': 0.21.1 + '@esbuild/android-arm64': 0.21.1 + '@esbuild/android-x64': 0.21.1 + '@esbuild/darwin-arm64': 0.21.1 + '@esbuild/darwin-x64': 0.21.1 + '@esbuild/freebsd-arm64': 0.21.1 + '@esbuild/freebsd-x64': 0.21.1 + '@esbuild/linux-arm': 0.21.1 + '@esbuild/linux-arm64': 0.21.1 + '@esbuild/linux-ia32': 0.21.1 + '@esbuild/linux-loong64': 0.21.1 + '@esbuild/linux-mips64el': 0.21.1 + '@esbuild/linux-ppc64': 0.21.1 + '@esbuild/linux-riscv64': 0.21.1 + '@esbuild/linux-s390x': 0.21.1 + '@esbuild/linux-x64': 0.21.1 + '@esbuild/netbsd-x64': 0.21.1 + '@esbuild/openbsd-x64': 0.21.1 + '@esbuild/sunos-x64': 0.21.1 + '@esbuild/win32-arm64': 0.21.1 + '@esbuild/win32-ia32': 0.21.1 + '@esbuild/win32-x64': 0.21.1 + escalade@3.1.2: {} escape-html@1.0.3: {} @@ -13050,7 +13291,7 @@ snapshots: '@remix-run/router': 1.16.0 react: 18.3.1 - react18-loaders@1.0.0(@types/react@18.3.1)(next@14.2.3(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1): + react18-loaders@1.0.0(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1): dependencies: '@types/react': 18.3.1 r18gs: 1.0.2(@types/react@18.3.1)(react@18.3.1) From e71ca55ace22e0dcd755f93f445b1ea6c4c8b6de Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 13:22:22 +0530 Subject: [PATCH 07/24] clean up --- lib/package.json | 4 +- lib/src/index.ts | 304 +++++++++++++++++------------------ lib/tsup.config.ts | 3 - packages/shared/package.json | 7 +- 4 files changed, 156 insertions(+), 162 deletions(-) diff --git a/lib/package.json b/lib/package.json index 08d41020..63df08a7 100644 --- a/lib/package.json +++ b/lib/package.json @@ -33,8 +33,6 @@ "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.6.0", - "esbuild-plugin-react18": "^0.1.5", - "esbuild-plugin-react18-css": "^0.0.4", "jsdom": "^24.0.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -85,4 +83,4 @@ "Modern", "Seamless integration" ] -} \ No newline at end of file +} diff --git a/lib/src/index.ts b/lib/src/index.ts index e16818e3..63faecdc 100644 --- a/lib/src/index.ts +++ b/lib/src/index.ts @@ -4,197 +4,197 @@ import path from "node:path"; import { testPathRegExp, name, ignoreNamespace, keepNamespace } from "./constants"; interface ignorePattern { - pathPattern: RegExp; - contentPatterns?: RegExp[]; + pathPattern: RegExp; + contentPatterns?: RegExp[]; } interface ReplacePattern { - pathPattern: RegExp; - replaceParams: { pattern: RegExp; substitute: string }[]; + pathPattern: RegExp; + replaceParams: { pattern: RegExp; substitute: string }[]; } interface React18PluginOptions { - /** to not ignore tese files */ - keepTests?: boolean; - - /** to not remove `data-testid` attributes. If `keepTests` is true, - * `data-testid` attributes will not be removed irrespective of - * `keepTestIds` value. - * This attribute is useful when setting `sourceReplacePatterns` - */ - keepTestIds?: boolean; - - /** - * regExp patterns to match file paths to be ignored. - * If contentPatterns are provided, only the files at matching paths - * containing one or more of the content patterns will be ignored - */ - ignorePatterns?: ignorePattern[]; - - /** - * regExp patterns to find and replace in source files before build - * - * Use with caution! Make sure same file do not match multiple patterns - * to avoid any unexpected results. - * - * Caution! - if you have not enabled `keepTests`, we are already using - * `/.*\.(j|t)s(x)?$/` pattern to remove `data-testid` attributes. If your - * `sourceReplacePatterns` collide with these files, please set `keepTestIds` - * to `true` and handle removing testsids yourself. - */ - sourceReplacePatterns?: ReplacePattern[]; - - /** - * regExp patterns to find and replace in build files after build - * Use with caution! Make sure same file do not match multiple patterns - * to avoid any unexpected results. - */ - buildReplacePatterns?: ReplacePattern[]; + /** to not ignore tese files */ + keepTests?: boolean; + + /** to not remove `data-testid` attributes. If `keepTests` is true, + * `data-testid` attributes will not be removed irrespective of + * `keepTestIds` value. + * This attribute is useful when setting `sourceReplacePatterns` + */ + keepTestIds?: boolean; + + /** + * regExp patterns to match file paths to be ignored. + * If contentPatterns are provided, only the files at matching paths + * containing one or more of the content patterns will be ignored + */ + ignorePatterns?: ignorePattern[]; + + /** + * regExp patterns to find and replace in source files before build + * + * Use with caution! Make sure same file do not match multiple patterns + * to avoid any unexpected results. + * + * Caution! - if you have not enabled `keepTests`, we are already using + * `/.*\.(j|t)s(x)?$/` pattern to remove `data-testid` attributes. If your + * `sourceReplacePatterns` collide with these files, please set `keepTestIds` + * to `true` and handle removing testsids yourself. + */ + sourceReplacePatterns?: ReplacePattern[]; + + /** + * regExp patterns to find and replace in build files after build + * Use with caution! Make sure same file do not match multiple patterns + * to avoid any unexpected results. + */ + buildReplacePatterns?: ReplacePattern[]; } function removeTests(build: PluginBuild, options: React18PluginOptions) { - build.onResolve({ filter: testPathRegExp }, args => ({ - path: args.path, - namespace: ignoreNamespace, - })); - if (!options.keepTestIds) { - /** remove data-testid */ - if (!options.sourceReplacePatterns) options.sourceReplacePatterns = []; - options.sourceReplacePatterns.push({ - pathPattern: /.*\.(j|t)s(x)?$/, - replaceParams: [{ pattern: /\s*data-testid="[^"]*"/gm, substitute: " " }], - }); - } + build.onResolve({ filter: testPathRegExp }, args => ({ + path: args.path, + namespace: ignoreNamespace, + })); + if (!options.keepTestIds) { + /** remove data-testid */ + if (!options.sourceReplacePatterns) options.sourceReplacePatterns = []; + options.sourceReplacePatterns.push({ + pathPattern: /.*\.(j|t)s(x)?$/, + replaceParams: [{ pattern: /\s*data-testid="[^"]*"/gm, substitute: " " }], + }); + } } function ignoreFiles(ignorePattern: ignorePattern, build: PluginBuild) { - build.onResolve({ filter: ignorePattern.pathPattern }, args => { - /** remove content to avoid building/transpiling test files unnecessarily*/ - const fullPath = path.resolve(args.resolveDir, args.path); - if (!ignorePattern.contentPatterns?.length || !fs.existsSync(fullPath)) - return { path: args.path, namespace: ignoreNamespace }; + build.onResolve({ filter: ignorePattern.pathPattern }, args => { + /** remove content to avoid building/transpiling test files unnecessarily*/ + const fullPath = path.resolve(args.resolveDir, args.path); + if (!ignorePattern.contentPatterns?.length || !fs.existsSync(fullPath)) + return { path: args.path, namespace: ignoreNamespace }; - if (fs.lstatSync(fullPath).isDirectory()) return { path: fullPath, namespace: keepNamespace }; + if (fs.lstatSync(fullPath).isDirectory()) return { path: fullPath, namespace: keepNamespace }; - const text = fs.readFileSync(fullPath, "utf8"); - for (const contentPattern of ignorePattern.contentPatterns) - if (contentPattern.test(text)) return { path: args.path, namespace: ignoreNamespace }; + const text = fs.readFileSync(fullPath, "utf8"); + for (const contentPattern of ignorePattern.contentPatterns) + if (contentPattern.test(text)) return { path: args.path, namespace: ignoreNamespace }; - return { path: fullPath, namespace: keepNamespace }; - }); + return { path: fullPath, namespace: keepNamespace }; + }); } function replacePatterns({ replaceParams }: ReplacePattern, text: string) { - replaceParams.forEach(({ pattern, substitute }) => { - text = text.replace(pattern, substitute); - }); - return text; + replaceParams.forEach(({ pattern, substitute }) => { + text = text.replace(pattern, substitute); + }); + return text; } function replaceSource(sourceReplacePattern: ReplacePattern, build: PluginBuild) { - if (sourceReplacePattern.replaceParams.length === 0) return; - /** Add namespace file to avoid conflict with ignored files */ - build.onLoad({ filter: sourceReplacePattern.pathPattern, namespace: "file" }, args => { - let text = fs.readFileSync(args.path, "utf8"); - /** todo: test if loader is a valid OnLoadResult.loader - * If it is not a valid loader error will be thrown - */ - const loader = args.path.slice(args.path.lastIndexOf(".") + 1); - const contents = replacePatterns(sourceReplacePattern, text); - return { contents, loader } as OnLoadResult; - }); + if (sourceReplacePattern.replaceParams.length === 0) return; + /** Add namespace file to avoid conflict with ignored files */ + build.onLoad({ filter: sourceReplacePattern.pathPattern, namespace: "file" }, args => { + let text = fs.readFileSync(args.path, "utf8"); + /** todo: test if loader is a valid OnLoadResult.loader + * If it is not a valid loader error will be thrown + */ + const loader = args.path.slice(args.path.lastIndexOf(".") + 1); + const contents = replacePatterns(sourceReplacePattern, text); + return { contents, loader } as OnLoadResult; + }); } function replaceBuild(buildReplacePattern: ReplacePattern, result: BuildResult) { - result.outputFiles - ?.filter(f => buildReplacePattern.pathPattern.test(f.path)) - .forEach( - f => (f.contents = new TextEncoder().encode(replacePatterns(buildReplacePattern, f.text))), - ); + result.outputFiles + ?.filter(f => buildReplacePattern.pathPattern.test(f.path)) + .forEach( + f => (f.contents = new TextEncoder().encode(replacePatterns(buildReplacePattern, f.text))), + ); } function onEndCallBack(result: BuildResult, options: React18PluginOptions, write?: boolean) { - /** remove empty file imports */ - const emptyChunkFiles = result.outputFiles - ?.filter(f => f.text.trim() === "" && f.path.includes("chunk")) - .map(f => f.path.split(path.sep).pop()); - - const emptyChunkImportRegExp = new RegExp( - `import *"[^"]*(${emptyChunkFiles?.join("|") || "--no-empty-chunks--"})";[\n\r ]*`, - "g", - ); - - /** fix use client and use server*/ - result.outputFiles - ?.filter(f => !f.path.endsWith(".map")) - .forEach(f => { - let txt = f.text; - txt = txt.replace( - /^(["']use strict["'];)?["']use client["'];?/i, - '"use client";\n"use strict";', - ); - - /** module level use server */ - txt = txt.replace( - /^(["']use strict["'];)?["']use server["'];?/i, - '"use server";\n"use strict";', - ); - - /** remove empty file imports */ - txt = txt.replace(emptyChunkImportRegExp, ""); - - f.contents = new TextEncoder().encode(txt); - }); - - /** handle buildReplacePatterns */ - options.buildReplacePatterns?.forEach(replacePattern => replaceBuild(replacePattern, result)); - - /** Do not generate {empty} test files if keepTests is not set to true */ - if (!options.keepTests) { - result.outputFiles = result.outputFiles?.filter(f => !testPathRegExp.test(f.path)); - } - - /** remove empty files */ - result.outputFiles = result.outputFiles?.filter(f => f.text.trim() !== ""); - /** assume true if undefined */ - if (write === undefined || write) { - result.outputFiles?.forEach(file => { - fs.mkdirSync(path.dirname(file.path), { recursive: true }); - fs.writeFileSync(file.path, file.contents); - }); - } + /** remove empty file imports */ + const emptyChunkFiles = result.outputFiles + ?.filter(f => f.text.trim() === "" && f.path.includes("chunk")) + .map(f => f.path.split(path.sep).pop()); + + const emptyChunkImportRegExp = new RegExp( + `import *"[^"]*(${emptyChunkFiles?.join("|") || "--no-empty-chunks--"})";[\n\r ]*`, + "g", + ); + + /** fix use client and use server*/ + result.outputFiles + ?.filter(f => !f.path.endsWith(".map")) + .forEach(f => { + let txt = f.text; + txt = txt.replace( + /^(["']use strict["'];)?["']use client["'];?/i, + '"use client";\n"use strict";', + ); + + /** module level use server */ + txt = txt.replace( + /^(["']use strict["'];)?["']use server["'];?/i, + '"use server";\n"use strict";', + ); + + /** remove empty file imports */ + txt = txt.replace(emptyChunkImportRegExp, ""); + + f.contents = new TextEncoder().encode(txt); + }); + + /** handle buildReplacePatterns */ + options.buildReplacePatterns?.forEach(replacePattern => replaceBuild(replacePattern, result)); + + /** Do not generate {empty} test files if keepTests is not set to true */ + if (!options.keepTests) { + result.outputFiles = result.outputFiles?.filter(f => !testPathRegExp.test(f.path)); + } + + /** remove empty files */ + result.outputFiles = result.outputFiles?.filter(f => f.text.trim() !== ""); + /** assume true if undefined */ + if (write === undefined || write) { + result.outputFiles?.forEach(file => { + fs.mkdirSync(path.dirname(file.path), { recursive: true }); + fs.writeFileSync(file.path, file.contents); + }); + } } function setup(build: PluginBuild, options: React18PluginOptions = {}) { - const write = build.initialOptions.write; - build.initialOptions.write = false; + const write = build.initialOptions.write; + build.initialOptions.write = false; - if (!options.keepTests) removeTests(build, options); + if (!options.keepTests) removeTests(build, options); - options.ignorePatterns?.forEach(ignorePattern => ignoreFiles(ignorePattern, build)); + options.ignorePatterns?.forEach(ignorePattern => ignoreFiles(ignorePattern, build)); - options.sourceReplacePatterns?.forEach(replacePattern => replaceSource(replacePattern, build)); + options.sourceReplacePatterns?.forEach(replacePattern => replaceSource(replacePattern, build)); - build.onLoad({ filter: /.*/, namespace: ignoreNamespace }, () => { - /** remove content to avoid building/transpiling ignored files*/ - return { contents: "" }; - }); + build.onLoad({ filter: /.*/, namespace: ignoreNamespace }, () => { + /** remove content to avoid building/transpiling ignored files*/ + return { contents: "" }; + }); - build.onLoad({ filter: /.*/, namespace: keepNamespace }, args => { - if (fs.existsSync(args.path) && fs.lstatSync(args.path).isDirectory()) return { contents: "" }; - else { - const loader = args.path.slice(args.path.lastIndexOf(".") + 1); - return { contents: fs.readFileSync(args.path, "utf-8"), loader } as OnLoadResult; - } - }); + build.onLoad({ filter: /.*/, namespace: keepNamespace }, args => { + if (fs.existsSync(args.path) && fs.lstatSync(args.path).isDirectory()) return { contents: "" }; + else { + const loader = args.path.slice(args.path.lastIndexOf(".") + 1); + return { contents: fs.readFileSync(args.path, "utf-8"), loader } as OnLoadResult; + } + }); - build.onEnd(result => onEndCallBack(result, options, write)); + build.onEnd(result => onEndCallBack(result, options, write)); } /** This plugin prevents building test files by esbuild. DTS may still geenrate type files for the tests with only { } as file content*/ const react18Plugin: (options?: React18PluginOptions) => Plugin = (options = {}) => ({ - name, - setup: build => setup(build, options), + name, + setup: build => setup(build, options), }); -export = react18Plugin; +export default react18Plugin; diff --git a/lib/tsup.config.ts b/lib/tsup.config.ts index c09a8bc1..cd1c64a9 100644 --- a/lib/tsup.config.ts +++ b/lib/tsup.config.ts @@ -1,6 +1,4 @@ import { defineConfig, type Options } from "tsup"; -import react18Plugin from "esbuild-plugin-react18"; -import cssPlugin from "esbuild-plugin-react18-css"; export default defineConfig( (options: Options) => @@ -12,7 +10,6 @@ export default defineConfig( clean: !options.watch, bundle: true, minify: !options.watch, - esbuildPlugins: [react18Plugin(), cssPlugin({ generateScopedName: "[folder]__[local]" })], ...options, }) as Options, ); diff --git a/packages/shared/package.json b/packages/shared/package.json index 2606c452..ab6ff20c 100644 --- a/packages/shared/package.json +++ b/packages/shared/package.json @@ -27,7 +27,7 @@ "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.6.0", - "esbuild-plugin-react18": "^0.1.5", + "esbuild-plugin-react18": "workspace:*", "esbuild-plugin-react18-css": "^0.0.4", "jsdom": "^24.0.0", "react": "^18.3.1", @@ -43,7 +43,6 @@ "nextjs-themes": "^3.1.1", "r18gs": "^1.0.2", "react-live": "^4.1.6", - "react18-loaders": "latest", - "esbuild-plugin-react18": "workspace:*" + "react18-loaders": "latest" } -} \ No newline at end of file +} From c5de7971f7b412481a585056177131ce3880fde8 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 13:37:38 +0530 Subject: [PATCH 08/24] touch up --- .github/FUNDING.yml | 2 +- lib/package.json | 41 +++++++++++++++++++++++++++++++---------- pnpm-lock.yaml | 26 ++++++-------------------- 3 files changed, 38 insertions(+), 31 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 95f5d426..5ef5e42c 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,6 +1,6 @@ # These are supported funding model platforms -github: [mayank1513] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] +github: [react18-tools, mayank1513] # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2] polar: mayank1513 patreon: # Replace with a single Patreon username open_collective: # Replace with a single Open Collective username diff --git a/lib/package.json b/lib/package.json index 63df08a7..36bf1520 100644 --- a/lib/package.json +++ b/lib/package.json @@ -2,8 +2,8 @@ "name": "esbuild-plugin-react18", "author": "Mayank Kumar Chaudhari ", "private": false, - "version": "0.0.0", - "description": "", + "version": "0.1.5", + "description": "Unlock the Potential of React Server Components! Harness the power of an ESBuild plugin designed for crafting libraries compatible with RSC (React18 Server Components).", "license": "MPL-2.0", "main": "./dist/index.js", "module": "./dist/index.mjs", @@ -33,6 +33,7 @@ "@types/react-dom": "^18.3.0", "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.6.0", + "esbuild": "^0.21.1", "jsdom": "^24.0.0", "react": "^18.3.1", "react-dom": "^18.3.1", @@ -41,10 +42,6 @@ "vite-tsconfig-paths": "^4.3.2", "vitest": "^1.6.0" }, - "dependencies": { - "esbuild": "^0.21.1", - "r18gs": "^1.0.2" - }, "peerDependencies": { "@types/react": "16.8 - 19", "next": "10 - 14", @@ -66,10 +63,34 @@ } ], "keywords": [ - "React", - "React Loaders", - "React 18", - "React 19", + "React Server Components", + "ESBuild", + "Plugin", + "Libraries", + "React18", + "Server-side rendering", + "Frontend development", + "Component architecture", + "use client", + "typescript", + "react18", + "react18-tools", + "use client", + "esbuild", + "esbuild-plugin", + "RSC compatible", + "esbuild-plugin-react18", + "esbuild-plugin-ignoretests", + "esbuild-plugin-ignore-test-files", + "esbuild-plugin-ignore-testfiles", + "esbuild-plugin-ignore", + "ignore", + "ignoretests", + "tsup", + "react-server-components", + "react-client-components", + "javascript", + "mayank1513", "Next.js", "Next.js 14", "React server components", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c8e916f..75535e12 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -262,15 +262,9 @@ importers: lib: dependencies: - esbuild: - specifier: ^0.21.1 - version: 0.21.1 next: specifier: 10 - 14 version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) - r18gs: - specifier: ^1.0.2 - version: 1.0.2(@types/react@18.3.1)(react@18.3.1) devDependencies: '@repo/eslint-config': specifier: workspace:* @@ -299,12 +293,9 @@ importers: '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) - esbuild-plugin-react18: - specifier: ^0.1.5 - version: 0.1.5 - esbuild-plugin-react18-css: - specifier: ^0.0.4 - version: 0.0.4 + esbuild: + specifier: ^0.21.1 + version: 0.21.1 jsdom: specifier: ^24.0.0 version: 24.0.0 @@ -392,9 +383,6 @@ importers: '@repo/scripts': specifier: workspace:* version: link:../../scripts - esbuild-plugin-react18: - specifier: workspace:* - version: link:../../lib nextjs-themes: specifier: ^3.1.1 version: 3.1.1(@types/react@18.3.1)(next@14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0))(react@18.3.1) @@ -435,6 +423,9 @@ importers: '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) + esbuild-plugin-react18: + specifier: workspace:* + version: link:../../lib esbuild-plugin-react18-css: specifier: ^0.0.4 version: 0.0.4 @@ -3064,9 +3055,6 @@ packages: esbuild-plugin-react18-css@0.0.4: resolution: {integrity: sha512-dg/6DB8c0ODubeahYa/4rWO5lk/Bn22lRD6n3+1ZFOvNU4d+Q/gGMiRq01ndrX7p70QYEnrjYmV8p59zrjTtIg==} - esbuild-plugin-react18@0.1.5: - resolution: {integrity: sha512-naueaYqB+DQ89yP19NNSEDSshXvmGFHZHet7gDxyLACAue50V2yHTds3nUkSP+xb75o1qmKeUGQdVFJig8x6LA==} - esbuild-plugins-node-modules-polyfill@1.6.3: resolution: {integrity: sha512-nydQGT3RijD8mBd3Hek+2gSAxndgceZU9GIjYYiqU+7CE7veN8utTmupf0frcKpwIXCXWpRofL9CY9k0yU70CA==} engines: {node: '>=14.0.0'} @@ -9885,8 +9873,6 @@ snapshots: postcss-modules: 6.0.0(postcss@8.4.38) sass: 1.77.0 - esbuild-plugin-react18@0.1.5: {} - esbuild-plugins-node-modules-polyfill@1.6.3(esbuild@0.17.6): dependencies: '@jspm/core': 2.0.1 From 3c3f6d822c3672fd13c0686ffd67a11cdcb31c17 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 13:44:06 +0530 Subject: [PATCH 09/24] Simplify build config --- lib/package.json | 4 ++-- lib/tsup.config.ts | 7 ++++--- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/package.json b/lib/package.json index 36bf1520..9258ead7 100644 --- a/lib/package.json +++ b/lib/package.json @@ -16,9 +16,9 @@ "dist/**" ], "scripts": { - "build": "tsup && tsc -p tsconfig-build.json", + "build": "tsup", "clean": "rm -rf dist", - "dev": "tsup --watch && tsc -p tsconfig-build.json -w", + "dev": "tsup --watch", "typecheck": "tsc --noEmit", "lint": "eslint src/", "test": "vitest run --coverage" diff --git a/lib/tsup.config.ts b/lib/tsup.config.ts index cd1c64a9..a0333399 100644 --- a/lib/tsup.config.ts +++ b/lib/tsup.config.ts @@ -3,13 +3,14 @@ import { defineConfig, type Options } from "tsup"; export default defineConfig( (options: Options) => ({ - format: ["cjs", "esm"], + format: ["cjs"], target: "es2019", - entry: ["./src"], + entry: ["./src/index.ts"], sourcemap: false, clean: !options.watch, - bundle: true, minify: !options.watch, + skipNodeModulesBundle: true, + dts: true, ...options, }) as Options, ); From 6002d401c8053a49eb73b2fb7c4b3585a58f3f71 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 13:58:38 +0530 Subject: [PATCH 10/24] Fix export issue. --- lib/tsup.config.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/tsup.config.ts b/lib/tsup.config.ts index a0333399..fa2fc4d1 100644 --- a/lib/tsup.config.ts +++ b/lib/tsup.config.ts @@ -3,14 +3,15 @@ import { defineConfig, type Options } from "tsup"; export default defineConfig( (options: Options) => ({ - format: ["cjs"], + format: ["cjs", "esm"], target: "es2019", entry: ["./src/index.ts"], sourcemap: false, clean: !options.watch, minify: !options.watch, - skipNodeModulesBundle: true, + bundle: true, dts: true, + footer: { js: "module.exports = module.exports.default;" }, ...options, }) as Options, ); From 420d4ad0c911f12909ef32ade1bf674f7b99b166 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 14:50:11 +0530 Subject: [PATCH 11/24] Touch up --- .changeset/silver-books-draw.md | 5 + README.md | 172 +++++++++++++++++++++----------- SECURITY.md | 4 +- contributing.md | 2 +- esbuild-react18.webp | Bin 0 -> 13820 bytes lib/CHANGELOG.md | 81 +++++++++++++++ lib/src/index.ts | 12 ++- 7 files changed, 209 insertions(+), 67 deletions(-) create mode 100644 .changeset/silver-books-draw.md create mode 100644 esbuild-react18.webp create mode 100644 lib/CHANGELOG.md diff --git a/.changeset/silver-books-draw.md b/.changeset/silver-books-draw.md new file mode 100644 index 00000000..d52df523 --- /dev/null +++ b/.changeset/silver-books-draw.md @@ -0,0 +1,5 @@ +--- +"esbuild-plugin-react18": patch +--- + +Add ESM build and minify CJS build diff --git a/README.md b/README.md index a1496c93..6ee2232e 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,53 @@ -# Esbuild Plugin React18 +# Esbuild Plugin React18 [![test](https://github.com/react18-tools/esbuild-plugin-react18/actions/workflows/test.yml/badge.svg)](https://github.com/react18-tools/esbuild-plugin-react18/actions/workflows/test.yml) [![Maintainability](https://api.codeclimate.com/v1/badges/aa896ec14c570f3bb274/maintainability)](https://codeclimate.com/github/react18-tools/esbuild-plugin-react18/maintainability) [![codecov](https://codecov.io/gh/react18-tools/esbuild-plugin-react18/graph/badge.svg)](https://codecov.io/gh/react18-tools/esbuild-plugin-react18) [![Version](https://img.shields.io/npm/v/esbuild-plugin-react18.svg?colorB=green)](https://www.npmjs.com/package/esbuild-plugin-react18) [![Downloads](https://img.jsdelivr.com/img.shields.io/npm/d18m/esbuild-plugin-react18.svg)](https://www.npmjs.com/package/esbuild-plugin-react18) ![npm bundle size](https://img.shields.io/bundlephobia/minzip/esbuild-plugin-react18) [![Gitpod ready-to-code](https://img.shields.io/badge/Gitpod-ready--to--code-blue?logo=gitpod)](https://gitpod.io/from-referrer/) -Esbuild Plugin React18 is a comprehensive library designed to unlock the full potential of React 18 server components. It provides customizable loading animation components and a fullscreen loader container, seamlessly integrating with React and Next.js. + -✅ Fully Treeshakable (import from `esbuild-plugin-react18/client/loader-container`) +> Build Awesome Libraries using React Server Components and make your Mark! -✅ Fully TypeScript Supported +Esbuild Plugin React18 is an `esbuild` plugin designed to help library developers unlock the full potential of React 18 server components. It facilitates compiling libraries compatible with React 18 server and client components, Next.js 13, Remix, etc., seamlessly integrating with React and Next.js. -✅ Leverages the power of React 18 Server components +## Why? -✅ Compatible with all React 18 build systems/tools/frameworks +✅ Unleash the full power of React18 Server components\ +✅ Build libraries for all build systems/tools/frameworks supporting React18\ +✅ Unleash the power of combining react client and server components in your libraries\ +✅ Full TypeScript support out of the box\ +✅ Supports CJS and ESM builds out of the box\ +✅ Simple and tiny\ +✅ Easy to use — just add the plugin, and you are good to go\ +✅ All in one plugin for building react18 libraries with `tsup` or `esbuild`\ +✅ add "use client" directive to indicate client component and the plugin will do the rest\ +✅ Automatically ignore test files during build\ +✅ Automatically remove `data-testid` attributes\ +✅ Add `ignorePatterns` and `replacePatterns` to achieve much more control over your build\ +✅ Fully Documented\ +✅ Ready to use [GitHub repository template](https://github.com/mayank1513/turborepo-template.git) to create your next react18 library\ -✅ Documented with [Typedoc](https://react18-tools.github.io/esbuild-plugin-react18) ([Docs](https://react18-tools.github.io/esbuild-plugin-react18)) +The introduction of React server components in React 18 has unlocked immense possibilities. However, library authors are not yet able to fully capitalize on this potential. Many libraries, like `chakra-ui`, simply add “use client” for each component. However, much more can be unleashed when we can use both server and client components to build libraries. Also, check out this [blog](https://mayank1513.medium.com/unleash-the-power-of-react-server-components-eb3fe7201231). -✅ Examples for Next.js, Vite, and Remix +### Build the libraries that -> Please consider starring [this repository](https://github.com/react18-tools/esbuild-plugin-react18) and sharing it with your friends. +✅ are Fully Treeshakable (import from `esbuild-plugin-react18/client/loader-container`) + +✅ provide Fully TypeScript Supported + +✅ Leverage the full power of React 18 Server components + +✅ are Compatible with all React 18 build systems/tools/frameworks + +✅ are Documented with [Typedoc](https://react18-tools.github.io/esbuild-plugin-react18) ([Docs](https://react18-tools.github.io/esbuild-plugin-react18)) + +✅ provide Examples for Next.js, Vite, and Remix + +> Please consider starring [this repository](https://github.com/react18-tools/esbuild-plugin-react18) and sharing it with your friends. + +## Compatibility + +- JavaScript/TypeScript React libraries using `tsup` or other builders based on `esbuild` + +This plugin seamlessly integrates with `tsup` and any other builders based on `esbuild`. With this, you can have both server and client components in your library and the plugin will take care of the rest. All you need to do is add this plugin and add `"use client";` on top of client components (in your source code). Additionally, test files will be removed automatically from the build resulting in a smaller package. Explore more functionalities in the docs. ## Getting Started @@ -38,74 +69,97 @@ $ npm install esbuild-plugin-react18 $ yarn add esbuild-plugin-react18 ``` -### Import Styles +> If you are using `monorepo` or `workspaces`, you can install this plugin to the root using `-w` or to a specific workspace using `--filter your-package` or `--scope your-package` for `pnpm` or `yarn` workspaces, respectively. -You can import styles globally or within specific components. +## Use with `tsup` -```css -/* globals.css */ -@import "esbuild-plugin-react18/dist"; -``` +```ts +// tsup.config.ts or tsup.config.js +import { defineConfig } from "tsup"; +import react18Plugin from "esbuild-react18-useclient"; -```tsx -// layout.tsx -import "esbuild-plugin-react18/dist/index.css"; +const react18PluginOptions: React18PluginOptions = {} +export default defineConfig(options => ({ + ... + esbuildPlugins:[react18Plugin(react18PluginOptions)] +})); ``` -For selective imports: - -```css -/* globals.css */ -@import "esbuild-plugin-react18/dist/client"; /** required if you are using LoaderContainer */ -@import "esbuild-plugin-react18/dist/server/bars/bars1"; -``` +## Use with `esbuild` -### Usage +```ts +import react18Plugin from "esbuild-react18-useclient"; -Using loaders is straightforward. - -```tsx -import { Bars1 } from "esbuild-plugin-react18/dist/server/bars/bars1"; +const react18PluginOptions: React18PluginOptions = {} +esbuild.build({ + ... + plugins: [react18Plugin()], +}); +``` -export default function MyComponent() { - return someCondition ? : <>Something else...; +## Plugin Options + +```ts +interface React18PluginOptions { + /** to not ignore test files */ + keepTests?: boolean; + + /** to not remove `data-testid` attributes. If `keepTests` is true, + * `data-testid` attributes will not be removed irrespective of + * `keepTestIds` value. + * This attribute is useful when setting `sourceReplacePatterns` + */ + keepTestIds?: boolean; + + /** + * regExp patterns to match file paths to be ignored. + * If contentPatterns are provided, only the files at matching paths + * containing one or more of the content patterns will be ignored + */ + ignorePatterns?: { pathPattern: RegExp; contentPatterns?: RegExp[] }[]; + + /** + * regExp patterns to find and replace in source files before build + * + * Use with caution! Make sure the same file does not match multiple patterns + * to avoid any unexpected results. + * + * Caution! - if you have not enabled `keepTests`, we are already using + * `/.*\.(j|t)s(x)?$/` pattern to remove ` + +data-testid` attributes. If your + * `sourceReplacePatterns` collide with these files, please set `keepTestIds` + * to `true` and handle removing testids yourself. + */ + sourceReplacePatterns?: { + pathPattern: RegExp; + replaceParams: { pattern: RegExp; substitute: string }[]; + }[]; + + /** + * regExp patterns to find and replace in build files after build + * Use with caution! Make sure the same file does not match multiple patterns + * to avoid any unexpected results. + */ + buildReplacePatterns?: { + pathPattern: RegExp; + replaceParams: { pattern: RegExp; substitute: string }[]; + }[]; } ``` -For detailed API and options, refer to [the API documentation](https://react18-tools.github.io/esbuild-plugin-react18). +### [🤩 Don't forget to star this repo!](https://github.com/react18-tools/esbuild-plugin-react18) -**Using LoaderContainer** +[💖](https://github.com/react18-tools/esbuild-plugin-react18) [🌟](https://github.com/react18-tools/esbuild-plugin-react18) +Want a hands-on course for getting started with Turborepo? Check out [React and Next.js with TypeScript](https://www.udemy.com/course/react-and-next-js-with-typescript/?referralCode=7202184A1E57C3DCA8B2) and [The Game of Chess with Next.js, React, and TypeScript](https://www.udemy.com/course/game-of-chess-with-nextjs-react-and-typescrypt/?referralCode=851A28F10B254A8523FE) -`LoaderContainer` is a fullscreen component. You can add this component directly in your layout and then use `useLoader` hook to toggle its visibility. - -```tsx -// layout.tsx - - ... -``` - -```tsx -// some other page or component -import { useLoader } from "esbuild-plugin-react18/dist/hooks"; - -export default MyComponent() { - const { setLoading } = useLoader(); - useCallback(()=>{ - setLoading(true); - ...do some work - setLoading(false); - }, []) - ... -} -``` +![Alt](https://repobeats.axiom.co/api/embed/798673e15cf0802fe4e2470f946b64b551b5536d.svg "Repobeats analytics image") ## License This library is licensed under the MPL-2.0 open-source license. - - -> Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work. +> Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work.
diff --git a/SECURITY.md b/SECURITY.md index bec03058..79714687 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -6,7 +6,7 @@ We provide support for the latest minor version. Pull requests aimed at fixing s | Version | Support Status | | ------- | ------------------ | -| 0.0.x | :white_check_mark: | +| 0.1.x | :white_check_mark: | | 0.0.x | :warning: | | < 0.0 | :x: | @@ -20,4 +20,4 @@ Note: We only accept pull requests addressing security vulnerabilities. Addition ## Reporting Vulnerabilities -Kindly report vulnerabilities [here](https://github.com/react18-tools/turborepo-template/security/advisories/new). +Kindly report vulnerabilities [here](https://github.com/react18-tools/esbuild-plugin-react18/security/advisories/new). diff --git a/contributing.md b/contributing.md index f13085b9..36467231 100644 --- a/contributing.md +++ b/contributing.md @@ -29,7 +29,7 @@ This TurboRepo comprises the following packages/examples, all written in [TypeSc - `@repo/jest-presets`: Jest presets for unit testing - `@repo/logger`: A configurable shared logger utility - `@repo/shared`: An internal library of components utilized by the examples -- `react18-loaders`: a React component library (The core package published to NPM) +- `react18-loaders`: An ESBuild plugin for React18 (The core package published to NPM) ## Automated File Generation diff --git a/esbuild-react18.webp b/esbuild-react18.webp new file mode 100644 index 0000000000000000000000000000000000000000..e0022d88e073764c1ec0f6440a656f7a6c669eba GIT binary patch literal 13820 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 Date: Wed, 8 May 2024 14:53:51 +0530 Subject: [PATCH 12/24] Touch up --- lib/src/constants.ts | 8 -------- lib/src/index.ts | 10 +++++++++- 2 files changed, 9 insertions(+), 9 deletions(-) delete mode 100644 lib/src/constants.ts diff --git a/lib/src/constants.ts b/lib/src/constants.ts deleted file mode 100644 index 66cabdbb..00000000 --- a/lib/src/constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -const uuid = () => (Date.now() * Math.random()).toString(36).slice(0, 8); - -/** regExp */ -export const testPathRegExp = /.*\.(test|spec|check)\.(j|t)s(x)?$/i; - -export const name = "esbuild-plugin-react18-" + uuid(); -export const ignoreNamespace = "mayank1513-ignore-" + uuid(); -export const keepNamespace = "mayank1513-keep-" + uuid(); diff --git a/lib/src/index.ts b/lib/src/index.ts index 28c54596..623fa709 100644 --- a/lib/src/index.ts +++ b/lib/src/index.ts @@ -1,7 +1,15 @@ import type { BuildResult, OnLoadResult, Plugin, PluginBuild } from "esbuild"; import fs from "node:fs"; import path from "node:path"; -import { testPathRegExp, name, ignoreNamespace, keepNamespace } from "./constants"; + +const uuid = () => (Date.now() * Math.random()).toString(36).slice(0, 8); + +/** regExp */ +const testPathRegExp = /.*\.(test|spec|check)\.(j|t)s(x)?$/i; + +const name = "esbuild-plugin-react18-" + uuid(); +const ignoreNamespace = "mayank1513-ignore-" + uuid(); +const keepNamespace = "mayank1513-keep-" + uuid(); interface ignorePattern { pathPattern: RegExp; From 7a0ba40419eff8c5f37059f84a0f63f90e378b54 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 15:03:11 +0530 Subject: [PATCH 13/24] Add unit tests --- lib/__tests__/index.test.ts | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 lib/__tests__/index.test.ts diff --git a/lib/__tests__/index.test.ts b/lib/__tests__/index.test.ts new file mode 100644 index 00000000..ff2d164f --- /dev/null +++ b/lib/__tests__/index.test.ts @@ -0,0 +1,23 @@ +import fs from "node:fs"; +import path from "node:path"; +import { describe, test } from "vitest"; + +/** testing tsup example (packages/shared) - make sure it is build before running this test suit */ +describe.concurrent("Test plugin with default options in example build with tsup", () => { + const exampleBuildDir = path.resolve(process.cwd(), "..", "packages", "shared", "dist"); + + test(`"use client"; directive should be present in client components`, ({ expect }) => { + const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); + expect(/^"use client";\n/m.test(text)).toBe(true); + }); + + test(`"use client"; directive should not be present in server components`, ({ expect }) => { + const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "index.js"), "utf-8"); + expect(/^"use client";\n/m.test(text)).toBe(false); + }); + + test(`should not contain data-testid`, ({ expect }) => { + const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); + expect(/data-testid/.test(text)).toBe(false); + }); +}); From 5e5415b1893763b366cbfd5bdd32e3a7bcc0741d Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 15:23:20 +0530 Subject: [PATCH 14/24] Add unit tests --- lib/__tests__/dist.test.ts | 26 ++++++++++++ lib/__tests__/index.test.ts | 56 ++++++++++++++++++++----- lib/package.json | 2 + lib/vitest.config.ts | 2 +- packages/shared/src/server/constants.ts | 3 ++ pnpm-lock.yaml | 19 +++++++++ 6 files changed, 96 insertions(+), 12 deletions(-) create mode 100644 lib/__tests__/dist.test.ts create mode 100644 packages/shared/src/server/constants.ts diff --git a/lib/__tests__/dist.test.ts b/lib/__tests__/dist.test.ts new file mode 100644 index 00000000..0c8e4a3b --- /dev/null +++ b/lib/__tests__/dist.test.ts @@ -0,0 +1,26 @@ +import fs from "node:fs"; +import path from "node:path"; +import { describe, test } from "vitest"; + +/** testing tsup example (packages/shared) - make sure it is build before running this test suit + * + * These tests are not included in coverage as they do not invoke the source code directly. However, these tests are very important to ensure that the build outputs in dist directory are behaving as expected. + */ +describe.concurrent("Test plugin with default options in example build with tsup", () => { + const exampleBuildDir = path.resolve(process.cwd(), "..", "packages", "shared", "dist"); + + test(`"use client"; directive should be present in client components`, ({ expect }) => { + const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); + expect(/^"use client";\n/m.test(text)).toBe(true); + }); + + test(`"use client"; directive should not be present in server components`, ({ expect }) => { + const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "index.js"), "utf-8"); + expect(/^"use client";\n/m.test(text)).toBe(false); + }); + + test(`should not contain data-testid`, ({ expect }) => { + const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); + expect(/data-testid/.test(text)).toBe(false); + }); +}); diff --git a/lib/__tests__/index.test.ts b/lib/__tests__/index.test.ts index ff2d164f..aee5ed4f 100644 --- a/lib/__tests__/index.test.ts +++ b/lib/__tests__/index.test.ts @@ -1,23 +1,57 @@ import fs from "node:fs"; import path from "node:path"; -import { describe, test } from "vitest"; +import { describe, test, beforeAll } from "vitest"; +import esbuild from "esbuild"; +import react18Plugin from "../src"; +import glob from "tiny-glob"; +import cssPlugin from "esbuild-plugin-react18-css"; -/** testing tsup example (packages/shared) - make sure it is build before running this test suit */ -describe.concurrent("Test plugin with default options in example build with tsup", () => { - const exampleBuildDir = path.resolve(process.cwd(), "..", "packages", "shared", "dist"); +/** + * buildReplacePatterns could be very helpful in removing unnecessary comments introduced while bundling from other libraries + */ +describe.concurrent("Test plugin with ignorePatterns -- without content pattern", async () => { + const outDir = "build-replace-patterns"; + const buildDir = path.resolve(__dirname, "build", outDir); + try { + fs.unlinkSync(path.resolve(buildDir)); + } catch {} + beforeAll(async () => { + await esbuild.build({ + format: "cjs", + target: "es2019", + sourcemap: false, + bundle: true, + minify: true, + plugins: [ + react18Plugin({ + buildReplacePatterns: [ + { + pathPattern: /constants/, + replaceParams: [ + { pattern: /aaa/, substitute: "3c3c3c" }, + { pattern: /#555/, substitute: "#ccc" }, + ], + }, + ], + }), + cssPlugin(), + ], + entryPoints: await glob("../packages/shared/src/**/*.*"), + external: ["react", "react-dom"], + outdir: "./__tests__/build/" + outDir, + }); + }); test(`"use client"; directive should be present in client components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); + const text = fs.readFileSync(path.resolve(buildDir, "client", "index.js"), "utf-8"); expect(/^"use client";\n/m.test(text)).toBe(true); }); - test(`"use client"; directive should not be present in server components`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "server", "index.js"), "utf-8"); + const text = fs.readFileSync(path.resolve(buildDir, "server", "index.js"), "utf-8"); expect(/^"use client";\n/m.test(text)).toBe(false); }); - - test(`should not contain data-testid`, ({ expect }) => { - const text = fs.readFileSync(path.resolve(exampleBuildDir, "client", "index.js"), "utf-8"); - expect(/data-testid/.test(text)).toBe(false); + test(`defaultBgColor should be "#3c3c3c" and defaultColor should be "#ccc"`, ({ expect }) => { + const text = fs.readFileSync(path.resolve(buildDir, "server", "constants.js"), "utf-8"); + expect(text.includes("3c3c3c")).toBe(true); }); }); diff --git a/lib/package.json b/lib/package.json index 9258ead7..9805e407 100644 --- a/lib/package.json +++ b/lib/package.json @@ -34,9 +34,11 @@ "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.6.0", "esbuild": "^0.21.1", + "esbuild-plugin-react18-css": "^0.0.4", "jsdom": "^24.0.0", "react": "^18.3.1", "react-dom": "^18.3.1", + "tiny-glob": "^0.2.9", "tsup": "^8.0.2", "typescript": "^5.4.5", "vite-tsconfig-paths": "^4.3.2", diff --git a/lib/vitest.config.ts b/lib/vitest.config.ts index 18196779..af3813fe 100644 --- a/lib/vitest.config.ts +++ b/lib/vitest.config.ts @@ -6,7 +6,7 @@ import tsconfigPaths from "vite-tsconfig-paths"; export default defineConfig({ plugins: [react(), tsconfigPaths()], test: { - environment: "jsdom", + environment: "node", globals: true, setupFiles: [], coverage: { diff --git a/packages/shared/src/server/constants.ts b/packages/shared/src/server/constants.ts new file mode 100644 index 00000000..b231c4a2 --- /dev/null +++ b/packages/shared/src/server/constants.ts @@ -0,0 +1,3 @@ +/** we will replace default colors to test sourceReplacePatterns */ +export const defaultBgColor = "#aaa"; +export const defaultColor = "#555"; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 75535e12..105b895b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -296,6 +296,9 @@ importers: esbuild: specifier: ^0.21.1 version: 0.21.1 + esbuild-plugin-react18-css: + specifier: ^0.0.4 + version: 0.0.4 jsdom: specifier: ^24.0.0 version: 24.0.0 @@ -305,6 +308,9 @@ importers: react-dom: specifier: ^18.3.1 version: 18.3.1(react@18.3.1) + tiny-glob: + specifier: ^0.2.9 + version: 0.2.9 tsup: specifier: ^8.0.2 version: 8.0.2(postcss@8.4.38)(ts-node@10.9.2(@types/node@20.12.10)(typescript@5.4.5))(typescript@5.4.5) @@ -3656,6 +3662,9 @@ packages: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} + globalyzer@0.1.0: + resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -6168,6 +6177,9 @@ packages: through2@2.0.5: resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==} + tiny-glob@0.2.9: + resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} + tinybench@2.8.0: resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} @@ -10740,6 +10752,8 @@ snapshots: define-properties: 1.2.1 gopd: 1.0.1 + globalyzer@0.1.0: {} + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -13984,6 +13998,11 @@ snapshots: readable-stream: 2.3.8 xtend: 4.0.2 + tiny-glob@0.2.9: + dependencies: + globalyzer: 0.1.0 + globrex: 0.1.2 + tinybench@2.8.0: {} tinypool@0.8.4: {} From 30cb65dee03ac5a7c762015484bf2fc16b6bc840 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 15:32:18 +0530 Subject: [PATCH 15/24] Fix vitest config and clean up --- .gitignore | 1 + lib/package.json | 6 ------ lib/vitest.config.ts | 4 +--- pnpm-lock.yaml | 21 +++------------------ 4 files changed, 5 insertions(+), 27 deletions(-) diff --git a/.gitignore b/.gitignore index 544fb870..7cb074bc 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ node_modules *.log .next dist +build dist-ssr *.local .env diff --git a/lib/package.json b/lib/package.json index 9805e407..5fcbc854 100644 --- a/lib/package.json +++ b/lib/package.json @@ -25,19 +25,13 @@ }, "devDependencies": { "@repo/eslint-config": "workspace:*", - "@repo/jest-presets": "workspace:*", "@repo/typescript-config": "workspace:*", - "@testing-library/react": "^15.0.7", "@types/node": "^20.12.10", "@types/react": "^18.3.1", "@types/react-dom": "^18.3.0", - "@vitejs/plugin-react": "^4.2.1", "@vitest/coverage-v8": "^1.6.0", "esbuild": "^0.21.1", "esbuild-plugin-react18-css": "^0.0.4", - "jsdom": "^24.0.0", - "react": "^18.3.1", - "react-dom": "^18.3.1", "tiny-glob": "^0.2.9", "tsup": "^8.0.2", "typescript": "^5.4.5", diff --git a/lib/vitest.config.ts b/lib/vitest.config.ts index af3813fe..cfc0b01e 100644 --- a/lib/vitest.config.ts +++ b/lib/vitest.config.ts @@ -1,17 +1,15 @@ import { defineConfig } from "vitest/config"; -import react from "@vitejs/plugin-react"; import tsconfigPaths from "vite-tsconfig-paths"; // https://vitejs.dev/config/ export default defineConfig({ - plugins: [react(), tsconfigPaths()], + plugins: [tsconfigPaths()], test: { environment: "node", globals: true, setupFiles: [], coverage: { include: ["src/**"], - exclude: ["src/**/index.ts", "src/**/declaration.d.ts"], reporter: ["text", "json", "clover", "html"], }, }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 105b895b..97059579 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -265,19 +265,16 @@ importers: next: specifier: 10 - 14 version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) + react: + specifier: 16.8 - 19 + version: 18.3.1 devDependencies: '@repo/eslint-config': specifier: workspace:* version: link:../packages/config-eslint - '@repo/jest-presets': - specifier: workspace:* - version: link:../packages/jest-presets '@repo/typescript-config': specifier: workspace:* version: link:../packages/config-typescript - '@testing-library/react': - specifier: ^15.0.7 - version: 15.0.7(@types/react@18.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1) '@types/node': specifier: ^20.12.10 version: 20.12.10 @@ -287,9 +284,6 @@ importers: '@types/react-dom': specifier: ^18.3.0 version: 18.3.0 - '@vitejs/plugin-react': - specifier: ^4.2.1 - version: 4.2.1(vite@5.2.11(@types/node@20.12.10)(sass@1.77.0)) '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) @@ -299,15 +293,6 @@ importers: esbuild-plugin-react18-css: specifier: ^0.0.4 version: 0.0.4 - jsdom: - specifier: ^24.0.0 - version: 24.0.0 - react: - specifier: ^18.3.1 - version: 18.3.1 - react-dom: - specifier: ^18.3.1 - version: 18.3.1(react@18.3.1) tiny-glob: specifier: ^0.2.9 version: 0.2.9 From 2cda2b9f026feaa303e82658ce877404a1d38b0a Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 16:22:53 +0530 Subject: [PATCH 16/24] Improve test coverage --- lib/__tests__/index.test.ts | 106 ++++++++++++------ lib/package.json | 2 - lib/src/index.ts | 2 +- .../src/client/demo/with-ignore-pattern.ts | 3 + 4 files changed, 77 insertions(+), 36 deletions(-) create mode 100644 packages/shared/src/client/demo/with-ignore-pattern.ts diff --git a/lib/__tests__/index.test.ts b/lib/__tests__/index.test.ts index aee5ed4f..1a268af9 100644 --- a/lib/__tests__/index.test.ts +++ b/lib/__tests__/index.test.ts @@ -1,45 +1,43 @@ import fs from "node:fs"; import path from "node:path"; import { describe, test, beforeAll } from "vitest"; -import esbuild from "esbuild"; -import react18Plugin from "../src"; +import esbuild, { build } from "esbuild"; +import react18Plugin, { React18PluginOptions } from "../src"; import glob from "tiny-glob"; import cssPlugin from "esbuild-plugin-react18-css"; -/** - * buildReplacePatterns could be very helpful in removing unnecessary comments introduced while bundling from other libraries - */ -describe.concurrent("Test plugin with ignorePatterns -- without content pattern", async () => { - const outDir = "build-replace-patterns"; +const outDirPrefix = "./__tests__/build/"; +const srcPattern = "../packages/shared/src/**/*.*"; + +/** Utility funciton to create build options and buildDir */ +async function createEsBUildOptions( + outDir: string, + pluginOptions?: React18PluginOptions, +): Promise { const buildDir = path.resolve(__dirname, "build", outDir); try { - fs.unlinkSync(path.resolve(buildDir)); + fs.rmSync(buildDir, { recursive: true }); + fs.unlinkSync(buildDir); } catch {} + return { + format: "cjs", + target: "es2019", + sourcemap: false, + bundle: true, + minify: true, + plugins: [react18Plugin(pluginOptions), cssPlugin()], + entryPoints: await glob(srcPattern), + external: ["react", "react-dom"], + outdir: outDirPrefix + outDir, + buildDir, + }; +} + +describe.concurrent("Test plugin with ESBuild with default options", async () => { + const { buildDir, ...options } = await createEsBUildOptions("default-options"); + beforeAll(async () => { - await esbuild.build({ - format: "cjs", - target: "es2019", - sourcemap: false, - bundle: true, - minify: true, - plugins: [ - react18Plugin({ - buildReplacePatterns: [ - { - pathPattern: /constants/, - replaceParams: [ - { pattern: /aaa/, substitute: "3c3c3c" }, - { pattern: /#555/, substitute: "#ccc" }, - ], - }, - ], - }), - cssPlugin(), - ], - entryPoints: await glob("../packages/shared/src/**/*.*"), - external: ["react", "react-dom"], - outdir: "./__tests__/build/" + outDir, - }); + await esbuild.build(options); }); test(`"use client"; directive should be present in client components`, ({ expect }) => { @@ -50,8 +48,50 @@ describe.concurrent("Test plugin with ignorePatterns -- without content pattern" const text = fs.readFileSync(path.resolve(buildDir, "server", "index.js"), "utf-8"); expect(/^"use client";\n/m.test(text)).toBe(false); }); - test(`defaultBgColor should be "#3c3c3c" and defaultColor should be "#ccc"`, ({ expect }) => { +}); + +describe.concurrent("Test PlugInOptions", () => { + /** + * buildReplacePatterns could be very helpful in removing unnecessary comments introduced while bundling from other libraries + */ + test('Test buildReplacePatterns: defaultBgColor should be "#3c3c3c" and defaultColor should be "#ccc"', async ({ + expect, + }) => { + const { buildDir, ...options } = await createEsBUildOptions("build-replace-patterns", { + buildReplacePatterns: [ + { + pathPattern: /constants/, + replaceParams: [ + { pattern: /aaa/, substitute: "3c3c3c" }, + { pattern: /#555/, substitute: "#ccc" }, + ], + }, + ], + }); + await esbuild.build(options); const text = fs.readFileSync(path.resolve(buildDir, "server", "constants.js"), "utf-8"); expect(text.includes("3c3c3c")).toBe(true); }); + + test("Test plugin with ignorePatterns -- without content pattern", async ({ expect }) => { + const { buildDir, ...optinos } = await createEsBUildOptions("ignore-patterns-0", { + ignorePatterns: [{ pathPattern: /demo/ }], + }); + await esbuild.build(optinos); + expect(fs.existsSync(path.resolve(buildDir, "client", "demo"))).toBe(false); + }); + + /** + * When content pattern is provided only the ignorePattern files having content matching the content pattern will be removed + */ + // test("Test plugin with ignorePatterns with content pattern", async ({ expect }) => { + // const { buildDir, ...optinos } = await createEsBUildOptions("ignore-patterns-1", { + // ignorePatterns: [{ pathPattern: /demo/, contentPatterns: [/ignore-me/] }], + // }); + // await esbuild.build(optinos); + // expect(fs.existsSync(path.resolve(buildDir, "client", "demo"))).toBe(true); + // expect(fs.existsSync(path.resolve(buildDir, "client", "demo", "with-ignore-pattern.ts"))).toBe( + // false, + // ); + // }); }); diff --git a/lib/package.json b/lib/package.json index 5fcbc854..42aee6ff 100644 --- a/lib/package.json +++ b/lib/package.json @@ -27,8 +27,6 @@ "@repo/eslint-config": "workspace:*", "@repo/typescript-config": "workspace:*", "@types/node": "^20.12.10", - "@types/react": "^18.3.1", - "@types/react-dom": "^18.3.0", "@vitest/coverage-v8": "^1.6.0", "esbuild": "^0.21.1", "esbuild-plugin-react18-css": "^0.0.4", diff --git a/lib/src/index.ts b/lib/src/index.ts index 623fa709..f2cb47b6 100644 --- a/lib/src/index.ts +++ b/lib/src/index.ts @@ -21,7 +21,7 @@ interface ReplacePattern { replaceParams: { pattern: RegExp; substitute: string }[]; } -interface React18PluginOptions { +export interface React18PluginOptions { /** to not ignore test files */ keepTests?: boolean; diff --git a/packages/shared/src/client/demo/with-ignore-pattern.ts b/packages/shared/src/client/demo/with-ignore-pattern.ts new file mode 100644 index 00000000..a5973735 --- /dev/null +++ b/packages/shared/src/client/demo/with-ignore-pattern.ts @@ -0,0 +1,3 @@ +/** ignore-me */ + +export const DONT_USE_ME = "DONT_USE_ME"; From cf5f82970b8149ec0f94b0f9877055b6ed2f08a2 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 16:53:07 +0530 Subject: [PATCH 17/24] Update tests --- lib/__tests__/index.test.ts | 53 +++++++++++++++---- packages/shared/src/client/demo/demo.tsx | 3 ++ .../src/client/demo/with-ignore-pattern.ts | 3 -- .../shared/src/client/global-loader/dummy.ts | 1 + 4 files changed, 47 insertions(+), 13 deletions(-) delete mode 100644 packages/shared/src/client/demo/with-ignore-pattern.ts create mode 100644 packages/shared/src/client/global-loader/dummy.ts diff --git a/lib/__tests__/index.test.ts b/lib/__tests__/index.test.ts index 1a268af9..83ee0b98 100644 --- a/lib/__tests__/index.test.ts +++ b/lib/__tests__/index.test.ts @@ -83,15 +83,48 @@ describe.concurrent("Test PlugInOptions", () => { /** * When content pattern is provided only the ignorePattern files having content matching the content pattern will be removed + * + * TODO: fix build with css and content ignore patterns */ - // test("Test plugin with ignorePatterns with content pattern", async ({ expect }) => { - // const { buildDir, ...optinos } = await createEsBUildOptions("ignore-patterns-1", { - // ignorePatterns: [{ pathPattern: /demo/, contentPatterns: [/ignore-me/] }], - // }); - // await esbuild.build(optinos); - // expect(fs.existsSync(path.resolve(buildDir, "client", "demo"))).toBe(true); - // expect(fs.existsSync(path.resolve(buildDir, "client", "demo", "with-ignore-pattern.ts"))).toBe( - // false, - // ); - // }); + test.todo("Test plugin with ignorePatterns with content pattern", async ({ expect }) => { + const { buildDir, ...optinos } = await createEsBUildOptions("ignore-patterns-1", { + ignorePatterns: [{ pathPattern: /demo/, contentPatterns: [/ignore-me/] }], + }); + await esbuild.build(optinos); + expect(fs.existsSync(path.resolve(buildDir, "client", "demo"))).toBe(true); + expect(fs.existsSync(path.resolve(buildDir, "client", "demo", "demo.tsx"))).toBe(false); + }); + + /** Fix The plugin didn't set a resolve directory for the file - so esbuild did not search for "react18-loaders" on the file system */ + test.todo("Test plugin with ignorePatterns with content pattern", async ({ expect }) => { + const { buildDir, ...optinos } = await createEsBUildOptions("ignore-patterns-1", { + ignorePatterns: [{ pathPattern: /global-loader/, contentPatterns: [/ignore-me/] }], + }); + await esbuild.build(optinos); + expect(fs.existsSync(path.resolve(buildDir, "client", "global-loader"))).toBe(true); + expect(fs.existsSync(path.resolve(buildDir, "client", "global-loader", "dummy.ts"))).toBe( + false, + ); + }); + + test('Test sourceReplacePatterns: defaultBgColor should be "#3c3c3c"', async ({ expect }) => { + const { buildDir, ...options } = await createEsBUildOptions("source-replace-patterns", { + sourceReplacePatterns: [ + { + pathPattern: /constants/, + replaceParams: [ + { pattern: /aaa/, substitute: "3c3c3c" }, + { pattern: /#555/, substitute: "#ccc" }, + ], + }, + { + pathPattern: /client/, + replaceParams: [], + }, + ], + }); + await esbuild.build(options); + const text = fs.readFileSync(path.resolve(buildDir, "server", "constants.js"), "utf-8"); + expect(text.includes("3c3c3c")).toBe(true); + }); }); diff --git a/packages/shared/src/client/demo/demo.tsx b/packages/shared/src/client/demo/demo.tsx index 10f8ebdf..4114ceaf 100644 --- a/packages/shared/src/client/demo/demo.tsx +++ b/packages/shared/src/client/demo/demo.tsx @@ -1,5 +1,8 @@ "use client"; +/** ignore-me */ +// ignore this file with the ignore pattern + import styles from "./demo.module.scss"; import { LiveProvider, LiveEditor, LivePreview } from "react-live"; import { Dots1, Dots2, Bars1, Bars2 } from "react18-loaders/dist/server"; diff --git a/packages/shared/src/client/demo/with-ignore-pattern.ts b/packages/shared/src/client/demo/with-ignore-pattern.ts deleted file mode 100644 index a5973735..00000000 --- a/packages/shared/src/client/demo/with-ignore-pattern.ts +++ /dev/null @@ -1,3 +0,0 @@ -/** ignore-me */ - -export const DONT_USE_ME = "DONT_USE_ME"; diff --git a/packages/shared/src/client/global-loader/dummy.ts b/packages/shared/src/client/global-loader/dummy.ts new file mode 100644 index 00000000..a5cd9cdc --- /dev/null +++ b/packages/shared/src/client/global-loader/dummy.ts @@ -0,0 +1 @@ +// ignore-me I am here just to test this pattern From 179b71989168387c8c3af2d19dc6ffa4e9dfbf72 Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 16:55:11 +0530 Subject: [PATCH 18/24] Add a dummy component for testing ignorePaterns with contentPatterns --- .../shared/src/client/dummy/dummy.test.tsx | 13 ++++++++++++ packages/shared/src/client/dummy/dummy.tsx | 21 +++++++++++++++++++ packages/shared/src/client/dummy/index.ts | 4 ++++ packages/shared/src/client/index.ts | 1 + 4 files changed, 39 insertions(+) create mode 100644 packages/shared/src/client/dummy/dummy.test.tsx create mode 100644 packages/shared/src/client/dummy/dummy.tsx create mode 100644 packages/shared/src/client/dummy/index.ts diff --git a/packages/shared/src/client/dummy/dummy.test.tsx b/packages/shared/src/client/dummy/dummy.test.tsx new file mode 100644 index 00000000..dd13a6c8 --- /dev/null +++ b/packages/shared/src/client/dummy/dummy.test.tsx @@ -0,0 +1,13 @@ +import { cleanup, render, screen } from "@testing-library/react"; +import { afterEach, describe, test } from "vitest"; +import { Dummy } from "./dummy"; + +describe.concurrent("dummy", () => { + afterEach(cleanup); + + test("Dummy test - test if renders without errors", ({ expect }) => { + const clx = "my-class"; + render(); + expect(screen.getByTestId("dummy").classList).toContain(clx); + }); +}); diff --git a/packages/shared/src/client/dummy/dummy.tsx b/packages/shared/src/client/dummy/dummy.tsx new file mode 100644 index 00000000..13035cce --- /dev/null +++ b/packages/shared/src/client/dummy/dummy.tsx @@ -0,0 +1,21 @@ +import { HTMLProps } from "react"; + +interface DummyProps extends HTMLProps {} + +/** + * + * + * @example + * ```tsx + * + * ``` + * + * @source - Source code + */ +export function Dummy({ children, ...props }: DummyProps) { + return ( +
+ {children} +
+ ); +} diff --git a/packages/shared/src/client/dummy/index.ts b/packages/shared/src/client/dummy/index.ts new file mode 100644 index 00000000..a2515a43 --- /dev/null +++ b/packages/shared/src/client/dummy/index.ts @@ -0,0 +1,4 @@ +"use client"; + +// component exports +export * from "./dummy"; diff --git a/packages/shared/src/client/index.ts b/packages/shared/src/client/index.ts index 9ae49861..b092cbf7 100644 --- a/packages/shared/src/client/index.ts +++ b/packages/shared/src/client/index.ts @@ -7,6 +7,7 @@ */ // client component exports +export * from "./dummy"; export * from "./demo"; export * from "./header"; export * from "./global-loader"; From 5124e7a48f5b16cf5f9cfd99cab0a57215c9e9bb Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 16:59:42 +0530 Subject: [PATCH 19/24] Test ignorepatterns with content patterns --- lib/__tests__/index.test.ts | 11 ++++++++++- packages/shared/src/client/dummy/igrore.ts | 3 +++ 2 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 packages/shared/src/client/dummy/igrore.ts diff --git a/lib/__tests__/index.test.ts b/lib/__tests__/index.test.ts index 83ee0b98..5d59be6f 100644 --- a/lib/__tests__/index.test.ts +++ b/lib/__tests__/index.test.ts @@ -95,7 +95,7 @@ describe.concurrent("Test PlugInOptions", () => { expect(fs.existsSync(path.resolve(buildDir, "client", "demo", "demo.tsx"))).toBe(false); }); - /** Fix The plugin didn't set a resolve directory for the file - so esbuild did not search for "react18-loaders" on the file system */ + /** TODO: Fix The plugin didn't set a resolve directory for the file - so esbuild did not search for "react18-loaders" on the file system */ test.todo("Test plugin with ignorePatterns with content pattern", async ({ expect }) => { const { buildDir, ...optinos } = await createEsBUildOptions("ignore-patterns-1", { ignorePatterns: [{ pathPattern: /global-loader/, contentPatterns: [/ignore-me/] }], @@ -107,6 +107,15 @@ describe.concurrent("Test PlugInOptions", () => { ); }); + test("Test plugin with ignorePatterns with content pattern", async ({ expect }) => { + const { buildDir, ...optinos } = await createEsBUildOptions("ignore-patterns-1", { + ignorePatterns: [{ pathPattern: /dummy/, contentPatterns: [/ignore-me/] }], + }); + await esbuild.build(optinos); + expect(fs.existsSync(path.resolve(buildDir, "client", "dummy"))).toBe(true); + expect(fs.existsSync(path.resolve(buildDir, "client", "dummy", "ignore.ts"))).toBe(false); + }); + test('Test sourceReplacePatterns: defaultBgColor should be "#3c3c3c"', async ({ expect }) => { const { buildDir, ...options } = await createEsBUildOptions("source-replace-patterns", { sourceReplacePatterns: [ diff --git a/packages/shared/src/client/dummy/igrore.ts b/packages/shared/src/client/dummy/igrore.ts new file mode 100644 index 00000000..4de6cb54 --- /dev/null +++ b/packages/shared/src/client/dummy/igrore.ts @@ -0,0 +1,3 @@ +// ignore-me + +/** I am here just to test the ignore content patterns */ From a5a5b6503e3fe531538859b98f5753560d428bdd Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 17:08:06 +0530 Subject: [PATCH 20/24] Fix test workflow --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index 77a908bd..fa16f8eb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -17,7 +17,7 @@ jobs: - run: npm i -g pnpm@9.0.5 && pnpm i name: Install dependencies - name: Run unit tests - run: pnpm test + run: pnpm build --filter @repo/shared && pnpm test - name: Upload coverage reports to Codecov continue-on-error: true uses: codecov/codecov-action@v4 From 6d0a3b33049995bc051b02b969be7fd78330e20e Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 17:32:40 +0530 Subject: [PATCH 21/24] Update lock file --- pnpm-lock.yaml | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 97059579..d456f548 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -262,6 +262,9 @@ importers: lib: dependencies: + '@types/react': + specifier: 16.8 - 19 + version: 18.3.1 next: specifier: 10 - 14 version: 14.2.3(@babel/core@7.24.5)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(sass@1.77.0) @@ -278,12 +281,6 @@ importers: '@types/node': specifier: ^20.12.10 version: 20.12.10 - '@types/react': - specifier: ^18.3.1 - version: 18.3.1 - '@types/react-dom': - specifier: ^18.3.0 - version: 18.3.0 '@vitest/coverage-v8': specifier: ^1.6.0 version: 1.6.0(vitest@1.6.0(@types/node@20.12.10)(jsdom@24.0.0)(sass@1.77.0)) From 047155b6c0c4e4fcd366e56dc68912a0fceaf9f4 Mon Sep 17 00:00:00 2001 From: "deepsource-autofix[bot]" <62050782+deepsource-autofix[bot]@users.noreply.github.com> Date: Wed, 8 May 2024 12:03:04 +0000 Subject: [PATCH 22/24] style: format code with Prettier This commit fixes the style issues introduced in 6d0a3b3 according to the output from Prettier. Details: https://github.com/react18-tools/esbuild-plugin-react18/pull/20 --- TODO.md | 2 +- lib/README.md | 2 -- packages/shared/src/client/dummy/dummy.test.tsx | 12 ++++++------ 3 files changed, 7 insertions(+), 9 deletions(-) diff --git a/TODO.md b/TODO.md index 78518a55..c1caccb9 100644 --- a/TODO.md +++ b/TODO.md @@ -16,7 +16,7 @@ - [ ] 🌟 Enable [private vulnerability reporting](https://github.com/react18-tools/esbuild-plugin-react18/security) - [ ] Set up `CodeCov` - Visit Codecov and set up your repo - - Create [repository secret]((https://github.com/react18-tools/esbuild-plugin-react18/settings/secrets/actions)) for `CODECOV_TOKEN` + - Create [repository secret](<(https://github.com/react18-tools/esbuild-plugin-react18/settings/secrets/actions)>) for `CODECOV_TOKEN` - [ ] Set up `CodeClimate` - Visit CodeClimate and set up your repo - Create [repository secret] for `CC_TEST_REPORTER_ID` diff --git a/lib/README.md b/lib/README.md index a1496c93..c58acb5f 100644 --- a/lib/README.md +++ b/lib/README.md @@ -103,8 +103,6 @@ export default MyComponent() { This library is licensed under the MPL-2.0 open-source license. - - > Please consider enrolling in [our courses](https://mayank-chaudhari.vercel.app/courses) or [sponsoring](https://github.com/sponsors/mayank1513) our work.
diff --git a/packages/shared/src/client/dummy/dummy.test.tsx b/packages/shared/src/client/dummy/dummy.test.tsx index dd13a6c8..f86a431b 100644 --- a/packages/shared/src/client/dummy/dummy.test.tsx +++ b/packages/shared/src/client/dummy/dummy.test.tsx @@ -3,11 +3,11 @@ import { afterEach, describe, test } from "vitest"; import { Dummy } from "./dummy"; describe.concurrent("dummy", () => { - afterEach(cleanup); + afterEach(cleanup); - test("Dummy test - test if renders without errors", ({ expect }) => { - const clx = "my-class"; - render(); - expect(screen.getByTestId("dummy").classList).toContain(clx); - }); + test("Dummy test - test if renders without errors", ({ expect }) => { + const clx = "my-class"; + render(); + expect(screen.getByTestId("dummy").classList).toContain(clx); + }); }); From 871763eeecf93b550bd71dbc1fe4967b04af757d Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 17:36:59 +0530 Subject: [PATCH 23/24] Fix deepsource issues --- lib/__tests__/index.test.ts | 2 +- lib/src/index.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/__tests__/index.test.ts b/lib/__tests__/index.test.ts index 5d59be6f..c482e0a7 100644 --- a/lib/__tests__/index.test.ts +++ b/lib/__tests__/index.test.ts @@ -1,7 +1,7 @@ import fs from "node:fs"; import path from "node:path"; import { describe, test, beforeAll } from "vitest"; -import esbuild, { build } from "esbuild"; +import esbuild from "esbuild"; import react18Plugin, { React18PluginOptions } from "../src"; import glob from "tiny-glob"; import cssPlugin from "esbuild-plugin-react18-css"; diff --git a/lib/src/index.ts b/lib/src/index.ts index f2cb47b6..0d635d4e 100644 --- a/lib/src/index.ts +++ b/lib/src/index.ts @@ -105,7 +105,7 @@ function replaceSource(sourceReplacePattern: ReplacePattern, build: PluginBuild) if (sourceReplacePattern.replaceParams.length === 0) return; /** Add namespace file to avoid conflict with ignored files */ build.onLoad({ filter: sourceReplacePattern.pathPattern, namespace: "file" }, args => { - let text = fs.readFileSync(args.path, "utf8"); + const text = fs.readFileSync(args.path, "utf8"); /** todo: test if loader is a valid OnLoadResult.loader * If it is not a valid loader error will be thrown */ From 13322782e6073d9859ff5f1dfcfd0a682c8608fc Mon Sep 17 00:00:00 2001 From: Mayank Kumar Chaudhari Date: Wed, 8 May 2024 17:46:13 +0530 Subject: [PATCH 24/24] Fix some of the deepsource --- examples/vite/src/app/index.tsx | 5 +++-- .../shared/src/client/drawer-button/drawer-button.test.tsx | 3 ++- packages/shared/src/client/drawer-button/drawer-button.tsx | 5 +++-- packages/shared/src/client/dummy/dummy.tsx | 6 ++++-- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/examples/vite/src/app/index.tsx b/examples/vite/src/app/index.tsx index 1fb247d5..8d956166 100644 --- a/examples/vite/src/app/index.tsx +++ b/examples/vite/src/app/index.tsx @@ -1,4 +1,4 @@ -import React from "react"; +import React, { useCallback } from "react"; import "./styles.css"; import { Bars1, Bars2, Dots1, Dots2 } from "react18-loaders/dist/server"; import { LoaderContainer, useLoader } from "react18-loaders"; @@ -6,6 +6,7 @@ import { LoaderContainer, useLoader } from "react18-loaders"; /** Vite App */ function App(): JSX.Element { const { setLoading } = useLoader(); + const handleClick = useCallback(() => setLoading(true), []); return (

@@ -16,7 +17,7 @@ function App(): JSX.Element { - + diff --git a/packages/shared/src/client/drawer-button/drawer-button.test.tsx b/packages/shared/src/client/drawer-button/drawer-button.test.tsx index 7f9424cf..d092c89d 100644 --- a/packages/shared/src/client/drawer-button/drawer-button.test.tsx +++ b/packages/shared/src/client/drawer-button/drawer-button.test.tsx @@ -5,7 +5,8 @@ import { DrawerButton } from "./drawer-button"; describe.concurrent("drawer-button", () => { afterEach(cleanup); + const dummyFunc = () => {}; test("check if h1 heading exists", () => { - render( {}} />); + render(); }); }); diff --git a/packages/shared/src/client/drawer-button/drawer-button.tsx b/packages/shared/src/client/drawer-button/drawer-button.tsx index 8e02d559..cc8c42e4 100644 --- a/packages/shared/src/client/drawer-button/drawer-button.tsx +++ b/packages/shared/src/client/drawer-button/drawer-button.tsx @@ -1,5 +1,5 @@ "use client"; -import { Dispatch, SetStateAction } from "react"; +import { Dispatch, SetStateAction, useCallback } from "react"; import styles from "./drawer-button.module.scss"; interface DrawerButtonProps { @@ -12,10 +12,11 @@ interface DrawerButtonProps { * Drawer button to toggle side navigation on mobile devices. */ export function DrawerButton({ open, setOpen }: DrawerButtonProps) { + const handleClick = useCallback(() => setOpen(open => !open), []); return (