diff --git a/.changeset/config.json b/.changeset/config.json
new file mode 100644
index 0000000..7b9b8b1
--- /dev/null
+++ b/.changeset/config.json
@@ -0,0 +1,7 @@
+{
+ "$schema": "https://unpkg.com/@changesets/config@2.3.1/schema.json",
+ "commit": false,
+ "changelog": false,
+ "access": "public",
+ "baseBranch": "main"
+}
diff --git a/.commitlintrc.ts b/.commitlintrc.ts
new file mode 100644
index 0000000..b446373
--- /dev/null
+++ b/.commitlintrc.ts
@@ -0,0 +1,26 @@
+import type { UserConfig } from '@commitlint/types';
+import { RuleConfigSeverity } from '@commitlint/types';
+
+const config: UserConfig = {
+ extends: ['@commitlint/config-conventional'],
+ rules: {
+ 'type-enum': [
+ RuleConfigSeverity.Error,
+ 'always',
+ [
+ 'chore',
+ 'ci',
+ 'docs',
+ 'enhancement',
+ 'feat',
+ 'fix',
+ 'release',
+ 'revert',
+ 'security',
+ 'test',
+ ],
+ ],
+ },
+};
+
+export default config;
diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..473e451
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,16 @@
+root = true
+
+[*]
+indent_style = space
+indent_size = 2
+end_of_line = lf
+charset = utf-8
+trim_trailing_whitespace = true
+insert_final_newline = true
+
+[{package.json,*.yml}]
+indent_style = space
+indent_size = 2
+
+[*.md]
+trim_trailing_whitespace = false
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 0000000..f190a54
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,3 @@
+bin
+coverage
+dist
diff --git a/.eslintrc.js b/.eslintrc.js
new file mode 100644
index 0000000..ce9a17c
--- /dev/null
+++ b/.eslintrc.js
@@ -0,0 +1,58 @@
+module.exports = {
+ root: true,
+ extends: ['@strapi/eslint-config/back/typescript'],
+ parser: '@typescript-eslint/parser',
+ plugins: ['@typescript-eslint', 'eslint-plugin-rxjs'],
+ parserOptions: {
+ project: ['./tsconfig.eslint.json'],
+ },
+ overrides: [
+ {
+ files: ['./scripts/**/*', './src/cli/errors.ts', './src/cli/index.ts'],
+ rules: {
+ 'no-console': ['error', { allow: ['error'] }],
+ },
+ },
+ {
+ files: ['./src/node/core/logger.ts'],
+ rules: {
+ 'no-console': 'off',
+ },
+ },
+ ],
+ rules: {
+ 'rxjs/finnish': 'error',
+ // TODO: The following rules from @strapi/eslint-config/back/typescript are disabled because they're causing problems we need to solve or fix
+ // to be solved in configuration
+ 'node/no-unsupported-features/es-syntax': 'off',
+ 'import/prefer-default-export': 'off',
+ 'import/namespace': 'off',
+ 'node/no-missing-import': 'off',
+ 'no-process-exit': 'off',
+ 'import/no-dynamic-require': 'off',
+ 'global-require': 'off',
+ 'no-underscore-dangle': 'off',
+ '@typescript-eslint/no-use-before-define': 'off',
+ '@typescript-eslint/no-explicit-any': 'off',
+ /**
+ * Force us to use the Logger instance.
+ */
+ 'no-console': 'error',
+ 'import/extensions': 'off',
+ 'import/order': [
+ 'error',
+ {
+ groups: [
+ ['external', 'internal', 'builtin'],
+ 'parent',
+ ['sibling', 'index'],
+ 'object',
+ 'type',
+ ],
+ 'newlines-between': 'always',
+ alphabetize: { order: 'asc', caseInsensitive: true },
+ },
+ ],
+ 'nonblock-statement-body-position': ['error', 'below'],
+ },
+};
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 0000000..dfe0770
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1,2 @@
+# Auto detect text files and perform LF normalization
+* text=auto
diff --git a/.github/ISSUE_TEMPLATE/BUG_REPORT.yml b/.github/ISSUE_TEMPLATE/BUG_REPORT.yml
new file mode 100644
index 0000000..1801576
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/BUG_REPORT.yml
@@ -0,0 +1,38 @@
+name: π Bug Report
+description: Create a report to help us improve this repo.
+title: '[bug]: '
+labels: ['issue: bug']
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thank you for filing a bug report!
+ - type: textarea
+ attributes:
+ label: What version of `@strapi/blocks-react-renderer` are you using?
+ placeholder: |
+ - Npm version
+ - Node.js version
+ - React version:
+ - `@strapi/blocks-react-renderer` version
+ - Browser
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: "What's Wrong?"
+ description: A concise description of what you expected to happen (please provide screenshots).
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: To Reproduce
+ description: Steps to reproduce the behavior
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Expected Behaviour
+ description: What you expected to happen
+ validations:
+ required: true
diff --git a/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml
new file mode 100644
index 0000000..cf4bfbb
--- /dev/null
+++ b/.github/ISSUE_TEMPLATE/FEATURE_REQUEST.yml
@@ -0,0 +1,22 @@
+name: π Feature Request
+description: Submit a request for a new feature
+title: '[feat]: '
+labels: ['issue: enhancement']
+body:
+ - type: markdown
+ attributes:
+ value: |
+ Thank you for contributing a feature request!
+ - type: textarea
+ attributes:
+ label: A clear and concise description of what the feature is
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Why should this feature be included?
+ validations:
+ required: true
+ - type: textarea
+ attributes:
+ label: Please provide an example for how this would work
diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md
new file mode 100644
index 0000000..f940ac9
--- /dev/null
+++ b/.github/PULL_REQUEST_TEMPLATE.md
@@ -0,0 +1,15 @@
+### What does it do?
+
+Describe the technical changes you did.
+
+### Why is it needed?
+
+Describe the issue you are solving.
+
+### How to test it?
+
+Provide information about the environment and the path to verify the behaviour.
+
+### Related issue(s)/PR(s)
+
+Let us know if this is related to any issue/pull request
diff --git a/.github/workflows/issues_dailyCron.yml b/.github/workflows/issues_dailyCron.yml
new file mode 100644
index 0000000..536b8bf
--- /dev/null
+++ b/.github/workflows/issues_dailyCron.yml
@@ -0,0 +1,30 @@
+name: 'Daily Cron - 00:00'
+
+on:
+ schedule:
+ - cron: '0 0 * * *'
+
+permissions:
+ issues: write
+ statuses: read
+
+jobs:
+ cron-tasks:
+ runs-on: ubuntu-latest
+ steps:
+ - name: check for inactive issues that can't be reproduced
+ uses: actions-cool/issues-helper@v3
+ with:
+ actions: 'close-issues'
+ token: ${{ secrets.GITHUB_TOKEN }}
+ labels: 'status: can not reproduce'
+ inactive-day: 14
+ close-reason: 'completed'
+ body: |
+ Hello!
+
+ As we have not received any new or updated information to reproduce this issue in the last 14 days we are marking this issue as closed. Should you have new information please feel free to respond and we will consider reopening it.
+
+ If anyone else have updated information for this issue, please open up a new bug report and simply reference this closed bug report so that we can get any new information you may have. If you have questions please refer to the [contributor's guide](https://github.com/strapi/strapi/blob/main/CONTRIBUTING.md#reporting-an-issue) on opening issues.
+
+ Thank you and have a great day!
diff --git a/.github/workflows/issues_handleLabel.yml b/.github/workflows/issues_handleLabel.yml
new file mode 100644
index 0000000..0b02416
--- /dev/null
+++ b/.github/workflows/issues_handleLabel.yml
@@ -0,0 +1,96 @@
+name: Issue Labeled
+
+on:
+ issues:
+ types: [labeled]
+
+permissions:
+ issues: write
+ pull-requests: write
+ actions: read
+ checks: read
+ contents: read
+ repository-projects: read
+ statuses: read
+
+jobs:
+ issue-labeled:
+ runs-on: ubuntu-latest
+ steps:
+ # Unable to Reproduce Tasks
+ - name: 'Comment: unable to reproduce'
+ if: "${{ github.event.label.name == 'status: can not reproduce' }}"
+ uses: actions-cool/issues-helper@v3
+ with:
+ actions: 'create-comment'
+ token: ${{ secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ body: |
+ > This is a templated message
+
+ Hello @${{ github.event.issue.user.login }},
+
+ Thank you for reporting this bug, however we are unable to reproduce the issue you described given the information we have on hand. Can you please create a fresh project that you are able to reproduce the issue in, provide clear steps to reproduce this issue, and either upload this fresh project to a new GitHub repo or compress it into a `.zip` and upload it on this issue?
+
+ We would greatly appreciate your assistance with this, by working in a fresh project it will cut out any possible variables that might be unrelated.
+ Please note that issues labeled with `status: can not reproduce` will be closed in 14 days if there is no activity.
+
+ Thank you!
+
+ # Invalid bug report template actions
+ - name: 'Comment: invalid bug report template'
+ if: "${{ github.event.label.name == 'flag: invalid template' }}"
+ uses: actions-cool/issues-helper@v3
+ with:
+ actions: 'create-comment'
+ token: ${{ secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ body: |
+ > This is a templated message
+
+ Hello @${{ github.event.issue.user.login }},
+
+ We ask that you please follow the [issue template](https://raw.githubusercontent.com/strapi/strapi/master/.github/ISSUE_TEMPLATE/BUG_REPORT.md).
+ A proper issue submission let's us better understand the origin of your bug and therefore help you. We will reopen your issue when we receive the issue following the template guidelines and properly fill out the template. You can see the template guidelines for bug reports [here](https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md#reporting-an-issue).
+
+ Please update the issue with the template and we can reopen this report.
+
+ Thank you.
+ - name: 'Close: invalid bug report template'
+ if: "${{ github.event.label.name == 'flag: invalid template' }}"
+ uses: actions-cool/issues-helper@v3
+ with:
+ actions: 'close-issue'
+ token: ${{ secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ close-reason: 'not_planned'
+
+ # Redirect questions to community sources
+ - name: 'Comment: redirect question to community'
+ if: "${{ github.event.label.name == 'flag: question' }}"
+ uses: actions-cool/issues-helper@v3
+ with:
+ actions: 'create-comment'
+ token: ${{ secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ body: |
+ > This is a templated message
+
+ Hello @${{ github.event.issue.user.login }},
+
+ I see you are wanting to ask a question that is not really a bug report,
+
+ - questions should be directed to [our forum](https://forum.strapi.io) or our [Discord](https://discord.strapi.io)
+ - feature requests should be directed to our [feedback and feature request database](https://feedback.strapi.io)
+
+ Please see the following contributing guidelines for asking a question [here](https://github.com/strapi/strapi/blob/master/CONTRIBUTING.md#reporting-an-issue).
+
+ Thank you.
+ - name: 'Close: redirect question to community'
+ if: "${{ github.event.label.name == 'flag: question' }}"
+ uses: actions-cool/issues-helper@v3
+ with:
+ actions: 'close-issue'
+ token: ${{ secrets.GITHUB_TOKEN }}
+ issue-number: ${{ github.event.issue.number }}
+ close-reason: 'complete'
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 0000000..c53135c
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,33 @@
+name: Release
+
+on:
+ push:
+ branches:
+ - main
+
+concurrency: ${{ github.workflow }}-${{ github.ref }}
+
+jobs:
+ release:
+ name: Release
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v3
+ - uses: actions/setup-node@v4
+ with:
+ cache: pnpm
+ node-version: lts/*
+ - run: corepack enable && pnpm --version
+ - run: pnpm install
+ - run: pnpm build
+
+ - name: Create Release Pull Request or Publish to npm
+ id: changesets
+ uses: changesets/action@v1
+ with:
+ version: pnpm version
+ publish: pnpm release
+ env:
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
+ NPM_TOKEN: ${{ secrets.NPM_TOKEN }}
diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
new file mode 100644
index 0000000..0f22867
--- /dev/null
+++ b/.github/workflows/tests.yml
@@ -0,0 +1,60 @@
+name: 'Tests'
+
+on:
+ push:
+ branches:
+ - main
+ pull_request: {}
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref_name }}
+ cancel-in-progress: true
+
+jobs:
+ lint-build:
+ name: 'lint & build'
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v3
+ - uses: actions/setup-node@v4
+ with:
+ cache: pnpm
+ node-version: lts/*
+ - run: corepack enable && pnpm --version
+ - run: pnpm install
+ - run: pnpm lint
+ - run: pnpm prettier:check
+ - run: pnpm test:ts
+ - run: pnpm build
+ - uses: actions/upload-artifact@v3
+ name: Cache build output
+ with:
+ name: build-output
+ path: |
+ bin/
+ dist/
+
+ test-unit:
+ needs: 'lint-build'
+ name: 'test:unit (${{ matrix.node }})'
+ runs-on: ubuntu-latest
+ strategy:
+ # A test failing on windows doesn't mean it'll fail on macos. It's useful to let all tests run to its completion to get the full picture
+ fail-fast: false
+ matrix:
+ node: [18, 20, lts/*]
+ steps:
+ - uses: actions/checkout@v4
+ - uses: pnpm/action-setup@v3
+ - uses: actions/setup-node@v4
+ with:
+ cache: pnpm
+ node-version: ${{ matrix.node }}
+ - run: corepack enable && pnpm --version
+ - run: pnpm install
+ - uses: actions/download-artifact@v3
+ name: Restore build output
+ with:
+ name: build-output
+ - run: pnpm test:unit
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..232ccd4
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,95 @@
+############################
+# OS X
+############################
+
+.DS_Store
+.AppleDouble
+.LSOverride
+Icon
+.Spotlight-V100
+.Trashes
+._*
+
+############################
+# Linux
+############################
+
+*~
+
+############################
+# Windows
+############################
+
+Thumbs.db
+ehthumbs.db
+Desktop.ini
+$RECYCLE.BIN/
+*.cab
+*.msi
+*.msm
+*.msp
+
+############################
+# Packages
+############################
+
+*.7z
+*.csv
+*.dat
+*.dmg
+*.gz
+*.iso
+*.jar
+*.rar
+*.tar
+*.zip
+*.com
+*.class
+*.dll
+*.exe
+*.o
+*.seed
+*.so
+*.swo
+*.swp
+*.swn
+*.swm
+*.out
+*.pid
+
+############################
+# Logs and databases
+############################
+
+.tmp
+*.log
+*.sql
+*.sqlite
+
+############################
+# Misc.
+############################
+
+*#
+.idea
+nbproject
+
+############################
+# Node.js
+############################
+
+lib-cov
+lcov.info
+pids
+logs
+results
+dist
+node_modules
+.node_history
+package-lock.json
+
+############################
+# Tests
+############################
+
+__tmp__/
diff --git a/.husky/commit-msg b/.husky/commit-msg
new file mode 100755
index 0000000..11c4e57
--- /dev/null
+++ b/.husky/commit-msg
@@ -0,0 +1,4 @@
+#!/bin/sh
+. "$(dirname "$0")/_/husky.sh"
+
+npx --no-install -- commitlint --edit ${1}
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100755
index 0000000..72c4429
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1 @@
+npm test
diff --git a/.lintstagedrc b/.lintstagedrc
new file mode 100644
index 0000000..736634b
--- /dev/null
+++ b/.lintstagedrc
@@ -0,0 +1,4 @@
+{
+ "*.{ts,tsx}": ["pnpm test:ts"],
+ "*": ["pnpm prettier:write", "pnpm lint"]
+}
diff --git a/.prettierignore b/.prettierignore
new file mode 100644
index 0000000..e143195
--- /dev/null
+++ b/.prettierignore
@@ -0,0 +1,3 @@
+bin
+dist
+pnpm-lock.yaml
\ No newline at end of file
diff --git a/.prettierrc.js b/.prettierrc.js
new file mode 100644
index 0000000..1613e2a
--- /dev/null
+++ b/.prettierrc.js
@@ -0,0 +1,9 @@
+module.exports = {
+ endOfLine: 'lf',
+ semi: true,
+ singleQuote: true,
+ tabWidth: 2,
+ trailingComma: 'es5',
+ printWidth: 100,
+ arrowParens: 'always',
+};
diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md
new file mode 100644
index 0000000..93d89c6
--- /dev/null
+++ b/CODE_OF_CONDUCT.md
@@ -0,0 +1,5 @@
+# Code of Conduct
+
+This project and everyone participating in it are governed by the [Strapi Code of Conduct](https://github.com/strapi/strapi/blob/master/CODE_OF_CONDUCT.md).
+By participating, you are expected to uphold this code. Please read the [full text](https://github.com/strapi/strapi/blob/master/CODE_OF_CONDUCT.md)
+so that you can read which actions may or may not be tolerated.
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..cbf83de
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,22 @@
+Copyright (c) 2015-present Strapi Solutions SAS
+
+Portions of the Strapi software are licensed as follows:
+
+- All software that resides under an "ee/" directory (the βEE Softwareβ), if that directory exists, is licensed under the license defined in "ee/LICENSE".
+
+- All software outside of the above-mentioned directories or restrictions above is available under the "MIT Expat" license as set forth below.
+
+MIT Expat License
+
+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
new file mode 100644
index 0000000..00d07ca
--- /dev/null
+++ b/README.md
@@ -0,0 +1,159 @@
+
pack-up
+Your daily lunchbox of bundling tools
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+pack-up is a set of simple tools for creating interoperable CJS & ESM packages.
+
+Setting up a new interoperable project is as easy as doing:
+
+```sh
+npx @strapi/pack-up@latest init my-package
+
+cd my-package
+
+npm run build
+```
+
+Just a small bit about us:
+
+- **Vite**: We support `vite` as a JS bundler, no need to install it though as it's preprepared with helpful defaults ready to tackle all projects.
+- **Concise**: It's all based off your `package.json` so you know the interoperable aspect is correctly set up and there's no requirement for another config!
+- **Flexible**: Need more customisation or to bundle a package not declared in your exports? Use the config file to dictate separate bundles & options.
+
+## Getting Started
+
+If you're setting up a brand new package we recommend you use the `init` command to get started:
+
+```sh
+npx @strapi/pack-up@latest init my-package
+```
+
+But if you're adding this to an existing project then just install like every other dependency:
+
+```sh
+npm install @strapi/pack-up@latest --save-dev
+```
+
+And to help you ensure your package is set up correctly run the `check` command:
+
+```sh
+npm run pack-up check
+```
+
+Run `pack-up -h` for more information on CLI usage.
+
+## Commands
+
+### `init [path]`
+
+Creates a new package at the given path, by default uses the inbuilt template sensible options for your package to choose from.
+
+- `--template [path]` β path to a custom template of type `TemplateOrTemplateResolver`.
+
+### `build`
+
+Builds your current package based on the configuration in your `package.json` and `packup.config.ts` (if applicable).
+
+- `--minify` β minifies the output (default `false`).
+- `--sourcemap` β generates sourcemaps for the output (default `true`).
+
+### `check`
+
+Checks your current package to ensure it's interoperable in the real world. In short, validates the files in your dist have been produced as we expect & then `esbuild` can actually build, using your exported code.
+
+### `watch`
+
+Watches your current package for changes and rebuilds when necessary.
+
+## Configuration
+
+`@strapi/pack-up` by default reads its configuration from your `package.json`. But sometimes you need more flexibility, to do this you can create a `packup.config.ts` file in the root of your package.
+
+```ts
+// packup.config.ts
+import { defineConfig } from '@strapi/pack-up';
+
+export default defineConfig({
+ minify: true,
+ sourcemap: false,
+ externals: ['path', 'fs'],
+});
+```
+
+### Options
+
+#### `bundles`
+
+- Type: `ConfigBundle[]`
+
+An array of entry points to bundle. This is useful if you want to bundle something that should not
+be exported by the package, e.g. CLI scripts or Node.js workers.
+
+#### `dist`
+
+- Type: `string`
+
+The path to the directory to which the bundled files should be written.
+
+#### `exports`
+
+- Type: `Record`
+
+Overwrite or amend the parsed exports from your `package.json`.
+
+#### `externals`
+
+- Type: `string[]`
+
+An array of modules that should not be bundled but instead be resolved at runtime, this is by default the dependencies listed in your `package.json` (excluding devDeps).
+
+#### `minify`
+
+- Type: `boolean`
+
+Whether to minify the output or not.
+
+#### `plugins`
+
+- Type: `PluginOption[] | (({ runtime }: { runtime: Runtime }) => PluginOption[]);`
+
+An array of Vite plugins to use when bundling, or optionally a function that returns an array of plugins based on the runtime.
+
+#### `preserveModules`
+
+- Type: `boolean`
+
+Instead of creating as few chunks as possible, this mode will create separate chunks for all modules using the original module names as file names.
+
+#### `sourcemap`
+
+- Type: `boolean`
+
+Whether to generate sourcemaps for the output or not.
+
+#### `runtime`
+
+- Type: `Runtime`
+
+The transpilation target of the bundle. This is useful if you're bundling many different CLIs or Node.js workers and you want them to be transpiled for the node environment.
+
+#### `tsconfig`
+
+- Type: `string`
+
+Path to the tsconfig file to use for the bundle, defaults to `tsconfig.build.json`.
diff --git a/bin/pack-up.js b/bin/pack-up.js
new file mode 100755
index 0000000..e8ee9bf
--- /dev/null
+++ b/bin/pack-up.js
@@ -0,0 +1,2 @@
+#!/usr/bin/env node
+require('../dist/cli.js');
diff --git a/examples/cjs-js/package.json b/examples/cjs-js/package.json
new file mode 100644
index 0000000..17e06f8
--- /dev/null
+++ b/examples/cjs-js/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "cjs-js",
+ "version": "1.0.0",
+ "private": true,
+ "license": "MIT",
+ "type": "commonjs",
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "source": "./src/index.js",
+ "scripts": {
+ "build": "pack-up build && pack-up check"
+ },
+ "dependencies": {
+ "@strapi/pack-up": "file:../../../"
+ }
+}
diff --git a/examples/cjs-js/src/index.js b/examples/cjs-js/src/index.js
new file mode 100644
index 0000000..059488a
--- /dev/null
+++ b/examples/cjs-js/src/index.js
@@ -0,0 +1 @@
+export const VERSION = '1.0.0';
diff --git a/examples/cjs-js/yarn.lock b/examples/cjs-js/yarn.lock
new file mode 100644
index 0000000..e69de29
diff --git a/examples/esm-js/package.json b/examples/esm-js/package.json
new file mode 100644
index 0000000..790846b
--- /dev/null
+++ b/examples/esm-js/package.json
@@ -0,0 +1,16 @@
+{
+ "name": "esm-js",
+ "version": "1.0.0",
+ "private": true,
+ "license": "MIT",
+ "type": "module",
+ "main": "./dist/index.cjs",
+ "module": "./dist/index.js",
+ "source": "./src/index.js",
+ "scripts": {
+ "build": "pack-up build && pack-up check"
+ },
+ "dependencies": {
+ "@strapi/pack-up": "file:../../../"
+ }
+}
diff --git a/examples/esm-js/src/index.js b/examples/esm-js/src/index.js
new file mode 100644
index 0000000..059488a
--- /dev/null
+++ b/examples/esm-js/src/index.js
@@ -0,0 +1 @@
+export const VERSION = '1.0.0';
diff --git a/examples/esm-js/yarn.lock b/examples/esm-js/yarn.lock
new file mode 100644
index 0000000..e69de29
diff --git a/jest.config.mjs b/jest.config.mjs
new file mode 100644
index 0000000..860c785
--- /dev/null
+++ b/jest.config.mjs
@@ -0,0 +1,12 @@
+/**
+ * @type {import('jest').Config}
+ */
+export default {
+ modulePathIgnorePatterns: ['dist'],
+ testMatch: ['**/__tests__/**/*.{js,ts}'],
+ transform: {
+ '^.+\\.(t|j)sx?$': ['@swc/jest'],
+ },
+ displayName: 'Pack up',
+ collectCoverageFrom: ['src/**/*.ts'],
+};
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..e6db667
--- /dev/null
+++ b/package.json
@@ -0,0 +1,115 @@
+{
+ "name": "@strapi/pack-up",
+ "version": "5.0.0-beta.2",
+ "description": "Simple tools for creating interoperable CJS & ESM packages.",
+ "keywords": [
+ "strapi",
+ "package",
+ "cjs",
+ "esm",
+ "bundling",
+ "build",
+ "interoperable",
+ "tools"
+ ],
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/strapi/pack-up.git"
+ },
+ "license": "SEE LICENSE IN LICENSE",
+ "author": {
+ "name": "Strapi Solutions SAS",
+ "email": "hi@strapi.io",
+ "url": "https://strapi.io"
+ },
+ "maintainers": [
+ {
+ "name": "Strapi Solutions SAS",
+ "email": "hi@strapi.io",
+ "url": "https://strapi.io"
+ }
+ ],
+ "exports": {
+ ".": {
+ "types": "./dist/index.d.ts",
+ "source": "./src/index.ts",
+ "import": "./dist/index.mjs",
+ "require": "./dist/index.js",
+ "default": "./dist/index.js"
+ },
+ "./package.json": "./package.json"
+ },
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "source": "./src/index.ts",
+ "types": "./dist/index.d.ts",
+ "bin": "./bin/pack-up.js",
+ "files": [
+ "bin",
+ "dist"
+ ],
+ "scripts": {
+ "build": "node -r esbuild-register scripts/build",
+ "check": "node -r esbuild-register scripts/check",
+ "lint": "eslint .",
+ "prepare": "husky",
+ "prerelease:enter": "changeset pre enter",
+ "prerelease:exit": "changeset pre exit",
+ "prettier:check": "prettier --check .",
+ "prettier:write": "prettier --write .",
+ "release:add": "changeset add",
+ "release:publish": "changeset publish",
+ "release:version": "changeset version",
+ "test:ts": "tsc --noEmit",
+ "test:unit": "node --experimental-vm-modules node_modules/jest/bin/jest.js",
+ "watch": "node -r esbuild-register scripts/watch"
+ },
+ "dependencies": {
+ "@vitejs/plugin-react-swc": "3.6.0",
+ "boxen": "5.1.2",
+ "browserslist-to-esbuild": "1.2.0",
+ "chalk": "4.1.2",
+ "chokidar": "3.6.0",
+ "commander": "8.3.0",
+ "esbuild": "0.20.2",
+ "esbuild-register": "3.5.0",
+ "get-latest-version": "5.1.0",
+ "git-url-parse": "13.1.1",
+ "ini": "4.1.2",
+ "ora": "5.4.1",
+ "outdent": "0.8.0",
+ "pkg-up": "3.1.0",
+ "prettier": "2.8.8",
+ "prettier-plugin-packagejson": "2.4.14",
+ "prompts": "2.4.2",
+ "rxjs": "7.8.1",
+ "typescript": "5.4.4",
+ "vite": "5.2.8",
+ "yup": "0.32.9"
+ },
+ "devDependencies": {
+ "@changesets/changelog-git": "^0.2.0",
+ "@changesets/cli": "^2.27.1",
+ "@commitlint/cli": "^19.2.1",
+ "@commitlint/config-conventional": "^19.1.0",
+ "@strapi/eslint-config": "^0.2.1",
+ "@strapi/pack-up": "5.0.0-beta.2",
+ "@swc/core": "^1.4.13",
+ "@swc/jest": "^0.2.36",
+ "@types/git-url-parse": "9.0.3",
+ "@types/ini": "4.1.0",
+ "@types/prompts": "2.4.9",
+ "@typescript-eslint/eslint-plugin": "^7.6.0",
+ "@typescript-eslint/parser": "^7.6.0",
+ "eslint": "^8.56.0",
+ "eslint-plugin-rxjs": "^5.0.3",
+ "husky": "^9.0.11",
+ "jest": "^29.7.0",
+ "lint-staged": "^15.2.2"
+ },
+ "packageManager": "pnpm@8.6.12",
+ "engines": {
+ "node": ">=18.0.0 <=20.x.x",
+ "npm": ">=6.0.0"
+ }
+}
diff --git a/packup.config.ts b/packup.config.ts
new file mode 100644
index 0000000..9fbcf65
--- /dev/null
+++ b/packup.config.ts
@@ -0,0 +1,17 @@
+/**
+ * Can this be imported from the package...?
+ */
+import { defineConfig } from './src';
+
+export default defineConfig({
+ bundles: [
+ {
+ source: './src/cli/index.ts',
+ require: './dist/cli.js',
+ },
+ ],
+ externals: ['node:module'],
+ runtime: 'node',
+ minify: false,
+ sourcemap: true,
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
new file mode 100644
index 0000000..732def5
--- /dev/null
+++ b/pnpm-lock.yaml
@@ -0,0 +1,7777 @@
+lockfileVersion: '6.0'
+
+settings:
+ autoInstallPeers: true
+ excludeLinksFromLockfile: false
+
+dependencies:
+ '@vitejs/plugin-react-swc':
+ specifier: 3.6.0
+ version: 3.6.0(vite@5.2.8)
+ boxen:
+ specifier: 5.1.2
+ version: 5.1.2
+ browserslist-to-esbuild:
+ specifier: 1.2.0
+ version: 1.2.0
+ chalk:
+ specifier: 4.1.2
+ version: 4.1.2
+ chokidar:
+ specifier: 3.6.0
+ version: 3.6.0
+ commander:
+ specifier: 8.3.0
+ version: 8.3.0
+ esbuild:
+ specifier: 0.20.2
+ version: 0.20.2
+ esbuild-register:
+ specifier: 3.5.0
+ version: 3.5.0(esbuild@0.20.2)
+ get-latest-version:
+ specifier: 5.1.0
+ version: 5.1.0
+ git-url-parse:
+ specifier: 13.1.1
+ version: 13.1.1
+ ini:
+ specifier: 4.1.2
+ version: 4.1.2
+ ora:
+ specifier: 5.4.1
+ version: 5.4.1
+ outdent:
+ specifier: 0.8.0
+ version: 0.8.0
+ pkg-up:
+ specifier: 3.1.0
+ version: 3.1.0
+ prettier:
+ specifier: 2.8.8
+ version: 2.8.8
+ prettier-plugin-packagejson:
+ specifier: 2.4.14
+ version: 2.4.14(prettier@2.8.8)
+ prompts:
+ specifier: 2.4.2
+ version: 2.4.2
+ rxjs:
+ specifier: 7.8.1
+ version: 7.8.1
+ typescript:
+ specifier: 5.4.4
+ version: 5.4.4
+ vite:
+ specifier: 5.2.8
+ version: 5.2.8(@types/node@20.12.6)
+ yup:
+ specifier: 0.32.9
+ version: 0.32.9
+
+devDependencies:
+ '@changesets/changelog-git':
+ specifier: ^0.2.0
+ version: 0.2.0
+ '@changesets/cli':
+ specifier: ^2.27.1
+ version: 2.27.1
+ '@commitlint/cli':
+ specifier: ^19.2.1
+ version: 19.2.1(@types/node@20.12.6)(typescript@5.4.4)
+ '@commitlint/config-conventional':
+ specifier: ^19.1.0
+ version: 19.1.0
+ '@strapi/eslint-config':
+ specifier: ^0.2.1
+ version: 0.2.1(@babel/core@7.24.4)(prettier@2.8.8)(typescript@5.4.4)
+ '@strapi/pack-up':
+ specifier: 5.0.0-beta.2
+ version: 5.0.0-beta.2(@types/node@20.12.6)
+ '@swc/core':
+ specifier: ^1.4.13
+ version: 1.4.13
+ '@swc/jest':
+ specifier: ^0.2.36
+ version: 0.2.36(@swc/core@1.4.13)
+ '@types/git-url-parse':
+ specifier: 9.0.3
+ version: 9.0.3
+ '@types/ini':
+ specifier: 4.1.0
+ version: 4.1.0
+ '@types/prompts':
+ specifier: 2.4.9
+ version: 2.4.9
+ '@typescript-eslint/eslint-plugin':
+ specifier: ^7.6.0
+ version: 7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.56.0)(typescript@5.4.4)
+ '@typescript-eslint/parser':
+ specifier: ^7.6.0
+ version: 7.6.0(eslint@8.56.0)(typescript@5.4.4)
+ eslint:
+ specifier: ^8.56.0
+ version: 8.56.0
+ eslint-plugin-rxjs:
+ specifier: ^5.0.3
+ version: 5.0.3(eslint@8.56.0)(typescript@5.4.4)
+ husky:
+ specifier: ^9.0.11
+ version: 9.0.11
+ jest:
+ specifier: ^29.7.0
+ version: 29.7.0(@types/node@20.12.6)
+ lint-staged:
+ specifier: ^15.2.2
+ version: 15.2.2
+
+packages:
+
+ /@aashutoshrathi/word-wrap@1.2.6:
+ resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /@ampproject/remapping@2.3.0:
+ resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ dev: true
+
+ /@babel/code-frame@7.24.2:
+ resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/highlight': 7.24.2
+ picocolors: 1.0.0
+ dev: true
+
+ /@babel/compat-data@7.24.4:
+ resolution: {integrity: sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/core@7.24.4:
+ resolution: {integrity: sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@ampproject/remapping': 2.3.0
+ '@babel/code-frame': 7.24.2
+ '@babel/generator': 7.24.4
+ '@babel/helper-compilation-targets': 7.23.6
+ '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.4)
+ '@babel/helpers': 7.24.4
+ '@babel/parser': 7.24.4
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ 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
+ dev: true
+
+ /@babel/eslint-parser@7.24.1(@babel/core@7.24.4)(eslint@8.45.0):
+ resolution: {integrity: sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==}
+ engines: {node: ^10.13.0 || ^12.13.0 || >=14.0.0}
+ peerDependencies:
+ '@babel/core': ^7.11.0
+ eslint: ^7.5.0 || ^8.0.0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@nicolo-ribaudo/eslint-scope-5-internals': 5.1.1-v1
+ eslint: 8.45.0
+ eslint-visitor-keys: 2.1.0
+ semver: 6.3.1
+ dev: true
+
+ /@babel/generator@7.24.4:
+ resolution: {integrity: sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/trace-mapping': 0.3.25
+ jsesc: 2.5.2
+ dev: true
+
+ /@babel/helper-compilation-targets@7.23.6:
+ resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==}
+ engines: {node: '>=6.9.0'}
+ 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
+ dev: true
+
+ /@babel/helper-environment-visitor@7.22.20:
+ resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-function-name@7.23.0:
+ resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.24.0
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@babel/helper-hoist-variables@7.22.5:
+ resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@babel/helper-module-imports@7.24.3:
+ resolution: {integrity: sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.4):
+ resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-environment-visitor': 7.22.20
+ '@babel/helper-module-imports': 7.24.3
+ '@babel/helper-simple-access': 7.22.5
+ '@babel/helper-split-export-declaration': 7.22.6
+ '@babel/helper-validator-identifier': 7.22.20
+ dev: true
+
+ /@babel/helper-plugin-utils@7.24.0:
+ resolution: {integrity: sha512-9cUznXMG0+FxRuJfvL82QlTqIzhVW9sL0KjMPHhAOOvpQGL8QtdxnBKILjBqxlHyliz0yCa1G903ZXI/FuHy2w==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-simple-access@7.22.5:
+ resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@babel/helper-split-export-declaration@7.22.6:
+ resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@babel/helper-string-parser@7.24.1:
+ resolution: {integrity: sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-validator-identifier@7.22.20:
+ resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helper-validator-option@7.23.5:
+ resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /@babel/helpers@7.24.4:
+ resolution: {integrity: sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/template': 7.24.0
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/highlight@7.24.2:
+ resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-validator-identifier': 7.22.20
+ chalk: 2.4.2
+ js-tokens: 4.0.0
+ picocolors: 1.0.0
+ dev: true
+
+ /@babel/parser@7.24.4:
+ resolution: {integrity: sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==}
+ engines: {node: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.4):
+ resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.4):
+ resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.4):
+ resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.4):
+ resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.4):
+ resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-jsx@7.24.1(@babel/core@7.24.4):
+ resolution: {integrity: sha512-2eCtxZXf+kbkMIsXS4poTvT4Yu5rXiRa+9xGVT56raghjmBTKMpFNc9R4IDiB4emao9eO22Ox7CxuJG7BgExqA==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.4):
+ resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.4):
+ resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.4):
+ resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.4):
+ resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.4):
+ resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.4):
+ resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.4):
+ resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/plugin-syntax-typescript@7.24.1(@babel/core@7.24.4):
+ resolution: {integrity: sha512-Yhnmvy5HZEnHUty6i++gcfH1/l68AHnItFHnaCv6hn9dNh0hQvvQJsxpi4BMBFN5DLeHBuucT/0DgzXif/OyRw==}
+ engines: {node: '>=6.9.0'}
+ peerDependencies:
+ '@babel/core': ^7.0.0-0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/helper-plugin-utils': 7.24.0
+ dev: true
+
+ /@babel/runtime@7.24.4:
+ resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ regenerator-runtime: 0.14.1
+
+ /@babel/template@7.24.0:
+ resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/parser': 7.24.4
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@babel/traverse@7.24.1:
+ resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/generator': 7.24.4
+ '@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.22.6
+ '@babel/parser': 7.24.4
+ '@babel/types': 7.24.0
+ debug: 4.3.4
+ globals: 11.12.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@babel/types@7.24.0:
+ resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==}
+ engines: {node: '>=6.9.0'}
+ dependencies:
+ '@babel/helper-string-parser': 7.24.1
+ '@babel/helper-validator-identifier': 7.22.20
+ to-fast-properties: 2.0.0
+ dev: true
+
+ /@bcoe/v8-coverage@0.2.3:
+ resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==}
+ dev: true
+
+ /@changesets/apply-release-plan@7.0.0:
+ resolution: {integrity: sha512-vfi69JR416qC9hWmFGSxj7N6wA5J222XNBmezSVATPWDVPIF7gkd4d8CpbEbXmRWbVrkoli3oerGS6dcL/BGsQ==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@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.0
+ dev: true
+
+ /@changesets/assemble-release-plan@6.0.0:
+ resolution: {integrity: sha512-4QG7NuisAjisbW4hkLCmGW2lRYdPrKzro+fCtZaILX+3zdUELSvYjpL4GTv0E4aM9Mef3PuIQp89VmHJ4y2bfw==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@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.0
+ dev: true
+
+ /@changesets/changelog-git@0.2.0:
+ resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==}
+ dependencies:
+ '@changesets/types': 6.0.0
+ dev: true
+
+ /@changesets/cli@2.27.1:
+ resolution: {integrity: sha512-iJ91xlvRnnrJnELTp4eJJEOPjgpF3NOh4qeQehM6Ugiz9gJPRZ2t+TsXun6E3AMN4hScZKjqVXl0TX+C7AB3ZQ==}
+ hasBin: true
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@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.0
+ spawndamnit: 2.0.0
+ term-size: 2.2.1
+ tty-table: 4.2.3
+ dev: true
+
+ /@changesets/config@3.0.0:
+ resolution: {integrity: sha512-o/rwLNnAo/+j9Yvw9mkBQOZySDYyOr/q+wptRLcAVGlU6djOeP9v1nlalbL9MFsobuBVQbZCTp+dIzdq+CLQUA==}
+ 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
+ dev: true
+
+ /@changesets/errors@0.2.0:
+ resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==}
+ dependencies:
+ extendable-error: 0.1.7
+ dev: true
+
+ /@changesets/get-dependents-graph@2.0.0:
+ resolution: {integrity: sha512-cafUXponivK4vBgZ3yLu944mTvam06XEn2IZGjjKc0antpenkYANXiiE6GExV/yKdsCnE8dXVZ25yGqLYZmScA==}
+ dependencies:
+ '@changesets/types': 6.0.0
+ '@manypkg/get-packages': 1.1.3
+ chalk: 2.4.2
+ fs-extra: 7.0.1
+ semver: 7.6.0
+ dev: true
+
+ /@changesets/get-release-plan@4.0.0:
+ resolution: {integrity: sha512-9L9xCUeD/Tb6L/oKmpm8nyzsOzhdNBBbt/ZNcjynbHC07WW4E1eX8NMGC5g5SbM5z/V+MOrYsJ4lRW41GCbg3w==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@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
+ dev: true
+
+ /@changesets/get-version-range-type@0.4.0:
+ resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==}
+ dev: true
+
+ /@changesets/git@3.0.0:
+ resolution: {integrity: sha512-vvhnZDHe2eiBNRFHEgMiGd2CT+164dfYyrJDhwwxTVD/OW0FUD6G7+4DIx1dNwkwjHyzisxGAU96q0sVNBns0w==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@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
+ dev: true
+
+ /@changesets/logger@0.1.0:
+ resolution: {integrity: sha512-pBrJm4CQm9VqFVwWnSqKEfsS2ESnwqwH+xR7jETxIErZcfd1u2zBSqrHbRHR7xjhSgep9x2PSKFKY//FAshA3g==}
+ dependencies:
+ chalk: 2.4.2
+ dev: true
+
+ /@changesets/parse@0.4.0:
+ resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==}
+ dependencies:
+ '@changesets/types': 6.0.0
+ js-yaml: 3.14.1
+ dev: true
+
+ /@changesets/pre@2.0.0:
+ resolution: {integrity: sha512-HLTNYX/A4jZxc+Sq8D1AMBsv+1qD6rmmJtjsCJa/9MSRybdxh0mjbTvE6JYZQ/ZiQ0mMlDOlGPXTm9KLTU3jyw==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@changesets/errors': 0.2.0
+ '@changesets/types': 6.0.0
+ '@manypkg/get-packages': 1.1.3
+ fs-extra: 7.0.1
+ dev: true
+
+ /@changesets/read@0.6.0:
+ resolution: {integrity: sha512-ZypqX8+/im1Fm98K4YcZtmLKgjs1kDQ5zHpc2U1qdtNBmZZfo/IBiG162RoP0CUF05tvp2y4IspH11PLnPxuuw==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@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
+ dev: true
+
+ /@changesets/types@4.1.0:
+ resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==}
+ dev: true
+
+ /@changesets/types@6.0.0:
+ resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==}
+ dev: true
+
+ /@changesets/write@0.3.0:
+ resolution: {integrity: sha512-slGLb21fxZVUYbyea+94uFiD6ntQW0M2hIKNznFizDhZPDgn2c/fv1UzzlW43RVzh1BEDuIqW6hzlJ1OflNmcw==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@changesets/types': 6.0.0
+ fs-extra: 7.0.1
+ human-id: 1.0.2
+ prettier: 2.8.8
+ dev: true
+
+ /@commitlint/cli@19.2.1(@types/node@20.12.6)(typescript@5.4.4):
+ resolution: {integrity: sha512-cbkYUJsLqRomccNxvoJTyv5yn0bSy05BBizVyIcLACkRbVUqYorC351Diw/XFSWC/GtpwiwT2eOvQgFZa374bg==}
+ engines: {node: '>=v18'}
+ hasBin: true
+ dependencies:
+ '@commitlint/format': 19.0.3
+ '@commitlint/lint': 19.1.0
+ '@commitlint/load': 19.2.0(@types/node@20.12.6)(typescript@5.4.4)
+ '@commitlint/read': 19.2.1
+ '@commitlint/types': 19.0.3
+ execa: 8.0.1
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+ dev: true
+
+ /@commitlint/config-conventional@19.1.0:
+ resolution: {integrity: sha512-KIKD2xrp6Uuk+dcZVj3++MlzIr/Su6zLE8crEDQCZNvWHNQSeeGbzOlNtsR32TUy6H3JbP7nWgduAHCaiGQ6EA==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 19.0.3
+ conventional-changelog-conventionalcommits: 7.0.2
+ dev: true
+
+ /@commitlint/config-validator@19.0.3:
+ resolution: {integrity: sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 19.0.3
+ ajv: 8.12.0
+ dev: true
+
+ /@commitlint/ensure@19.0.3:
+ resolution: {integrity: sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 19.0.3
+ lodash.camelcase: 4.3.0
+ lodash.kebabcase: 4.1.1
+ lodash.snakecase: 4.1.1
+ lodash.startcase: 4.4.0
+ lodash.upperfirst: 4.3.1
+ dev: true
+
+ /@commitlint/execute-rule@19.0.0:
+ resolution: {integrity: sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==}
+ engines: {node: '>=v18'}
+ dev: true
+
+ /@commitlint/format@19.0.3:
+ resolution: {integrity: sha512-QjjyGyoiVWzx1f5xOteKHNLFyhyweVifMgopozSgx1fGNrGV8+wp7k6n1t6StHdJ6maQJ+UUtO2TcEiBFRyR6Q==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 19.0.3
+ chalk: 5.3.0
+ dev: true
+
+ /@commitlint/is-ignored@19.0.3:
+ resolution: {integrity: sha512-MqDrxJaRSVSzCbPsV6iOKG/Lt52Y+PVwFVexqImmYYFhe51iVJjK2hRhOG2jUAGiUHk4jpdFr0cZPzcBkSzXDQ==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 19.0.3
+ semver: 7.6.0
+ dev: true
+
+ /@commitlint/lint@19.1.0:
+ resolution: {integrity: sha512-ESjaBmL/9cxm+eePyEr6SFlBUIYlYpI80n+Ltm7IA3MAcrmiP05UMhJdAD66sO8jvo8O4xdGn/1Mt2G5VzfZKw==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/is-ignored': 19.0.3
+ '@commitlint/parse': 19.0.3
+ '@commitlint/rules': 19.0.3
+ '@commitlint/types': 19.0.3
+ dev: true
+
+ /@commitlint/load@19.2.0(@types/node@20.12.6)(typescript@5.4.4):
+ resolution: {integrity: sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/config-validator': 19.0.3
+ '@commitlint/execute-rule': 19.0.0
+ '@commitlint/resolve-extends': 19.1.0
+ '@commitlint/types': 19.0.3
+ chalk: 5.3.0
+ cosmiconfig: 9.0.0(typescript@5.4.4)
+ cosmiconfig-typescript-loader: 5.0.0(@types/node@20.12.6)(cosmiconfig@9.0.0)(typescript@5.4.4)
+ lodash.isplainobject: 4.0.6
+ lodash.merge: 4.6.2
+ lodash.uniq: 4.5.0
+ transitivePeerDependencies:
+ - '@types/node'
+ - typescript
+ dev: true
+
+ /@commitlint/message@19.0.0:
+ resolution: {integrity: sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==}
+ engines: {node: '>=v18'}
+ dev: true
+
+ /@commitlint/parse@19.0.3:
+ resolution: {integrity: sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/types': 19.0.3
+ conventional-changelog-angular: 7.0.0
+ conventional-commits-parser: 5.0.0
+ dev: true
+
+ /@commitlint/read@19.2.1:
+ resolution: {integrity: sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/top-level': 19.0.0
+ '@commitlint/types': 19.0.3
+ execa: 8.0.1
+ git-raw-commits: 4.0.0
+ minimist: 1.2.8
+ dev: true
+
+ /@commitlint/resolve-extends@19.1.0:
+ resolution: {integrity: sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/config-validator': 19.0.3
+ '@commitlint/types': 19.0.3
+ global-directory: 4.0.1
+ import-meta-resolve: 4.0.0
+ lodash.mergewith: 4.6.2
+ resolve-from: 5.0.0
+ dev: true
+
+ /@commitlint/rules@19.0.3:
+ resolution: {integrity: sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@commitlint/ensure': 19.0.3
+ '@commitlint/message': 19.0.0
+ '@commitlint/to-lines': 19.0.0
+ '@commitlint/types': 19.0.3
+ execa: 8.0.1
+ dev: true
+
+ /@commitlint/to-lines@19.0.0:
+ resolution: {integrity: sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==}
+ engines: {node: '>=v18'}
+ dev: true
+
+ /@commitlint/top-level@19.0.0:
+ resolution: {integrity: sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==}
+ engines: {node: '>=v18'}
+ dependencies:
+ find-up: 7.0.0
+ dev: true
+
+ /@commitlint/types@19.0.3:
+ resolution: {integrity: sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==}
+ engines: {node: '>=v18'}
+ dependencies:
+ '@types/conventional-commits-parser': 5.0.0
+ chalk: 5.3.0
+ dev: true
+
+ /@esbuild/aix-ppc64@0.19.11:
+ resolution: {integrity: sha512-FnzU0LyE3ySQk7UntJO4+qIiQgI7KoODnZg5xzXIrFJlKd2P2gwHsHY4927xj9y5PJmJSzULiUCWmv7iWnNa7g==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/aix-ppc64@0.20.2:
+ resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [aix]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/android-arm64@0.19.11:
+ resolution: {integrity: sha512-aiu7K/5JnLj//KOnOfEZ0D90obUkRzDMyqd/wNAUQ34m4YUPVhRZpnqKV9uqDGxT7cToSDnIHsGooyIczu9T+Q==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm64@0.20.2:
+ resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/android-arm@0.19.11:
+ resolution: {integrity: sha512-5OVapq0ClabvKvQ58Bws8+wkLCV+Rxg7tUVbo9xu034Nm536QTII4YzhaFriQ7rMrorfnFKUsArD2lqKbFY4vw==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-arm@0.20.2:
+ resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/android-x64@0.19.11:
+ resolution: {integrity: sha512-eccxjlfGw43WYoY9QgB82SgGgDbibcqyDTlk3l3C0jOVHKxrjdc9CTwDUQd0vkvYg5um0OH+GpxYvp39r+IPOg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/android-x64@0.20.2:
+ resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [android]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/darwin-arm64@0.19.11:
+ resolution: {integrity: sha512-ETp87DRWuSt9KdDVkqSoKoLFHYTrkyz2+65fj9nfXsaV3bMhTCjtQfw3y+um88vGRKRiF7erPrh/ZuIdLUIVxQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-arm64@0.20.2:
+ resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/darwin-x64@0.19.11:
+ resolution: {integrity: sha512-fkFUiS6IUK9WYUO/+22omwetaSNl5/A8giXvQlcinLIjVkxwTLSktbF5f/kJMftM2MJp9+fXqZ5ezS7+SALp4g==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/darwin-x64@0.20.2:
+ resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.19.11:
+ resolution: {integrity: sha512-lhoSp5K6bxKRNdXUtHoNc5HhbXVCS8V0iZmDvyWvYq9S5WSfTIHU2UGjcGt7UeS6iEYp9eeymIl5mJBn0yiuxA==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-arm64@0.20.2:
+ resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/freebsd-x64@0.19.11:
+ resolution: {integrity: sha512-JkUqn44AffGXitVI6/AbQdoYAq0TEullFdqcMY/PCUZ36xJ9ZJRtQabzMA+Vi7r78+25ZIBosLTOKnUXBSi1Kw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/freebsd-x64@0.20.2:
+ resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [freebsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-arm64@0.19.11:
+ resolution: {integrity: sha512-LneLg3ypEeveBSMuoa0kwMpCGmpu8XQUh+mL8XXwoYZ6Be2qBnVtcDI5azSvh7vioMDhoJFZzp9GWp9IWpYoUg==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm64@0.20.2:
+ resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-arm@0.19.11:
+ resolution: {integrity: sha512-3CRkr9+vCV2XJbjwgzjPtO8T0SZUmRZla+UL1jw+XqHZPkPgZiyWvbDvl9rqAN8Zl7qJF0O/9ycMtjU67HN9/Q==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-arm@0.20.2:
+ resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==}
+ engines: {node: '>=12'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-ia32@0.19.11:
+ resolution: {integrity: sha512-caHy++CsD8Bgq2V5CodbJjFPEiDPq8JJmBdeyZ8GWVQMjRD0sU548nNdwPNvKjVpamYYVL40AORekgfIubwHoA==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ia32@0.20.2:
+ resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-loong64@0.19.11:
+ resolution: {integrity: sha512-ppZSSLVpPrwHccvC6nQVZaSHlFsvCQyjnvirnVjbKSHuE5N24Yl8F3UwYUUR1UEPaFObGD2tSvVKbvR+uT1Nrg==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-loong64@0.20.2:
+ resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==}
+ engines: {node: '>=12'}
+ cpu: [loong64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-mips64el@0.19.11:
+ resolution: {integrity: sha512-B5x9j0OgjG+v1dF2DkH34lr+7Gmv0kzX6/V0afF41FkPMMqaQ77pH7CrhWeR22aEeHKaeZVtZ6yFwlxOKPVFyg==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-mips64el@0.20.2:
+ resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==}
+ engines: {node: '>=12'}
+ cpu: [mips64el]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-ppc64@0.19.11:
+ resolution: {integrity: sha512-MHrZYLeCG8vXblMetWyttkdVRjQlQUb/oMgBNurVEnhj4YWOr4G5lmBfZjHYQHHN0g6yDmCAQRR8MUHldvvRDA==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-ppc64@0.20.2:
+ resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==}
+ engines: {node: '>=12'}
+ cpu: [ppc64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-riscv64@0.19.11:
+ resolution: {integrity: sha512-f3DY++t94uVg141dozDu4CCUkYW+09rWtaWfnb3bqe4w5NqmZd6nPVBm+qbz7WaHZCoqXqHz5p6CM6qv3qnSSQ==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-riscv64@0.20.2:
+ resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==}
+ engines: {node: '>=12'}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-s390x@0.19.11:
+ resolution: {integrity: sha512-A5xdUoyWJHMMlcSMcPGVLzYzpcY8QP1RtYzX5/bS4dvjBGVxdhuiYyFwp7z74ocV7WDc0n1harxmpq2ePOjI0Q==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-s390x@0.20.2:
+ resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==}
+ engines: {node: '>=12'}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/linux-x64@0.19.11:
+ resolution: {integrity: sha512-grbyMlVCvJSfxFQUndw5mCtWs5LO1gUlwP4CDi4iJBbVpZcqLVT29FxgGuBJGSzyOxotFG4LoO5X+M1350zmPA==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/linux-x64@0.20.2:
+ resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/netbsd-x64@0.19.11:
+ resolution: {integrity: sha512-13jvrQZJc3P230OhU8xgwUnDeuC/9egsjTkXN49b3GcS5BKvJqZn86aGM8W9pd14Kd+u7HuFBMVtrNGhh6fHEQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/netbsd-x64@0.20.2:
+ resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [netbsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/openbsd-x64@0.19.11:
+ resolution: {integrity: sha512-ysyOGZuTp6SNKPE11INDUeFVVQFrhcNDVUgSQVDzqsqX38DjhPEPATpid04LCoUr2WXhQTEZ8ct/EgJCUDpyNw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/openbsd-x64@0.20.2:
+ resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [openbsd]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/sunos-x64@0.19.11:
+ resolution: {integrity: sha512-Hf+Sad9nVwvtxy4DXCZQqLpgmRTQqyFyhT3bZ4F2XlJCjxGmRFF0Shwn9rzhOYRB61w9VMXUkxlBy56dk9JJiQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/sunos-x64@0.20.2:
+ resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [sunos]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/win32-arm64@0.19.11:
+ resolution: {integrity: sha512-0P58Sbi0LctOMOQbpEOvOL44Ne0sqbS0XWHMvvrg6NE5jQ1xguCSSw9jQeUk2lfrXYsKDdOe6K+oZiwKPilYPQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-arm64@0.20.2:
+ resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==}
+ engines: {node: '>=12'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/win32-ia32@0.19.11:
+ resolution: {integrity: sha512-6YOrWS+sDJDmshdBIQU+Uoyh7pQKrdykdefC1avn76ss5c+RN6gut3LZA4E2cH5xUEp5/cA0+YxRaVtRAb0xBg==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-ia32@0.20.2:
+ resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==}
+ engines: {node: '>=12'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@esbuild/win32-x64@0.19.11:
+ resolution: {integrity: sha512-vfkhltrjCAb603XaFhqhAF4LGDi2M4OrCRrFusyQ+iTLQ/o60QQXxc9cZC/FFpihBI9N1Grn6SMKVJ4KP7Fuiw==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: true
+ optional: true
+
+ /@esbuild/win32-x64@0.20.2:
+ resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==}
+ engines: {node: '>=12'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ dev: false
+ optional: true
+
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.45.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
+ dependencies:
+ eslint: 8.45.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@eslint-community/eslint-utils@4.4.0(eslint@8.56.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
+ dependencies:
+ eslint: 8.56.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@eslint-community/regexpp@4.10.0:
+ resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==}
+ engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0}
+ dev: true
+
+ /@eslint/eslintrc@2.1.4:
+ resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ 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
+ dev: true
+
+ /@eslint/js@8.44.0:
+ resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@eslint/js@8.56.0:
+ resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@humanwhocodes/config-array@0.11.14:
+ resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==}
+ engines: {node: '>=10.10.0'}
+ dependencies:
+ '@humanwhocodes/object-schema': 2.0.3
+ debug: 4.3.4
+ minimatch: 3.1.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@humanwhocodes/module-importer@1.0.1:
+ resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==}
+ engines: {node: '>=12.22'}
+ dev: true
+
+ /@humanwhocodes/object-schema@2.0.3:
+ resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==}
+ dev: true
+
+ /@istanbuljs/load-nyc-config@1.1.0:
+ resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==}
+ engines: {node: '>=8'}
+ 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
+ dev: true
+
+ /@istanbuljs/schema@0.1.3:
+ resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /@jest/console@29.7.0:
+ resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 20.12.6
+ chalk: 4.1.2
+ jest-message-util: 29.7.0
+ jest-util: 29.7.0
+ slash: 3.0.0
+ dev: true
+
+ /@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
+ 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.6
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ exit: 0.1.2
+ graceful-fs: 4.2.10
+ jest-changed-files: 29.7.0
+ jest-config: 29.7.0(@types/node@20.12.6)
+ 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
+ dev: true
+
+ /@jest/create-cache-key-function@29.7.0:
+ resolution: {integrity: sha512-4QqS3LY5PBmTRHj9sAg1HLoPzqAI0uOX6wI/TRqHIcOxlFidy6YEmCQJk6FSZjNLGCeubDMfmkWL+qaLKhSGQA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ dev: true
+
+ /@jest/environment@29.7.0:
+ resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.12.6
+ jest-mock: 29.7.0
+ dev: true
+
+ /@jest/expect-utils@29.7.0:
+ resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ jest-get-type: 29.6.3
+ dev: true
+
+ /@jest/expect@29.7.0:
+ resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ expect: 29.7.0
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@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}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@sinonjs/fake-timers': 10.3.0
+ '@types/node': 20.12.6
+ jest-message-util: 29.7.0
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+ dev: true
+
+ /@jest/globals@29.7.0:
+ resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.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
+ dev: true
+
+ /@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
+ 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.6
+ chalk: 4.1.2
+ collect-v8-coverage: 1.0.2
+ exit: 0.1.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ 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
+ dev: 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}
+ dependencies:
+ '@sinclair/typebox': 0.27.8
+ dev: true
+
+ /@jest/source-map@29.6.3:
+ resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ callsites: 3.1.0
+ graceful-fs: 4.2.10
+ dev: true
+
+ /@jest/test-result@29.7.0:
+ resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.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
+ dev: true
+
+ /@jest/test-sequencer@29.7.0:
+ resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/test-result': 29.7.0
+ graceful-fs: 4.2.10
+ jest-haste-map: 29.7.0
+ slash: 3.0.0
+ dev: true
+
+ /@jest/transform@29.7.0:
+ resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@babel/core': 7.24.4
+ '@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.10
+ 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
+ dev: true
+
+ /@jest/types@29.6.3:
+ resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.6.3
+ '@types/istanbul-lib-coverage': 2.0.6
+ '@types/istanbul-reports': 3.0.4
+ '@types/node': 20.12.6
+ '@types/yargs': 17.0.32
+ chalk: 4.1.2
+ dev: true
+
+ /@jridgewell/gen-mapping@0.3.5:
+ resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ '@jridgewell/set-array': 1.2.1
+ '@jridgewell/sourcemap-codec': 1.4.15
+ '@jridgewell/trace-mapping': 0.3.25
+ dev: true
+
+ /@jridgewell/resolve-uri@3.1.2:
+ resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/set-array@1.2.1:
+ resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==}
+ engines: {node: '>=6.0.0'}
+ dev: true
+
+ /@jridgewell/sourcemap-codec@1.4.15:
+ resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==}
+ dev: true
+
+ /@jridgewell/trace-mapping@0.3.25:
+ resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
+ dependencies:
+ '@jridgewell/resolve-uri': 3.1.2
+ '@jridgewell/sourcemap-codec': 1.4.15
+ dev: true
+
+ /@manypkg/find-root@1.1.0:
+ resolution: {integrity: sha512-mki5uBvhHzO8kYYix/WRy2WX8S3B5wdVSc9D6KcU5lQNglP2yt58/VfLuAK49glRXChosY8ap2oJ1qgma3GUVA==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@types/node': 12.20.55
+ find-up: 4.1.0
+ fs-extra: 8.1.0
+ dev: true
+
+ /@manypkg/get-packages@1.1.3:
+ resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@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
+ dev: true
+
+ /@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1:
+ resolution: {integrity: sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==}
+ dependencies:
+ eslint-scope: 5.1.1
+ dev: true
+
+ /@nodelib/fs.scandir@2.1.5:
+ resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
+ engines: {node: '>= 8'}
+ dependencies:
+ '@nodelib/fs.stat': 2.0.5
+ run-parallel: 1.2.0
+
+ /@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'}
+ dependencies:
+ '@nodelib/fs.scandir': 2.1.5
+ fastq: 1.17.1
+
+ /@pkgr/core@0.1.1:
+ resolution: {integrity: sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==}
+ engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0}
+
+ /@pnpm/config.env-replace@1.1.0:
+ resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
+ engines: {node: '>=12.22.0'}
+
+ /@pnpm/network.ca-file@1.0.2:
+ resolution: {integrity: sha512-YcPQ8a0jwYU9bTdJDpXjMi7Brhkr1mXsXrUJvjqM2mQDgkRiz8jFaQGOdaLxgjtUfQgZhKy/O3cG/YwmgKaxLA==}
+ engines: {node: '>=12.22.0'}
+ dependencies:
+ graceful-fs: 4.2.10
+
+ /@pnpm/npm-conf@2.2.2:
+ resolution: {integrity: sha512-UA91GwWPhFExt3IizW6bOeY/pQ0BkuNwKjk9iQW9KqxluGCrg4VenZ0/L+2Y0+ZOtme72EVvg6v0zo3AMQRCeA==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@pnpm/config.env-replace': 1.1.0
+ '@pnpm/network.ca-file': 1.0.2
+ config-chain: 1.1.13
+
+ /@rollup/rollup-android-arm-eabi@4.14.1:
+ resolution: {integrity: sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==}
+ cpu: [arm]
+ os: [android]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-android-arm64@4.14.1:
+ resolution: {integrity: sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==}
+ cpu: [arm64]
+ os: [android]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-darwin-arm64@4.14.1:
+ resolution: {integrity: sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-darwin-x64@4.14.1:
+ resolution: {integrity: sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-linux-arm-gnueabihf@4.14.1:
+ resolution: {integrity: sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-linux-arm64-gnu@4.14.1:
+ resolution: {integrity: sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-linux-arm64-musl@4.14.1:
+ resolution: {integrity: sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-linux-powerpc64le-gnu@4.14.1:
+ resolution: {integrity: sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==}
+ cpu: [ppc64le]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-linux-riscv64-gnu@4.14.1:
+ resolution: {integrity: sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==}
+ cpu: [riscv64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-linux-s390x-gnu@4.14.1:
+ resolution: {integrity: sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==}
+ cpu: [s390x]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-linux-x64-gnu@4.14.1:
+ resolution: {integrity: sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-linux-x64-musl@4.14.1:
+ resolution: {integrity: sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-win32-arm64-msvc@4.14.1:
+ resolution: {integrity: sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-win32-ia32-msvc@4.14.1:
+ resolution: {integrity: sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@rollup/rollup-win32-x64-msvc@4.14.1:
+ resolution: {integrity: sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@sinclair/typebox@0.27.8:
+ resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==}
+ dev: true
+
+ /@sinonjs/commons@3.0.1:
+ resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==}
+ dependencies:
+ type-detect: 4.0.8
+ dev: true
+
+ /@sinonjs/fake-timers@10.3.0:
+ resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==}
+ dependencies:
+ '@sinonjs/commons': 3.0.1
+ dev: true
+
+ /@strapi/eslint-config@0.2.1(@babel/core@7.24.4)(prettier@2.8.8)(typescript@5.4.4):
+ resolution: {integrity: sha512-clvyEn5J/nF9j6oTH1EHZQEEJBrtGopwXKSLxqCpeu2heMl80CWDrcq+A83FHGLltyReFeH2B4sGfe0OL4iB/w==}
+ peerDependencies:
+ typescript: ^5.1.3
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@babel/eslint-parser': 7.24.1(@babel/core@7.24.4)(eslint@8.45.0)
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.45.0)(typescript@5.4.4)
+ '@typescript-eslint/parser': 5.62.0(eslint@8.45.0)(typescript@5.4.4)
+ eslint: 8.45.0
+ eslint-config-airbnb: 19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.45.0)
+ eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.45.0)
+ eslint-config-airbnb-typescript: 17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.45.0)
+ eslint-config-prettier: 8.10.0(eslint@8.45.0)
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.45.0)
+ eslint-plugin-check-file: 2.7.1(eslint@8.45.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.56.0)
+ eslint-plugin-jest-dom: 4.0.3(eslint@8.45.0)
+ eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0)
+ eslint-plugin-node: 11.1.0(eslint@8.45.0)
+ eslint-plugin-prettier: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.45.0)(prettier@2.8.8)
+ eslint-plugin-react: 7.34.1(eslint@8.56.0)
+ eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0)
+ eslint-plugin-testing-library: 5.11.1(eslint@8.45.0)(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - '@babel/core'
+ - eslint-import-resolver-node
+ - eslint-import-resolver-webpack
+ - prettier
+ - supports-color
+ dev: true
+
+ /@strapi/pack-up@5.0.0-beta.2(@types/node@20.12.6):
+ resolution: {integrity: sha512-zVn51AeYNYVlf+clR0l5JZzfUaVRVfdXCjNlVcrxOhEHVjY6PBejo9XbrgfSG2nz8ph1YZe5M3nz0IvpzBQswQ==}
+ engines: {node: '>=18.0.0 <=20.x.x', npm: '>=6.0.0'}
+ hasBin: true
+ dependencies:
+ '@vitejs/plugin-react-swc': 3.6.0(vite@5.1.6)
+ boxen: 5.1.2
+ browserslist-to-esbuild: 1.2.0
+ chalk: 4.1.2
+ chokidar: 3.5.3
+ commander: 8.3.0
+ esbuild: 0.19.11
+ esbuild-register: 3.5.0(esbuild@0.19.11)
+ get-latest-version: 5.1.0
+ git-url-parse: 13.1.1
+ ini: 4.1.1
+ ora: 5.4.1
+ outdent: 0.8.0
+ pkg-up: 3.1.0
+ prettier: 3.2.5
+ prettier-plugin-packagejson: 2.4.12(prettier@3.2.5)
+ prompts: 2.4.2
+ rxjs: 7.8.1
+ typescript: 5.3.2
+ vite: 5.1.6(@types/node@20.12.6)
+ yup: 0.32.9
+ transitivePeerDependencies:
+ - '@swc/helpers'
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+ dev: true
+
+ /@swc/core-darwin-arm64@1.4.13:
+ resolution: {integrity: sha512-36P72FLpm5iq85IvoEjBvi22DiqkkEIanJ1M0E8bkxcFHUbjBrYfPY9T6cpPyK5oQqkaTBvNAc3j1BlVD6IH6w==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-darwin-x64@1.4.13:
+ resolution: {integrity: sha512-ye7OgKpDdyA8AMIVVdmD1ICDaFXgoEXORnVO8bBHyul0WN71yUBZMX+YxEx2lpWtiftA2vY/1MAuOR80vHkBCw==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-linux-arm-gnueabihf@1.4.13:
+ resolution: {integrity: sha512-+x593Jlmu4c3lJtZUKRejWpV2MAij1Js5nmQLLdjo6ChR2D4B2rzj3iMiKn5gITew7fraF9t3fvXALdWh7HmUg==}
+ engines: {node: '>=10'}
+ cpu: [arm]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-linux-arm64-gnu@1.4.13:
+ resolution: {integrity: sha512-0x8OVw4dfyNerrs/9eZX9wNnmvwbwXSMCi+LbE6Xt1pXOIwvoLtFIXcV3NsrlkFboO3sr5UAQIwDxKqbIZA9pQ==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-linux-arm64-musl@1.4.13:
+ resolution: {integrity: sha512-Z9c4JiequtZvngPcxbCuAOkmWBxi2vInZbjjhD5I+Q9oiJdXUz1t2USGwsGPS41Xvk1BOA3ecK2Sn1ilY3titg==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-linux-x64-gnu@1.4.13:
+ resolution: {integrity: sha512-ChatHtk+vX0Ke5QG+jO+rIapw/KwZsi9MedCBHFXHH6iWF4z8d51cJeN68ykcn+vAXzjNeFNdlNy5Vbkd1zAqg==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-linux-x64-musl@1.4.13:
+ resolution: {integrity: sha512-0Pz39YR530mXpsztwQkmEKdkkZy4fY4Smdh4pkm6Ly8Nndyo0te/l4bcAGqN24Jp7aVwF/QSy14SAtw4HRjU9g==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [linux]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-win32-arm64-msvc@1.4.13:
+ resolution: {integrity: sha512-LVZfhlD+jHcAbz5NN+gAJ1BEasB0WpcvUzcsJt0nQSRsojgzPzFjJ+fzEBnvT7SMtqKkrnVJ0OmDYeh88bDRpw==}
+ engines: {node: '>=10'}
+ cpu: [arm64]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-win32-ia32-msvc@1.4.13:
+ resolution: {integrity: sha512-78hxHWUvUZtWsnhcf8DKwhBcNFJw+j4y4fN2B9ioXmBWX2tIyw+BqUHOrismOtjPihaZmwe/Ok2e4qmkawE2fw==}
+ engines: {node: '>=10'}
+ cpu: [ia32]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core-win32-x64-msvc@1.4.13:
+ resolution: {integrity: sha512-WSfy1u2Xde6jU7UpHIInCUMW98Zw9iZglddKUAvmr1obkZji5U6EX0Oca3asEJdZPFb+2lMLjt0Mh5a1YisROg==}
+ engines: {node: '>=10'}
+ cpu: [x64]
+ os: [win32]
+ requiresBuild: true
+ optional: true
+
+ /@swc/core@1.4.13:
+ resolution: {integrity: sha512-rOtusBE+2gaeRkAJn5E4zp5yzZekZOypzSOz5ZG6P1hFbd+Cc26fWEdK6sUSnrkkvTd0Oj33KXLB/4UkbK/UHA==}
+ engines: {node: '>=10'}
+ requiresBuild: true
+ peerDependencies:
+ '@swc/helpers': ^0.5.0
+ peerDependenciesMeta:
+ '@swc/helpers':
+ optional: true
+ dependencies:
+ '@swc/counter': 0.1.3
+ '@swc/types': 0.1.6
+ optionalDependencies:
+ '@swc/core-darwin-arm64': 1.4.13
+ '@swc/core-darwin-x64': 1.4.13
+ '@swc/core-linux-arm-gnueabihf': 1.4.13
+ '@swc/core-linux-arm64-gnu': 1.4.13
+ '@swc/core-linux-arm64-musl': 1.4.13
+ '@swc/core-linux-x64-gnu': 1.4.13
+ '@swc/core-linux-x64-musl': 1.4.13
+ '@swc/core-win32-arm64-msvc': 1.4.13
+ '@swc/core-win32-ia32-msvc': 1.4.13
+ '@swc/core-win32-x64-msvc': 1.4.13
+
+ /@swc/counter@0.1.3:
+ resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==}
+
+ /@swc/jest@0.2.36(@swc/core@1.4.13):
+ resolution: {integrity: sha512-8X80dp81ugxs4a11z1ka43FPhP+/e+mJNXJSxiNYk8gIX/jPBtY4gQTrKu/KIoco8bzKuPI5lUxjfLiGsfvnlw==}
+ engines: {npm: '>= 7.0.0'}
+ peerDependencies:
+ '@swc/core': '*'
+ dependencies:
+ '@jest/create-cache-key-function': 29.7.0
+ '@swc/core': 1.4.13
+ '@swc/counter': 0.1.3
+ jsonc-parser: 3.2.1
+ dev: true
+
+ /@swc/types@0.1.6:
+ resolution: {integrity: sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==}
+ dependencies:
+ '@swc/counter': 0.1.3
+
+ /@testing-library/dom@8.20.1:
+ resolution: {integrity: sha512-/DiOQ5xBxgdYRC8LNk7U+RWat0S3qRLeIw3ZIkMQ9kkVlRmwD/Eg8k8CqIpD6GW7u20JIUOfMKbxtiLutpjQ4g==}
+ engines: {node: '>=12'}
+ dependencies:
+ '@babel/code-frame': 7.24.2
+ '@babel/runtime': 7.24.4
+ '@types/aria-query': 5.0.4
+ aria-query: 5.1.3
+ chalk: 4.1.2
+ dom-accessibility-api: 0.5.16
+ lz-string: 1.5.0
+ pretty-format: 27.5.1
+ dev: true
+
+ /@types/aria-query@5.0.4:
+ resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
+ dev: true
+
+ /@types/babel__core@7.20.5:
+ resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
+ dependencies:
+ '@babel/parser': 7.24.4
+ '@babel/types': 7.24.0
+ '@types/babel__generator': 7.6.8
+ '@types/babel__template': 7.4.4
+ '@types/babel__traverse': 7.20.5
+ dev: true
+
+ /@types/babel__generator@7.6.8:
+ resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@types/babel__template@7.4.4:
+ resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
+ dependencies:
+ '@babel/parser': 7.24.4
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@types/babel__traverse@7.20.5:
+ resolution: {integrity: sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ==}
+ dependencies:
+ '@babel/types': 7.24.0
+ dev: true
+
+ /@types/conventional-commits-parser@5.0.0:
+ resolution: {integrity: sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==}
+ dependencies:
+ '@types/node': 20.12.6
+ dev: true
+
+ /@types/estree@1.0.5:
+ resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==}
+
+ /@types/git-url-parse@9.0.3:
+ resolution: {integrity: sha512-Wrb8zeghhpKbYuqAOg203g+9YSNlrZWNZYvwxJuDF4dTmerijqpnGbI79yCuPtHSXHPEwv1pAFUB4zsSqn82Og==}
+ dev: true
+
+ /@types/graceful-fs@4.1.9:
+ resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==}
+ dependencies:
+ '@types/node': 20.12.6
+ dev: true
+
+ /@types/ini@4.1.0:
+ resolution: {integrity: sha512-mTehMtc+xtnWBBvqizcqYCktKDBH2WChvx1GU3Sfe4PysFDXiNe+1YwtpVX1MDtCa4NQrSPw2+3HmvXHY3gt1w==}
+ dev: true
+
+ /@types/istanbul-lib-coverage@2.0.6:
+ resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==}
+ dev: true
+
+ /@types/istanbul-lib-report@3.0.3:
+ resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==}
+ dependencies:
+ '@types/istanbul-lib-coverage': 2.0.6
+ dev: true
+
+ /@types/istanbul-reports@3.0.4:
+ resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==}
+ dependencies:
+ '@types/istanbul-lib-report': 3.0.3
+ dev: true
+
+ /@types/json-schema@7.0.15:
+ resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
+ dev: true
+
+ /@types/json5@0.0.29:
+ resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==}
+ dev: true
+
+ /@types/lodash@4.17.0:
+ resolution: {integrity: sha512-t7dhREVv6dbNj0q17X12j7yDG4bD/DHYX7o5/DbDxobP0HnGPgpRz2Ej77aL7TZT3DSw13fqUTj8J4mMnqa7WA==}
+
+ /@types/minimist@1.2.5:
+ resolution: {integrity: sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==}
+ dev: true
+
+ /@types/node@12.20.55:
+ resolution: {integrity: sha512-J8xLz7q2OFulZ2cyGTLE1TbbZcjpno7FaN6zdJNrgAdrJ+DZzh/uFR6YrTb4C+nXakvud8Q4+rbhoIWlYQbUFQ==}
+ dev: true
+
+ /@types/node@20.12.6:
+ resolution: {integrity: sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==}
+ dependencies:
+ undici-types: 5.26.5
+
+ /@types/normalize-package-data@2.4.4:
+ resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==}
+ dev: true
+
+ /@types/prompts@2.4.9:
+ resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==}
+ dependencies:
+ '@types/node': 20.12.6
+ kleur: 3.0.3
+ dev: true
+
+ /@types/semver@7.5.8:
+ resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
+ dev: true
+
+ /@types/stack-utils@2.0.3:
+ resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==}
+ dev: true
+
+ /@types/yargs-parser@21.0.3:
+ resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==}
+ dev: true
+
+ /@types/yargs@17.0.32:
+ resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==}
+ dependencies:
+ '@types/yargs-parser': 21.0.3
+ dev: true
+
+ /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.45.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^5.0.0
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@eslint-community/regexpp': 4.10.0
+ '@typescript-eslint/parser': 5.62.0(eslint@8.45.0)(typescript@5.4.4)
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/type-utils': 5.62.0(eslint@8.45.0)(typescript@5.4.4)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.45.0)(typescript@5.4.4)
+ debug: 4.3.4
+ eslint: 8.45.0
+ graphemer: 1.4.0
+ ignore: 5.3.1
+ natural-compare-lite: 1.4.0
+ semver: 7.6.0
+ tsutils: 3.21.0(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/eslint-plugin@7.6.0(@typescript-eslint/parser@7.6.0)(eslint@8.56.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ '@typescript-eslint/parser': ^7.0.0
+ eslint: ^8.56.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@eslint-community/regexpp': 4.10.0
+ '@typescript-eslint/parser': 7.6.0(eslint@8.56.0)(typescript@5.4.4)
+ '@typescript-eslint/scope-manager': 7.6.0
+ '@typescript-eslint/type-utils': 7.6.0(eslint@8.56.0)(typescript@5.4.4)
+ '@typescript-eslint/utils': 7.6.0(eslint@8.56.0)(typescript@5.4.4)
+ '@typescript-eslint/visitor-keys': 7.6.0
+ debug: 4.3.4
+ eslint: 8.56.0
+ graphemer: 1.4.0
+ ignore: 5.3.1
+ natural-compare: 1.4.0
+ semver: 7.6.0
+ ts-api-utils: 1.3.0(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/experimental-utils@5.62.0(eslint@8.56.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-RTXpeB3eMkpoclG3ZHft6vG/Z30azNHuqY6wKPBHlVMZFuEvrtlEDe8gMqDb+SO+9hjC/pLekeSCryf9vMZlCw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@typescript-eslint/utils': 5.62.0(eslint@8.56.0)(typescript@5.4.4)
+ eslint: 8.56.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/parser@5.62.0(eslint@8.45.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^6.0.0 || ^7.0.0 || ^8.0.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 5.62.0
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.4)
+ debug: 4.3.4
+ eslint: 8.45.0
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/parser@7.6.0(eslint@8.56.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ eslint: ^8.56.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/scope-manager': 7.6.0
+ '@typescript-eslint/types': 7.6.0
+ '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4)
+ '@typescript-eslint/visitor-keys': 7.6.0
+ debug: 4.3.4
+ eslint: 8.56.0
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: 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}
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ '@typescript-eslint/visitor-keys': 5.62.0
+ dev: true
+
+ /@typescript-eslint/scope-manager@7.6.0:
+ resolution: {integrity: sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dependencies:
+ '@typescript-eslint/types': 7.6.0
+ '@typescript-eslint/visitor-keys': 7.6.0
+ dev: true
+
+ /@typescript-eslint/type-utils@5.62.0(eslint@8.45.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 5.62.0(typescript@5.4.4)
+ '@typescript-eslint/utils': 5.62.0(eslint@8.45.0)(typescript@5.4.4)
+ debug: 4.3.4
+ eslint: 8.45.0
+ tsutils: 3.21.0(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/type-utils@7.6.0(eslint@8.56.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ eslint: ^8.56.0
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4)
+ '@typescript-eslint/utils': 7.6.0(eslint@8.56.0)(typescript@5.4.4)
+ debug: 4.3.4
+ eslint: 8.56.0
+ ts-api-utils: 1.3.0(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/types@5.62.0:
+ resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dev: true
+
+ /@typescript-eslint/types@7.6.0:
+ resolution: {integrity: sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dev: true
+
+ /@typescript-eslint/typescript-estree@5.62.0(typescript@5.4.4):
+ 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
+ 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.0
+ tsutils: 3.21.0(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/typescript-estree@7.6.0(typescript@5.4.4):
+ resolution: {integrity: sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ typescript: '*'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ '@typescript-eslint/types': 7.6.0
+ '@typescript-eslint/visitor-keys': 7.6.0
+ debug: 4.3.4
+ globby: 11.1.0
+ is-glob: 4.0.3
+ minimatch: 9.0.4
+ semver: 7.6.0
+ ts-api-utils: 1.3.0(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /@typescript-eslint/utils@5.62.0(eslint@8.45.0)(typescript@5.4.4):
+ 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
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.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.4)
+ eslint: 8.45.0
+ eslint-scope: 5.1.1
+ semver: 7.6.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/utils@5.62.0(eslint@8.56.0)(typescript@5.4.4):
+ 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
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.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.4)
+ eslint: 8.56.0
+ eslint-scope: 5.1.1
+ semver: 7.6.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@typescript-eslint/utils@7.6.0(eslint@8.56.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ peerDependencies:
+ eslint: ^8.56.0
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+ '@types/json-schema': 7.0.15
+ '@types/semver': 7.5.8
+ '@typescript-eslint/scope-manager': 7.6.0
+ '@typescript-eslint/types': 7.6.0
+ '@typescript-eslint/typescript-estree': 7.6.0(typescript@5.4.4)
+ eslint: 8.56.0
+ semver: 7.6.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /@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}
+ dependencies:
+ '@typescript-eslint/types': 5.62.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@typescript-eslint/visitor-keys@7.6.0:
+ resolution: {integrity: sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==}
+ engines: {node: ^18.18.0 || >=20.0.0}
+ dependencies:
+ '@typescript-eslint/types': 7.6.0
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /@ungap/structured-clone@1.2.0:
+ resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==}
+ dev: true
+
+ /@vitejs/plugin-react-swc@3.6.0(vite@5.1.6):
+ resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==}
+ peerDependencies:
+ vite: ^4 || ^5
+ dependencies:
+ '@swc/core': 1.4.13
+ vite: 5.1.6(@types/node@20.12.6)
+ transitivePeerDependencies:
+ - '@swc/helpers'
+ dev: true
+
+ /@vitejs/plugin-react-swc@3.6.0(vite@5.2.8):
+ resolution: {integrity: sha512-XFRbsGgpGxGzEV5i5+vRiro1bwcIaZDIdBRP16qwm+jP68ue/S8FJTBEgOeojtVDYrbSua3XFp71kC8VJE6v+g==}
+ peerDependencies:
+ vite: ^4 || ^5
+ dependencies:
+ '@swc/core': 1.4.13
+ vite: 5.2.8(@types/node@20.12.6)
+ transitivePeerDependencies:
+ - '@swc/helpers'
+ dev: false
+
+ /JSONStream@1.3.5:
+ resolution: {integrity: sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==}
+ hasBin: true
+ dependencies:
+ jsonparse: 1.3.1
+ through: 2.3.8
+ dev: true
+
+ /acorn-jsx@5.3.2(acorn@8.11.3):
+ resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==}
+ peerDependencies:
+ acorn: ^6.0.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ acorn: 8.11.3
+ dev: true
+
+ /acorn@8.11.3:
+ resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+ dev: true
+
+ /ajv@6.12.6:
+ resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==}
+ 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
+ dev: true
+
+ /ajv@8.12.0:
+ resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==}
+ dependencies:
+ fast-deep-equal: 3.1.3
+ json-schema-traverse: 1.0.0
+ require-from-string: 2.0.2
+ uri-js: 4.4.1
+ dev: true
+
+ /ansi-align@3.0.1:
+ resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==}
+ dependencies:
+ string-width: 4.2.3
+
+ /ansi-colors@4.1.3:
+ resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /ansi-escapes@4.3.2:
+ resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.21.3
+ dev: true
+
+ /ansi-escapes@6.2.1:
+ resolution: {integrity: sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==}
+ engines: {node: '>=14.16'}
+ dev: true
+
+ /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'}
+ dev: true
+
+ /ansi-styles@3.2.1:
+ resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==}
+ engines: {node: '>=4'}
+ dependencies:
+ color-convert: 1.9.3
+ dev: true
+
+ /ansi-styles@4.3.0:
+ resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ color-convert: 2.0.1
+
+ /ansi-styles@5.2.0:
+ resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /ansi-styles@6.2.1:
+ resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /anymatch@3.1.3:
+ resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==}
+ engines: {node: '>= 8'}
+ dependencies:
+ normalize-path: 3.0.0
+ picomatch: 2.3.1
+
+ /argparse@1.0.10:
+ resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==}
+ dependencies:
+ sprintf-js: 1.0.3
+ dev: true
+
+ /argparse@2.0.1:
+ resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
+ dev: true
+
+ /aria-query@5.1.3:
+ resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==}
+ dependencies:
+ deep-equal: 2.2.3
+ dev: true
+
+ /aria-query@5.3.0:
+ resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /array-buffer-byte-length@1.0.1:
+ resolution: {integrity: sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ is-array-buffer: 3.0.4
+ dev: true
+
+ /array-ify@1.0.0:
+ resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
+ dev: true
+
+ /array-includes@3.1.8:
+ resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /array-union@2.1.0:
+ resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /array.prototype.findlast@1.2.5:
+ resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /array.prototype.findlastindex@1.2.5:
+ resolution: {integrity: sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /array.prototype.flat@1.3.2:
+ resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.flatmap@1.3.2:
+ resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.toreversed@1.1.2:
+ resolution: {integrity: sha512-wwDCoT4Ck4Cz7sLtgUmzR5UV3YF5mFHUlbChCzZBQZ+0m2cl/DH3tKgvphv1nKgFsJ48oCSg6p91q2Vm0I/ZMA==}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-shim-unscopables: 1.0.2
+ dev: true
+
+ /array.prototype.tosorted@1.1.3:
+ resolution: {integrity: sha512-/DdH4TiTmOKzyQbp/eadcCVexiCb36xJg7HshYOYJnNZFDj33GEv0P7GxsynpShhq4OLYJzbGcBDkLsDt7MnNg==}
+ 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
+ dev: true
+
+ /arraybuffer.prototype.slice@1.0.3:
+ resolution: {integrity: sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /arrify@1.0.1:
+ resolution: {integrity: sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /ast-types-flow@0.0.8:
+ resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
+ dev: true
+
+ /available-typed-arrays@1.0.7:
+ resolution: {integrity: sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ possible-typed-array-names: 1.0.0
+ dev: true
+
+ /axe-core@4.7.0:
+ resolution: {integrity: sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /axobject-query@3.2.1:
+ resolution: {integrity: sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg==}
+ dependencies:
+ dequal: 2.0.3
+ dev: true
+
+ /babel-jest@29.7.0(@babel/core@7.24.4):
+ resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ peerDependencies:
+ '@babel/core': ^7.8.0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@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.4)
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ slash: 3.0.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /babel-plugin-istanbul@6.1.1:
+ resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/helper-plugin-utils': 7.24.0
+ '@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
+ dev: true
+
+ /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}
+ dependencies:
+ '@babel/template': 7.24.0
+ '@babel/types': 7.24.0
+ '@types/babel__core': 7.20.5
+ '@types/babel__traverse': 7.20.5
+ dev: true
+
+ /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.4):
+ resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==}
+ peerDependencies:
+ '@babel/core': ^7.0.0
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.4)
+ '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.4)
+ '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.4)
+ '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.4)
+ dev: true
+
+ /babel-preset-jest@29.6.3(@babel/core@7.24.4):
+ 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
+ dependencies:
+ '@babel/core': 7.24.4
+ babel-plugin-jest-hoist: 29.6.3
+ babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.4)
+ dev: true
+
+ /balanced-match@1.0.2:
+ resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
+ dev: true
+
+ /base64-js@1.5.1:
+ resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==}
+
+ /bent@7.3.12:
+ resolution: {integrity: sha512-T3yrKnVGB63zRuoco/7Ybl7BwwGZR0lceoVG5XmQyMIH9s19SV5m+a8qam4if0zQuAmOQTyPTPmsQBdAorGK3w==}
+ dependencies:
+ bytesish: 0.4.4
+ caseless: 0.12.0
+ is-stream: 2.0.1
+ dev: true
+
+ /better-path-resolve@1.0.0:
+ resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==}
+ engines: {node: '>=4'}
+ dependencies:
+ is-windows: 1.0.2
+ dev: true
+
+ /binary-extensions@2.3.0:
+ resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==}
+ engines: {node: '>=8'}
+
+ /bl@4.1.0:
+ resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==}
+ dependencies:
+ buffer: 5.7.1
+ inherits: 2.0.4
+ readable-stream: 3.6.2
+
+ /boxen@5.1.2:
+ resolution: {integrity: sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-align: 3.0.1
+ camelcase: 6.3.0
+ chalk: 4.1.2
+ cli-boxes: 2.2.1
+ string-width: 4.2.3
+ type-fest: 0.20.2
+ widest-line: 3.1.0
+ wrap-ansi: 7.0.0
+
+ /brace-expansion@1.1.11:
+ resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
+ dependencies:
+ balanced-match: 1.0.2
+ concat-map: 0.0.1
+ dev: true
+
+ /brace-expansion@2.0.1:
+ resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==}
+ dependencies:
+ balanced-match: 1.0.2
+ dev: true
+
+ /braces@3.0.2:
+ resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==}
+ engines: {node: '>=8'}
+ dependencies:
+ fill-range: 7.0.1
+
+ /breakword@1.0.6:
+ resolution: {integrity: sha512-yjxDAYyK/pBvws9H4xKYpLDpYKEH6CzrBPAuXq3x18I+c/2MkVtT3qAr7Oloi6Dss9qNhPVueAAVU1CSeNDIXw==}
+ dependencies:
+ wcwidth: 1.0.1
+ dev: true
+
+ /browserslist-to-esbuild@1.2.0:
+ resolution: {integrity: sha512-ftrrbI/VHBgEnmnSyhkqvQVMp6jAKybfs0qMIlm7SLBrQTGMsdCIP4q3BoKeLsZTBQllIQtY9kbxgRYV2WU47g==}
+ engines: {node: '>=12'}
+ dependencies:
+ browserslist: 4.23.0
+
+ /browserslist@4.23.0:
+ resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==}
+ engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
+ hasBin: true
+ dependencies:
+ caniuse-lite: 1.0.30001607
+ electron-to-chromium: 1.4.730
+ node-releases: 2.0.14
+ update-browserslist-db: 1.0.13(browserslist@4.23.0)
+
+ /bser@2.1.1:
+ resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==}
+ dependencies:
+ node-int64: 0.4.0
+ dev: true
+
+ /buffer-from@1.1.2:
+ resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==}
+ dev: true
+
+ /buffer@5.7.1:
+ resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==}
+ dependencies:
+ base64-js: 1.5.1
+ ieee754: 1.2.1
+
+ /bytesish@0.4.4:
+ resolution: {integrity: sha512-i4uu6M4zuMUiyfZN4RU2+i9+peJh//pXhd9x1oSe1LBkZ3LEbCoygu8W0bXTukU1Jme2txKuotpCZRaC3FLxcQ==}
+ dev: true
+
+ /call-bind@1.0.7:
+ resolution: {integrity: sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /callsites@3.1.0:
+ resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase-keys@6.2.2:
+ resolution: {integrity: sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ camelcase: 5.3.1
+ map-obj: 4.3.0
+ quick-lru: 4.0.1
+ dev: true
+
+ /camelcase@5.3.1:
+ resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /camelcase@6.3.0:
+ resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==}
+ engines: {node: '>=10'}
+
+ /caniuse-lite@1.0.30001607:
+ resolution: {integrity: sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==}
+
+ /caseless@0.12.0:
+ resolution: {integrity: sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==}
+ dev: true
+
+ /chalk@2.4.2:
+ resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==}
+ engines: {node: '>=4'}
+ dependencies:
+ ansi-styles: 3.2.1
+ escape-string-regexp: 1.0.5
+ supports-color: 5.5.0
+ dev: true
+
+ /chalk@4.1.2:
+ resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ supports-color: 7.2.0
+
+ /chalk@5.3.0:
+ resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
+ engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
+ dev: true
+
+ /char-regex@1.0.2:
+ resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /chardet@0.7.0:
+ resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+ dev: true
+
+ /chokidar@3.5.3:
+ resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==}
+ engines: {node: '>= 8.10.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
+ dev: true
+
+ /chokidar@3.6.0:
+ resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==}
+ engines: {node: '>= 8.10.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
+ dev: false
+
+ /ci-info@3.9.0:
+ resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /cjs-module-lexer@1.2.3:
+ resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==}
+ dev: true
+
+ /cli-boxes@2.2.1:
+ resolution: {integrity: sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==}
+ engines: {node: '>=6'}
+
+ /cli-cursor@3.1.0:
+ resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==}
+ engines: {node: '>=8'}
+ dependencies:
+ restore-cursor: 3.1.0
+
+ /cli-cursor@4.0.0:
+ resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ restore-cursor: 4.0.0
+ dev: true
+
+ /cli-spinners@2.9.2:
+ resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==}
+ engines: {node: '>=6'}
+
+ /cli-truncate@4.0.0:
+ resolution: {integrity: sha512-nPdaFdQ0h/GEigbPClz11D0v/ZJEwxmeVZGeMo3Z5StPtUTkA9o1lD6QwoirYiSDzbcwn2XcjwmCp68W1IS4TA==}
+ engines: {node: '>=18'}
+ dependencies:
+ slice-ansi: 5.0.0
+ string-width: 7.1.0
+ dev: true
+
+ /cliui@6.0.0:
+ resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 6.2.0
+ dev: true
+
+ /cliui@8.0.1:
+ resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ wrap-ansi: 7.0.0
+ dev: true
+
+ /clone@1.0.4:
+ resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
+ engines: {node: '>=0.8'}
+
+ /co@4.6.0:
+ resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==}
+ engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'}
+ dev: true
+
+ /collect-v8-coverage@1.0.2:
+ resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==}
+ dev: true
+
+ /color-convert@1.9.3:
+ resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
+ dependencies:
+ color-name: 1.1.3
+ dev: true
+
+ /color-convert@2.0.1:
+ resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
+ engines: {node: '>=7.0.0'}
+ dependencies:
+ color-name: 1.1.4
+
+ /color-name@1.1.3:
+ resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
+ dev: true
+
+ /color-name@1.1.4:
+ resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
+
+ /colorette@2.0.20:
+ resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==}
+ dev: true
+
+ /commander@11.1.0:
+ resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==}
+ engines: {node: '>=16'}
+ dev: true
+
+ /commander@8.3.0:
+ resolution: {integrity: sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==}
+ engines: {node: '>= 12'}
+
+ /common-tags@1.8.2:
+ resolution: {integrity: sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==}
+ engines: {node: '>=4.0.0'}
+ dev: true
+
+ /compare-func@2.0.0:
+ resolution: {integrity: sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==}
+ dependencies:
+ array-ify: 1.0.0
+ dot-prop: 5.3.0
+ dev: true
+
+ /concat-map@0.0.1:
+ resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ dev: true
+
+ /config-chain@1.1.13:
+ resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
+ dependencies:
+ ini: 1.3.8
+ proto-list: 1.2.4
+
+ /confusing-browser-globals@1.0.11:
+ resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==}
+ dev: true
+
+ /conventional-changelog-angular@7.0.0:
+ resolution: {integrity: sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==}
+ engines: {node: '>=16'}
+ dependencies:
+ compare-func: 2.0.0
+ dev: true
+
+ /conventional-changelog-conventionalcommits@7.0.2:
+ resolution: {integrity: sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==}
+ engines: {node: '>=16'}
+ dependencies:
+ compare-func: 2.0.0
+ dev: true
+
+ /conventional-commits-parser@5.0.0:
+ resolution: {integrity: sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dependencies:
+ JSONStream: 1.3.5
+ is-text-path: 2.0.0
+ meow: 12.1.1
+ split2: 4.2.0
+ dev: true
+
+ /convert-source-map@2.0.0:
+ resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ dev: true
+
+ /core-util-is@1.0.3:
+ resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==}
+
+ /cosmiconfig-typescript-loader@5.0.0(@types/node@20.12.6)(cosmiconfig@9.0.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==}
+ engines: {node: '>=v16'}
+ peerDependencies:
+ '@types/node': '*'
+ cosmiconfig: '>=8.2'
+ typescript: '>=4'
+ dependencies:
+ '@types/node': 20.12.6
+ cosmiconfig: 9.0.0(typescript@5.4.4)
+ jiti: 1.21.0
+ typescript: 5.4.4
+ dev: true
+
+ /cosmiconfig@9.0.0(typescript@5.4.4):
+ resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==}
+ engines: {node: '>=14'}
+ peerDependencies:
+ typescript: '>=4.9.5'
+ peerDependenciesMeta:
+ typescript:
+ optional: true
+ dependencies:
+ env-paths: 2.2.1
+ import-fresh: 3.3.0
+ js-yaml: 4.1.0
+ parse-json: 5.2.0
+ typescript: 5.4.4
+ dev: true
+
+ /create-jest@29.7.0(@types/node@20.12.6):
+ resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ hasBin: true
+ dependencies:
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ exit: 0.1.2
+ graceful-fs: 4.2.10
+ jest-config: 29.7.0(@types/node@20.12.6)
+ jest-util: 29.7.0
+ prompts: 2.4.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+ dev: true
+
+ /cross-spawn@5.1.0:
+ resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==}
+ dependencies:
+ lru-cache: 4.1.5
+ shebang-command: 1.2.0
+ which: 1.3.1
+ dev: true
+
+ /cross-spawn@7.0.3:
+ resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==}
+ engines: {node: '>= 8'}
+ dependencies:
+ path-key: 3.1.1
+ shebang-command: 2.0.0
+ which: 2.0.2
+ dev: true
+
+ /csv-generate@3.4.3:
+ resolution: {integrity: sha512-w/T+rqR0vwvHqWs/1ZyMDWtHHSJaN06klRqJXBEpDJaM/+dZkso0OKh1VcuuYvK3XM53KysVNq8Ko/epCK8wOw==}
+ dev: true
+
+ /csv-parse@4.16.3:
+ resolution: {integrity: sha512-cO1I/zmz4w2dcKHVvpCr7JVRu8/FymG5OEpmvsZYlccYolPBLoVGKUHgNoc4ZGkFeFlWGEDmMyBM+TTqRdW/wg==}
+ dev: true
+
+ /csv-stringify@5.6.5:
+ resolution: {integrity: sha512-PjiQ659aQ+fUTQqSrd1XEDnOr52jh30RBurfzkscaE2tPaFsDH5wOAHJiw8XAHphRknCwMUE9KRayc4K/NbO8A==}
+ dev: true
+
+ /csv@5.5.3:
+ resolution: {integrity: sha512-QTaY0XjjhTQOdguARF0lGKm5/mEq9PD9/VhZZegHDIBq2tQwgNpHc3dneD4mGo2iJs+fTKv5Bp0fZ+BRuY3Z0g==}
+ engines: {node: '>= 0.1.90'}
+ dependencies:
+ csv-generate: 3.4.3
+ csv-parse: 4.16.3
+ csv-stringify: 5.6.5
+ stream-transform: 2.1.3
+ dev: true
+
+ /damerau-levenshtein@1.0.8:
+ resolution: {integrity: sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==}
+ dev: true
+
+ /dargs@8.1.0:
+ resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /data-view-buffer@1.0.1:
+ resolution: {integrity: sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /data-view-byte-length@1.0.1:
+ resolution: {integrity: sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /data-view-byte-offset@1.0.0:
+ resolution: {integrity: sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-data-view: 1.0.1
+ dev: true
+
+ /debug@3.2.7:
+ resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+ dev: true
+
+ /debug@4.3.4:
+ resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==}
+ engines: {node: '>=6.0'}
+ peerDependencies:
+ supports-color: '*'
+ peerDependenciesMeta:
+ supports-color:
+ optional: true
+ dependencies:
+ ms: 2.1.2
+
+ /decamelize-keys@1.1.1:
+ resolution: {integrity: sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ decamelize: 1.2.0
+ map-obj: 1.0.1
+ dev: true
+
+ /decamelize@1.2.0:
+ resolution: {integrity: sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /decamelize@5.0.1:
+ resolution: {integrity: sha512-VfxadyCECXgQlkoEAjeghAr5gY3Hf+IKjKb+X8tGVDtveCjN+USwprd2q3QXBR9T1+x2DG0XZF5/w+7HAtSaXA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /decompress-response@7.0.0:
+ resolution: {integrity: sha512-6IvPrADQyyPGLpMnUh6kfKiqy7SrbXbjoUuZ90WMBJKErzv2pCiwlGEXjRX9/54OnTq+XFVnkOnOMzclLI5aEA==}
+ engines: {node: '>=10'}
+ dependencies:
+ mimic-response: 3.1.0
+
+ /dedent@1.5.1:
+ resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==}
+ peerDependencies:
+ babel-plugin-macros: ^3.1.0
+ peerDependenciesMeta:
+ babel-plugin-macros:
+ optional: true
+ dev: true
+
+ /deep-equal@2.2.3:
+ resolution: {integrity: sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ array-buffer-byte-length: 1.0.1
+ call-bind: 1.0.7
+ es-get-iterator: 1.1.3
+ get-intrinsic: 1.2.4
+ is-arguments: 1.1.1
+ is-array-buffer: 3.0.4
+ is-date-object: 1.0.5
+ is-regex: 1.1.4
+ is-shared-array-buffer: 1.0.3
+ isarray: 2.0.5
+ object-is: 1.1.6
+ object-keys: 1.1.1
+ object.assign: 4.1.5
+ regexp.prototype.flags: 1.5.2
+ side-channel: 1.0.6
+ which-boxed-primitive: 1.0.2
+ which-collection: 1.0.2
+ which-typed-array: 1.1.15
+ dev: true
+
+ /deep-extend@0.6.0:
+ resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==}
+ engines: {node: '>=4.0.0'}
+
+ /deep-is@0.1.4:
+ resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ dev: true
+
+ /deepmerge@4.3.1:
+ resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /defaults@1.0.4:
+ resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==}
+ dependencies:
+ clone: 1.0.4
+
+ /define-data-property@1.1.4:
+ resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-define-property: 1.0.0
+ es-errors: 1.3.0
+ gopd: 1.0.1
+ dev: true
+
+ /define-properties@1.2.1:
+ resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ has-property-descriptors: 1.0.2
+ object-keys: 1.1.1
+ dev: true
+
+ /dequal@2.0.3:
+ resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /detect-indent@6.1.0:
+ resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /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'}
+ dev: true
+
+ /detect-newline@4.0.1:
+ resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+
+ /diff-sequences@29.6.3:
+ resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /dir-glob@3.0.1:
+ resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-type: 4.0.0
+
+ /doctrine@2.1.0:
+ resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /doctrine@3.0.0:
+ resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ esutils: 2.0.3
+ dev: true
+
+ /dom-accessibility-api@0.5.16:
+ resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
+ dev: true
+
+ /dot-prop@5.3.0:
+ resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==}
+ engines: {node: '>=8'}
+ dependencies:
+ is-obj: 2.0.0
+ dev: true
+
+ /electron-to-chromium@1.4.730:
+ resolution: {integrity: sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==}
+
+ /emittery@0.13.1:
+ resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /emoji-regex@10.3.0:
+ resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==}
+ dev: true
+
+ /emoji-regex@8.0.0:
+ resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==}
+
+ /emoji-regex@9.2.2:
+ resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==}
+ dev: true
+
+ /enhanced-resolve@5.16.0:
+ resolution: {integrity: sha512-O+QWCviPNSSLAD9Ucn8Awv+poAkqn3T1XY5/N7kR7rQO9yfSGWkYZDwpJ+iKF7B8rxaQKWngSqACpgzeapSyoA==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ graceful-fs: 4.2.10
+ tapable: 2.2.1
+ dev: true
+
+ /enquirer@2.4.1:
+ resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ ansi-colors: 4.1.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /env-paths@2.2.1:
+ resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /error-ex@1.3.2:
+ resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
+ dependencies:
+ is-arrayish: 0.2.1
+ dev: true
+
+ /es-abstract@1.23.3:
+ resolution: {integrity: sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==}
+ engines: {node: '>= 0.4'}
+ 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.3
+ 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
+ dev: true
+
+ /es-define-property@1.0.0:
+ resolution: {integrity: sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /es-errors@1.3.0:
+ resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /es-get-iterator@1.1.3:
+ resolution: {integrity: sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ is-arguments: 1.1.1
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-string: 1.0.7
+ isarray: 2.0.5
+ stop-iteration-iterator: 1.0.0
+ dev: true
+
+ /es-iterator-helpers@1.0.18:
+ resolution: {integrity: sha512-scxAJaewsahbqTYrGKJihhViaM6DDZDDoucfvzNbK0pOren1g/daDQ3IAhzn+1G14rBG7w+i5N+qul60++zlKA==}
+ engines: {node: '>= 0.4'}
+ 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.3
+ 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
+ dev: true
+
+ /es-object-atoms@1.0.0:
+ resolution: {integrity: sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ dev: true
+
+ /es-set-tostringtag@2.0.3:
+ resolution: {integrity: sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ get-intrinsic: 1.2.4
+ has-tostringtag: 1.0.2
+ hasown: 2.0.2
+ dev: true
+
+ /es-shim-unscopables@1.0.2:
+ resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
+ dependencies:
+ hasown: 2.0.2
+ dev: true
+
+ /es-to-primitive@1.2.1:
+ resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-callable: 1.2.7
+ is-date-object: 1.0.5
+ is-symbol: 1.0.4
+ dev: true
+
+ /esbuild-register@3.5.0(esbuild@0.19.11):
+ resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==}
+ peerDependencies:
+ esbuild: '>=0.12 <1'
+ dependencies:
+ debug: 4.3.4
+ esbuild: 0.19.11
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /esbuild-register@3.5.0(esbuild@0.20.2):
+ resolution: {integrity: sha512-+4G/XmakeBAsvJuDugJvtyF1x+XJT4FMocynNpxrvEBViirpfUn2PgNpCHedfWhF4WokNsO/OvMKrmJOIJsI5A==}
+ peerDependencies:
+ esbuild: '>=0.12 <1'
+ dependencies:
+ debug: 4.3.4
+ esbuild: 0.20.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: false
+
+ /esbuild@0.19.11:
+ resolution: {integrity: sha512-HJ96Hev2hX/6i5cDVwcqiJBBtuo9+FeIJOtZ9W1kA5M6AMJRHUZlpYZ1/SbEwtO0ioNAW8rUooVpC/WehY2SfA==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.19.11
+ '@esbuild/android-arm': 0.19.11
+ '@esbuild/android-arm64': 0.19.11
+ '@esbuild/android-x64': 0.19.11
+ '@esbuild/darwin-arm64': 0.19.11
+ '@esbuild/darwin-x64': 0.19.11
+ '@esbuild/freebsd-arm64': 0.19.11
+ '@esbuild/freebsd-x64': 0.19.11
+ '@esbuild/linux-arm': 0.19.11
+ '@esbuild/linux-arm64': 0.19.11
+ '@esbuild/linux-ia32': 0.19.11
+ '@esbuild/linux-loong64': 0.19.11
+ '@esbuild/linux-mips64el': 0.19.11
+ '@esbuild/linux-ppc64': 0.19.11
+ '@esbuild/linux-riscv64': 0.19.11
+ '@esbuild/linux-s390x': 0.19.11
+ '@esbuild/linux-x64': 0.19.11
+ '@esbuild/netbsd-x64': 0.19.11
+ '@esbuild/openbsd-x64': 0.19.11
+ '@esbuild/sunos-x64': 0.19.11
+ '@esbuild/win32-arm64': 0.19.11
+ '@esbuild/win32-ia32': 0.19.11
+ '@esbuild/win32-x64': 0.19.11
+ dev: true
+
+ /esbuild@0.20.2:
+ resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==}
+ engines: {node: '>=12'}
+ hasBin: true
+ requiresBuild: true
+ 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
+ dev: false
+
+ /escalade@3.1.2:
+ resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==}
+ engines: {node: '>=6'}
+
+ /escape-string-regexp@1.0.5:
+ resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==}
+ engines: {node: '>=0.8.0'}
+ dev: true
+
+ /escape-string-regexp@2.0.0:
+ resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /escape-string-regexp@4.0.0:
+ resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.29.1)(eslint@8.45.0):
+ resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ peerDependencies:
+ eslint: ^7.32.0 || ^8.2.0
+ eslint-plugin-import: ^2.25.2
+ dependencies:
+ confusing-browser-globals: 1.0.11
+ eslint: 8.45.0
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.56.0)
+ object.assign: 4.1.5
+ object.entries: 1.1.8
+ semver: 6.3.1
+ dev: true
+
+ /eslint-config-airbnb-typescript@17.1.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.45.0):
+ resolution: {integrity: sha512-GPxI5URre6dDpJ0CtcthSZVBAfI+Uw7un5OYNVxP2EYi3H81Jw701yFP7AU+/vCE7xBtFmjge7kfhhk4+RAiig==}
+ peerDependencies:
+ '@typescript-eslint/eslint-plugin': ^5.13.0 || ^6.0.0
+ '@typescript-eslint/parser': ^5.0.0 || ^6.0.0
+ eslint: ^7.32.0 || ^8.2.0
+ eslint-plugin-import: ^2.25.3
+ dependencies:
+ '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.45.0)(typescript@5.4.4)
+ '@typescript-eslint/parser': 5.62.0(eslint@8.45.0)(typescript@5.4.4)
+ eslint: 8.45.0
+ eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.45.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.56.0)
+ dev: true
+
+ /eslint-config-airbnb@19.0.4(eslint-plugin-import@2.29.1)(eslint-plugin-jsx-a11y@6.8.0)(eslint-plugin-react-hooks@4.6.0)(eslint-plugin-react@7.34.1)(eslint@8.45.0):
+ resolution: {integrity: sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==}
+ engines: {node: ^10.12.0 || ^12.22.0 || ^14.17.0 || >=16.0.0}
+ peerDependencies:
+ eslint: ^7.32.0 || ^8.2.0
+ eslint-plugin-import: ^2.25.3
+ eslint-plugin-jsx-a11y: ^6.5.1
+ eslint-plugin-react: ^7.28.0
+ eslint-plugin-react-hooks: ^4.3.0
+ dependencies:
+ eslint: 8.45.0
+ eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.29.1)(eslint@8.45.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.56.0)
+ eslint-plugin-jsx-a11y: 6.8.0(eslint@8.56.0)
+ eslint-plugin-react: 7.34.1(eslint@8.56.0)
+ eslint-plugin-react-hooks: 4.6.0(eslint@8.56.0)
+ object.assign: 4.1.5
+ object.entries: 1.1.8
+ dev: true
+
+ /eslint-config-prettier@8.10.0(eslint@8.45.0):
+ resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==}
+ hasBin: true
+ peerDependencies:
+ eslint: '>=7.0.0'
+ dependencies:
+ eslint: 8.45.0
+ dev: true
+
+ /eslint-etc@5.2.1(eslint@8.56.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-lFJBSiIURdqQKq9xJhvSJFyPA+VeTh5xvk24e8pxVL7bwLBtGF60C/KRkLTMrvCZ6DA3kbPuYhLWY0TZMlqTsg==}
+ peerDependencies:
+ eslint: ^8.0.0
+ typescript: '>=4.0.0'
+ dependencies:
+ '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.56.0)(typescript@5.4.4)
+ eslint: 8.56.0
+ tsutils: 3.21.0(typescript@5.4.4)
+ tsutils-etc: 1.4.2(tsutils@3.21.0)(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-import-resolver-node@0.3.9:
+ resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==}
+ dependencies:
+ debug: 3.2.7
+ is-core-module: 2.13.1
+ resolve: 1.22.8
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-import-resolver-typescript@3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.45.0):
+ resolution: {integrity: sha512-xgdptdoi5W3niYeuQxKmzVDTATvLYqhpwmykwsh7f6HIOStGWEIL9iqZgQDF9u9OEzrRwR8no5q2VT+bjAujTg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ peerDependencies:
+ eslint: '*'
+ eslint-plugin-import: '*'
+ dependencies:
+ debug: 4.3.4
+ enhanced-resolve: 5.16.0
+ eslint: 8.45.0
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.45.0)
+ eslint-plugin-import: 2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.56.0)
+ fast-glob: 3.3.2
+ get-tsconfig: 4.7.3
+ 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
+ dev: true
+
+ /eslint-module-utils@2.8.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.6.1)(eslint@8.45.0):
+ 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
+ dependencies:
+ '@typescript-eslint/parser': 5.62.0(eslint@8.45.0)(typescript@5.4.4)
+ debug: 3.2.7
+ eslint: 8.45.0
+ eslint-import-resolver-typescript: 3.6.1(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.29.1)(eslint@8.45.0)
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-module-utils@2.8.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.0):
+ 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
+ dependencies:
+ '@typescript-eslint/parser': 7.6.0(eslint@8.56.0)(typescript@5.4.4)
+ debug: 3.2.7
+ eslint: 8.56.0
+ eslint-import-resolver-node: 0.3.9
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-check-file@2.7.1(eslint@8.45.0):
+ resolution: {integrity: sha512-vPCcKE+jHthIVLTwyCv61uygT/day3wuPTk/WASS/xPqbz0hTPxMTYIE5qBXSpSZVPdfj+H1kUAtdaLCYtfHBg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ eslint: '>=7.28.0'
+ dependencies:
+ eslint: 8.45.0
+ is-glob: 4.0.3
+ micromatch: 4.0.5
+ dev: true
+
+ /eslint-plugin-es@3.0.1(eslint@8.45.0):
+ resolution: {integrity: sha512-GUmAsJaN4Fc7Gbtl8uOBlayo2DqhwWvEzykMHSCZHU3XdJ+NSzzZcVhXh3VxX5icqQ+oQdIEawXX8xkR3mIFmQ==}
+ engines: {node: '>=8.10.0'}
+ peerDependencies:
+ eslint: '>=4.19.1'
+ dependencies:
+ eslint: 8.45.0
+ eslint-utils: 2.1.0
+ regexpp: 3.2.0
+ dev: true
+
+ /eslint-plugin-import@2.29.1(@typescript-eslint/parser@7.6.0)(eslint@8.56.0):
+ 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
+ dependencies:
+ '@typescript-eslint/parser': 7.6.0(eslint@8.56.0)(typescript@5.4.4)
+ 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: 8.56.0
+ eslint-import-resolver-node: 0.3.9
+ eslint-module-utils: 2.8.1(@typescript-eslint/parser@7.6.0)(eslint-import-resolver-node@0.3.9)(eslint@8.56.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
+ transitivePeerDependencies:
+ - eslint-import-resolver-typescript
+ - eslint-import-resolver-webpack
+ - supports-color
+ dev: true
+
+ /eslint-plugin-jest-dom@4.0.3(eslint@8.45.0):
+ resolution: {integrity: sha512-9j+n8uj0+V0tmsoS7bYC7fLhQmIvjRqRYEcbDSi+TKPsTThLLXCyj5swMSSf/hTleeMktACnn+HFqXBr5gbcbA==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6', yarn: '>=1'}
+ peerDependencies:
+ eslint: ^6.8.0 || ^7.0.0 || ^8.0.0
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@testing-library/dom': 8.20.1
+ eslint: 8.45.0
+ requireindex: 1.2.0
+ dev: true
+
+ /eslint-plugin-jsx-a11y@6.8.0(eslint@8.56.0):
+ resolution: {integrity: sha512-Hdh937BS3KdwwbBaKd5+PLCOmYY6U4f2h9Z2ktwtNKvIdIEu137rjYbcb9ApSbVJfWxANNuiKTD/9tOKjK9qOA==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ dependencies:
+ '@babel/runtime': 7.24.4
+ 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.18
+ eslint: 8.56.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
+ dev: true
+
+ /eslint-plugin-node@11.1.0(eslint@8.45.0):
+ resolution: {integrity: sha512-oUwtPJ1W0SKD0Tr+wqu92c5xuCeQqB3hSCHasn/ZgjFdA9iDGNkNf2Zi9ztY7X+hNuMib23LNGRm6+uN+KLE3g==}
+ engines: {node: '>=8.10.0'}
+ peerDependencies:
+ eslint: '>=5.16.0'
+ dependencies:
+ eslint: 8.45.0
+ eslint-plugin-es: 3.0.1(eslint@8.45.0)
+ eslint-utils: 2.1.0
+ ignore: 5.3.1
+ minimatch: 3.1.2
+ resolve: 1.22.8
+ semver: 6.3.1
+ dev: true
+
+ /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.45.0)(prettier@2.8.8):
+ resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ eslint: '>=7.28.0'
+ eslint-config-prettier: '*'
+ prettier: '>=2.0.0'
+ peerDependenciesMeta:
+ eslint-config-prettier:
+ optional: true
+ dependencies:
+ eslint: 8.45.0
+ eslint-config-prettier: 8.10.0(eslint@8.45.0)
+ prettier: 2.8.8
+ prettier-linter-helpers: 1.0.0
+ dev: true
+
+ /eslint-plugin-react-hooks@4.6.0(eslint@8.56.0):
+ resolution: {integrity: sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==}
+ engines: {node: '>=10'}
+ peerDependencies:
+ eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0
+ dependencies:
+ eslint: 8.56.0
+ dev: true
+
+ /eslint-plugin-react@7.34.1(eslint@8.56.0):
+ resolution: {integrity: sha512-N97CxlouPT1AHt8Jn0mhhN2RrADlUAsk1/atcT2KyA/l9Q/E6ll7OIGwNumFmWfZ9skV3XXccYS19h80rHtgkw==}
+ engines: {node: '>=4'}
+ peerDependencies:
+ eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8
+ 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.18
+ eslint: 8.56.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
+ dev: true
+
+ /eslint-plugin-rxjs@5.0.3(eslint@8.56.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-fcVkqLmYLRfRp+ShafjpUKuaZ+cw/sXAvM5dfSxiEr7M28QZ/NY7vaOr09FB4rSaZsQyLBnNPh5SL+4EgKjh8Q==}
+ peerDependencies:
+ eslint: ^8.0.0
+ typescript: '>=4.0.0'
+ dependencies:
+ '@typescript-eslint/experimental-utils': 5.62.0(eslint@8.56.0)(typescript@5.4.4)
+ common-tags: 1.8.2
+ decamelize: 5.0.1
+ eslint: 8.56.0
+ eslint-etc: 5.2.1(eslint@8.56.0)(typescript@5.4.4)
+ requireindex: 1.2.0
+ rxjs-report-usage: 1.0.6
+ tslib: 2.6.2
+ tsutils: 3.21.0(typescript@5.4.4)
+ tsutils-etc: 1.4.2(tsutils@3.21.0)(typescript@5.4.4)
+ typescript: 5.4.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint-plugin-testing-library@5.11.1(eslint@8.45.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-5eX9e1Kc2PqVRed3taaLnAAqPZGEX75C+M/rXzUAI3wIg/ZxzUm1OVAwfe/O+vE+6YXOLetSe9g5GKD2ecXipw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0, npm: '>=6'}
+ peerDependencies:
+ eslint: ^7.5.0 || ^8.0.0
+ dependencies:
+ '@typescript-eslint/utils': 5.62.0(eslint@8.45.0)(typescript@5.4.4)
+ eslint: 8.45.0
+ transitivePeerDependencies:
+ - supports-color
+ - typescript
+ dev: true
+
+ /eslint-scope@5.1.1:
+ resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
+ engines: {node: '>=8.0.0'}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 4.3.0
+ dev: true
+
+ /eslint-scope@7.2.2:
+ resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ esrecurse: 4.3.0
+ estraverse: 5.3.0
+ dev: true
+
+ /eslint-utils@2.1.0:
+ resolution: {integrity: sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==}
+ engines: {node: '>=6'}
+ dependencies:
+ eslint-visitor-keys: 1.3.0
+ dev: true
+
+ /eslint-visitor-keys@1.3.0:
+ resolution: {integrity: sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /eslint-visitor-keys@2.1.0:
+ resolution: {integrity: sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /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}
+ dev: true
+
+ /eslint@8.45.0:
+ resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0)
+ '@eslint-community/regexpp': 4.10.0
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.44.0
+ '@humanwhocodes/config-array': 0.11.14
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.5.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.24.0
+ graphemer: 1.4.0
+ ignore: 5.3.1
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ 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.3
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /eslint@8.56.0:
+ resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ hasBin: true
+ dependencies:
+ '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0)
+ '@eslint-community/regexpp': 4.10.0
+ '@eslint/eslintrc': 2.1.4
+ '@eslint/js': 8.56.0
+ '@humanwhocodes/config-array': 0.11.14
+ '@humanwhocodes/module-importer': 1.0.1
+ '@nodelib/fs.walk': 1.2.8
+ '@ungap/structured-clone': 1.2.0
+ ajv: 6.12.6
+ chalk: 4.1.2
+ cross-spawn: 7.0.3
+ debug: 4.3.4
+ doctrine: 3.0.0
+ escape-string-regexp: 4.0.0
+ eslint-scope: 7.2.2
+ eslint-visitor-keys: 3.4.3
+ espree: 9.6.1
+ esquery: 1.5.0
+ esutils: 2.0.3
+ fast-deep-equal: 3.1.3
+ file-entry-cache: 6.0.1
+ find-up: 5.0.0
+ glob-parent: 6.0.2
+ globals: 13.24.0
+ graphemer: 1.4.0
+ ignore: 5.3.1
+ imurmurhash: 0.1.4
+ is-glob: 4.0.3
+ is-path-inside: 3.0.3
+ js-yaml: 4.1.0
+ 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.3
+ strip-ansi: 6.0.1
+ text-table: 0.2.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /espree@9.6.1:
+ resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
+ engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
+ dependencies:
+ acorn: 8.11.3
+ acorn-jsx: 5.3.2(acorn@8.11.3)
+ eslint-visitor-keys: 3.4.3
+ dev: true
+
+ /esprima@4.0.1:
+ resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /esquery@1.5.0:
+ resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /esrecurse@4.3.0:
+ resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ estraverse: 5.3.0
+ dev: true
+
+ /estraverse@4.3.0:
+ resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /estraverse@5.3.0:
+ resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
+ engines: {node: '>=4.0'}
+ dev: true
+
+ /esutils@2.0.3:
+ resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /eventemitter3@5.0.1:
+ resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==}
+ dev: true
+
+ /execa@5.1.1:
+ resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==}
+ engines: {node: '>=10'}
+ 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
+ dev: true
+
+ /execa@8.0.1:
+ resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==}
+ engines: {node: '>=16.17'}
+ 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
+ dev: true
+
+ /exit@0.1.2:
+ resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /expect@29.7.0:
+ resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.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
+ dev: true
+
+ /extendable-error@0.1.7:
+ resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==}
+ dev: true
+
+ /external-editor@3.1.0:
+ resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==}
+ engines: {node: '>=4'}
+ dependencies:
+ chardet: 0.7.0
+ iconv-lite: 0.4.24
+ tmp: 0.0.33
+ dev: true
+
+ /fast-deep-equal@3.1.3:
+ resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
+ dev: true
+
+ /fast-diff@1.3.0:
+ resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==}
+ dev: true
+
+ /fast-glob@3.3.2:
+ resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==}
+ engines: {node: '>=8.6.0'}
+ 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:
+ resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==}
+ dev: true
+
+ /fast-levenshtein@2.0.6:
+ resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==}
+ dev: true
+
+ /fastq@1.17.1:
+ resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==}
+ dependencies:
+ reusify: 1.0.4
+
+ /fb-watchman@2.0.2:
+ resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==}
+ dependencies:
+ bser: 2.1.1
+ dev: true
+
+ /file-entry-cache@6.0.1:
+ resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flat-cache: 3.2.0
+ dev: true
+
+ /fill-range@7.0.1:
+ resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ to-regex-range: 5.0.1
+
+ /find-up@3.0.0:
+ resolution: {integrity: sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==}
+ engines: {node: '>=6'}
+ dependencies:
+ locate-path: 3.0.0
+
+ /find-up@4.1.0:
+ resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==}
+ engines: {node: '>=8'}
+ dependencies:
+ locate-path: 5.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /find-up@5.0.0:
+ resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==}
+ engines: {node: '>=10'}
+ dependencies:
+ locate-path: 6.0.0
+ path-exists: 4.0.0
+ dev: true
+
+ /find-up@7.0.0:
+ resolution: {integrity: sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==}
+ engines: {node: '>=18'}
+ dependencies:
+ locate-path: 7.2.0
+ path-exists: 5.0.0
+ unicorn-magic: 0.1.0
+ dev: true
+
+ /find-yarn-workspace-root2@1.2.16:
+ resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==}
+ dependencies:
+ micromatch: 4.0.5
+ pkg-dir: 4.2.0
+ dev: true
+
+ /flat-cache@3.2.0:
+ resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==}
+ engines: {node: ^10.12.0 || >=12.0.0}
+ dependencies:
+ flatted: 3.3.1
+ keyv: 4.5.4
+ rimraf: 3.0.2
+ dev: true
+
+ /flatted@3.3.1:
+ resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==}
+ dev: true
+
+ /follow-redirects@1.15.6(debug@4.3.4):
+ resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==}
+ engines: {node: '>=4.0'}
+ peerDependencies:
+ debug: '*'
+ peerDependenciesMeta:
+ debug:
+ optional: true
+ dependencies:
+ debug: 4.3.4
+
+ /for-each@0.3.3:
+ resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==}
+ dependencies:
+ is-callable: 1.2.7
+ dev: true
+
+ /from2@2.3.0:
+ resolution: {integrity: sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==}
+ dependencies:
+ inherits: 2.0.4
+ readable-stream: 2.3.8
+
+ /fs-extra@7.0.1:
+ resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==}
+ engines: {node: '>=6 <7 || >=8'}
+ dependencies:
+ graceful-fs: 4.2.10
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+ dev: true
+
+ /fs-extra@8.1.0:
+ resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==}
+ engines: {node: '>=6 <7 || >=8'}
+ dependencies:
+ graceful-fs: 4.2.10
+ jsonfile: 4.0.0
+ universalify: 0.1.2
+ dev: true
+
+ /fs.realpath@1.0.0:
+ resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ dev: true
+
+ /fsevents@2.3.3:
+ resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+ requiresBuild: true
+ optional: true
+
+ /function-bind@1.1.2:
+ resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
+ dev: true
+
+ /function.prototype.name@1.1.6:
+ resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ functions-have-names: 1.2.3
+ dev: true
+
+ /functions-have-names@1.2.3:
+ resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
+ dev: true
+
+ /gensync@1.0.0-beta.2:
+ resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
+ engines: {node: '>=6.9.0'}
+ dev: true
+
+ /get-caller-file@2.0.5:
+ resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
+ engines: {node: 6.* || 8.* || >= 10.*}
+ dev: true
+
+ /get-east-asian-width@1.2.0:
+ resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /get-intrinsic@1.2.4:
+ resolution: {integrity: sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==}
+ engines: {node: '>= 0.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
+ dev: true
+
+ /get-it@8.4.18:
+ resolution: {integrity: sha512-cOrL+qRSix45onwUNEO/ITrtuh2cvJT+vCFG2qahC/dFBC2z03LxLTwAZ33VPptoytBJN4Ht0AdnYCDBUm/M+Q==}
+ engines: {node: '>=14.0.0'}
+ dependencies:
+ debug: 4.3.4
+ decompress-response: 7.0.0
+ follow-redirects: 1.15.6(debug@4.3.4)
+ into-stream: 6.0.0
+ is-plain-object: 5.0.0
+ is-retry-allowed: 2.2.0
+ is-stream: 2.0.1
+ parse-headers: 2.0.5
+ progress-stream: 2.0.0
+ tunnel-agent: 0.6.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /get-latest-version@5.1.0:
+ resolution: {integrity: sha512-Q6IBWr/zzw57zIkJmNhI23eRTw3nZ4BWWK034meLwOYU9L3J3IpXiyM73u2pYUwN6U7ahkerCwg2T0jlxiLwsw==}
+ engines: {node: '>=14.18'}
+ dependencies:
+ get-it: 8.4.18
+ registry-auth-token: 5.0.2
+ registry-url: 5.1.0
+ semver: 7.6.0
+ transitivePeerDependencies:
+ - supports-color
+
+ /get-package-type@0.1.0:
+ resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==}
+ engines: {node: '>=8.0.0'}
+ dev: true
+
+ /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'}
+ dev: true
+
+ /get-stream@8.0.1:
+ resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
+ engines: {node: '>=16'}
+ dev: true
+
+ /get-symbol-description@1.0.2:
+ resolution: {integrity: sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /get-tsconfig@4.7.3:
+ resolution: {integrity: sha512-ZvkrzoUA0PQZM6fy6+/Hce561s+faD1rsNwhnO5FelNjyy7EMGJ3Rz1AQ8GYDWjhRs/7dBLOEJvhK8MiEJOAFg==}
+ dependencies:
+ resolve-pkg-maps: 1.0.0
+ dev: true
+
+ /git-hooks-list@3.1.0:
+ resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==}
+
+ /git-raw-commits@4.0.0:
+ resolution: {integrity: sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==}
+ engines: {node: '>=16'}
+ hasBin: true
+ dependencies:
+ dargs: 8.1.0
+ meow: 12.1.1
+ split2: 4.2.0
+ dev: true
+
+ /git-up@7.0.0:
+ resolution: {integrity: sha512-ONdIrbBCFusq1Oy0sC71F5azx8bVkvtZtMJAsv+a6lz5YAmbNnLD6HAB4gptHZVLPR8S2/kVN6Gab7lryq5+lQ==}
+ dependencies:
+ is-ssh: 1.4.0
+ parse-url: 8.1.0
+
+ /git-url-parse@13.1.1:
+ resolution: {integrity: sha512-PCFJyeSSdtnbfhSNRw9Wk96dDCNx+sogTe4YNXeXSJxt7xz5hvXekuRn9JX7m+Mf4OscCu8h+mtAl3+h5Fo8lQ==}
+ dependencies:
+ git-up: 7.0.0
+
+ /glob-parent@5.1.2:
+ resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==}
+ engines: {node: '>= 6'}
+ dependencies:
+ is-glob: 4.0.3
+
+ /glob-parent@6.0.2:
+ resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==}
+ engines: {node: '>=10.13.0'}
+ dependencies:
+ is-glob: 4.0.3
+ dev: true
+
+ /glob@7.2.3:
+ resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==}
+ 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
+ dev: true
+
+ /global-directory@4.0.1:
+ resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==}
+ engines: {node: '>=18'}
+ dependencies:
+ ini: 4.1.1
+ dev: true
+
+ /globals@11.12.0:
+ resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /globals@13.24.0:
+ resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ type-fest: 0.20.2
+ dev: true
+
+ /globalthis@1.0.3:
+ resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.1
+ dev: true
+
+ /globby@11.1.0:
+ resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
+ engines: {node: '>=10'}
+ 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
+ dev: true
+
+ /globby@13.2.2:
+ resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ dir-glob: 3.0.1
+ fast-glob: 3.3.2
+ ignore: 5.3.1
+ merge2: 1.4.1
+ slash: 4.0.0
+
+ /gopd@1.0.1:
+ resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==}
+ dependencies:
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /graceful-fs@4.2.10:
+ resolution: {integrity: sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==}
+
+ /grapheme-splitter@1.0.4:
+ resolution: {integrity: sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==}
+ dev: true
+
+ /graphemer@1.4.0:
+ resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
+ dev: true
+
+ /hard-rejection@2.1.0:
+ resolution: {integrity: sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /has-bigints@1.0.2:
+ resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==}
+ dev: true
+
+ /has-flag@3.0.0:
+ resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /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==}
+ dependencies:
+ es-define-property: 1.0.0
+ dev: true
+
+ /has-proto@1.0.3:
+ resolution: {integrity: sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-symbols@1.0.3:
+ resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /has-tostringtag@1.0.2:
+ resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /hasown@2.0.2:
+ resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ function-bind: 1.1.2
+ dev: true
+
+ /hosted-git-info@2.8.9:
+ resolution: {integrity: sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==}
+ dev: true
+
+ /html-escaper@2.0.2:
+ resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==}
+ dev: true
+
+ /human-id@1.0.2:
+ resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==}
+ dev: true
+
+ /human-signals@2.1.0:
+ resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==}
+ engines: {node: '>=10.17.0'}
+ dev: true
+
+ /human-signals@5.0.0:
+ resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==}
+ engines: {node: '>=16.17.0'}
+ dev: true
+
+ /husky@9.0.11:
+ resolution: {integrity: sha512-AB6lFlbwwyIqMdHYhwPe+kjOC3Oc5P3nThEoW/AaO2BX3vJDjWPFxYLxokUZOo6RNX20He3AaT8sESs9NJcmEw==}
+ engines: {node: '>=18'}
+ hasBin: true
+ dev: true
+
+ /iconv-lite@0.4.24:
+ resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ safer-buffer: 2.1.2
+ dev: true
+
+ /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'}
+
+ /import-fresh@3.3.0:
+ resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==}
+ engines: {node: '>=6'}
+ dependencies:
+ parent-module: 1.0.1
+ resolve-from: 4.0.0
+ dev: true
+
+ /import-local@3.1.0:
+ resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==}
+ engines: {node: '>=8'}
+ hasBin: true
+ dependencies:
+ pkg-dir: 4.2.0
+ resolve-cwd: 3.0.0
+ dev: true
+
+ /import-meta-resolve@4.0.0:
+ resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==}
+ dev: true
+
+ /imurmurhash@0.1.4:
+ resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
+ engines: {node: '>=0.8.19'}
+ dev: true
+
+ /indent-string@4.0.0:
+ resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /inflight@1.0.6:
+ resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
+ dependencies:
+ once: 1.4.0
+ wrappy: 1.0.2
+ dev: true
+
+ /inherits@2.0.4:
+ resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
+
+ /ini@1.3.8:
+ resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
+
+ /ini@4.1.1:
+ resolution: {integrity: sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dev: true
+
+ /ini@4.1.2:
+ resolution: {integrity: sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==}
+ engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0}
+ dev: false
+
+ /internal-slot@1.0.7:
+ resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ es-errors: 1.3.0
+ hasown: 2.0.2
+ side-channel: 1.0.6
+ dev: true
+
+ /into-stream@6.0.0:
+ resolution: {integrity: sha512-XHbaOAvP+uFKUFsOgoNPRjLkwB+I22JFPFe5OjTkQ0nwgj6+pSjb4NmB6VMxaPshLiOf+zcpOCBQuLwC1KHhZA==}
+ engines: {node: '>=10'}
+ dependencies:
+ from2: 2.3.0
+ p-is-promise: 3.0.0
+
+ /is-arguments@1.1.1:
+ resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-array-buffer@3.0.4:
+ resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /is-arrayish@0.2.1:
+ resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
+ dev: true
+
+ /is-async-function@2.0.0:
+ resolution: {integrity: sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-bigint@1.0.4:
+ resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==}
+ dependencies:
+ has-bigints: 1.0.2
+ dev: true
+
+ /is-binary-path@2.1.0:
+ resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
+ engines: {node: '>=8'}
+ dependencies:
+ binary-extensions: 2.3.0
+
+ /is-boolean-object@1.1.2:
+ resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-callable@1.2.7:
+ resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-core-module@2.13.1:
+ resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==}
+ dependencies:
+ hasown: 2.0.2
+ dev: true
+
+ /is-data-view@1.0.1:
+ resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-typed-array: 1.1.13
+ dev: true
+
+ /is-date-object@1.0.5:
+ resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /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==}
+ dependencies:
+ call-bind: 1.0.7
+ dev: true
+
+ /is-fullwidth-code-point@3.0.0:
+ resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
+ engines: {node: '>=8'}
+
+ /is-fullwidth-code-point@4.0.0:
+ resolution: {integrity: sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /is-fullwidth-code-point@5.0.0:
+ resolution: {integrity: sha512-OVa3u9kkBbw7b8Xw5F9P+D/T9X+Z4+JruYVNapTjPYZYUznQ5YfWeFkOj606XYYW8yugTfC8Pj0hYqvi4ryAhA==}
+ engines: {node: '>=18'}
+ dependencies:
+ get-east-asian-width: 1.2.0
+ dev: true
+
+ /is-generator-fn@2.1.0:
+ resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /is-generator-function@1.0.10:
+ resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-glob@4.0.3:
+ resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ is-extglob: 2.1.1
+
+ /is-interactive@1.0.0:
+ resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
+ engines: {node: '>=8'}
+
+ /is-map@2.0.3:
+ resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-negative-zero@2.0.3:
+ resolution: {integrity: sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-number-object@1.0.7:
+ resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-number@7.0.0:
+ resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
+ engines: {node: '>=0.12.0'}
+
+ /is-obj@2.0.0:
+ resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-path-inside@3.0.3:
+ resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /is-plain-obj@1.1.0:
+ resolution: {integrity: sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /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-regex@1.1.4:
+ resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-retry-allowed@2.2.0:
+ resolution: {integrity: sha512-XVm7LOeLpTW4jV19QSH38vkswxoLud8sQ57YwJVTPWdiaI9I8keEhGFpBlslyVsgdQy4Opg8QOLb8YRgsyZiQg==}
+ engines: {node: '>=10'}
+
+ /is-set@2.0.3:
+ resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-shared-array-buffer@1.0.3:
+ resolution: {integrity: sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ dev: true
+
+ /is-ssh@1.4.0:
+ resolution: {integrity: sha512-x7+VxdxOdlV3CYpjvRLBv5Lo9OJerlYanjwFrPR9fuGPjCiNiCzFgAWpiLAohSbsnH4ZAys3SBh+hq5rJosxUQ==}
+ dependencies:
+ protocols: 2.0.1
+
+ /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}
+ dev: true
+
+ /is-string@1.0.7:
+ resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-tostringtag: 1.0.2
+ dev: true
+
+ /is-subdir@1.2.0:
+ resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==}
+ engines: {node: '>=4'}
+ dependencies:
+ better-path-resolve: 1.0.0
+ dev: true
+
+ /is-symbol@1.0.4:
+ resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ has-symbols: 1.0.3
+ dev: true
+
+ /is-text-path@2.0.0:
+ resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==}
+ engines: {node: '>=8'}
+ dependencies:
+ text-extensions: 2.4.0
+ dev: true
+
+ /is-typed-array@1.1.13:
+ resolution: {integrity: sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ which-typed-array: 1.1.15
+ dev: true
+
+ /is-unicode-supported@0.1.0:
+ resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==}
+ engines: {node: '>=10'}
+
+ /is-weakmap@2.0.2:
+ resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /is-weakref@1.0.2:
+ resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ dependencies:
+ call-bind: 1.0.7
+ dev: true
+
+ /is-weakset@2.0.3:
+ resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ dev: true
+
+ /is-windows@1.0.2:
+ resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /isarray@1.0.0:
+ resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
+
+ /isarray@2.0.5:
+ resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
+ dev: true
+
+ /isexe@2.0.0:
+ resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
+ dev: true
+
+ /istanbul-lib-coverage@3.2.2:
+ resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /istanbul-lib-instrument@5.2.1:
+ resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/parser': 7.24.4
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 6.3.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-lib-instrument@6.0.2:
+ resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/parser': 7.24.4
+ '@istanbuljs/schema': 0.1.3
+ istanbul-lib-coverage: 3.2.2
+ semver: 7.6.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-lib-report@3.0.1:
+ resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==}
+ engines: {node: '>=10'}
+ dependencies:
+ istanbul-lib-coverage: 3.2.2
+ make-dir: 4.0.0
+ supports-color: 7.2.0
+ dev: true
+
+ /istanbul-lib-source-maps@4.0.1:
+ resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==}
+ engines: {node: '>=10'}
+ dependencies:
+ debug: 4.3.4
+ istanbul-lib-coverage: 3.2.2
+ source-map: 0.6.1
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /istanbul-reports@3.1.7:
+ resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
+ engines: {node: '>=8'}
+ dependencies:
+ html-escaper: 2.0.2
+ istanbul-lib-report: 3.0.1
+ dev: true
+
+ /iterator.prototype@1.1.2:
+ resolution: {integrity: sha512-DR33HMMr8EzwuRL8Y9D3u2BMj8+RqSE850jfGu59kS7tbmPLzGkZmVSfyCFSDxuZiEY6Rzt3T2NA/qU+NwVj1w==}
+ 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
+ dev: true
+
+ /jest-changed-files@29.7.0:
+ resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ execa: 5.1.1
+ jest-util: 29.7.0
+ p-limit: 3.1.0
+ dev: true
+
+ /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}
+ 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.6
+ chalk: 4.1.2
+ co: 4.6.0
+ dedent: 1.5.1
+ 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
+ dev: true
+
+ /jest-cli@29.7.0(@types/node@20.12.6):
+ 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
+ dependencies:
+ '@jest/core': 29.7.0
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ chalk: 4.1.2
+ create-jest: 29.7.0(@types/node@20.12.6)
+ exit: 0.1.2
+ import-local: 3.1.0
+ jest-config: 29.7.0(@types/node@20.12.6)
+ jest-util: 29.7.0
+ jest-validate: 29.7.0
+ yargs: 17.7.2
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+ dev: true
+
+ /jest-config@29.7.0(@types/node@20.12.6):
+ 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
+ dependencies:
+ '@babel/core': 7.24.4
+ '@jest/test-sequencer': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.12.6
+ babel-jest: 29.7.0(@babel/core@7.24.4)
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ deepmerge: 4.3.1
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ 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
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
+ dev: true
+
+ /jest-diff@29.7.0:
+ resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ chalk: 4.1.2
+ diff-sequences: 29.6.3
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+ dev: true
+
+ /jest-docblock@29.7.0:
+ resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ detect-newline: 3.1.0
+ dev: true
+
+ /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}
+ 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
+ dev: true
+
+ /jest-environment-node@29.7.0:
+ resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/environment': 29.7.0
+ '@jest/fake-timers': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.12.6
+ jest-mock: 29.7.0
+ jest-util: 29.7.0
+ dev: true
+
+ /jest-get-type@29.6.3:
+ resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /jest-haste-map@29.7.0:
+ resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/graceful-fs': 4.1.9
+ '@types/node': 20.12.6
+ anymatch: 3.1.3
+ fb-watchman: 2.0.2
+ graceful-fs: 4.2.10
+ 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
+ dev: true
+
+ /jest-leak-detector@29.7.0:
+ resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+ dev: true
+
+ /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}
+ dependencies:
+ chalk: 4.1.2
+ jest-diff: 29.7.0
+ jest-get-type: 29.6.3
+ pretty-format: 29.7.0
+ dev: true
+
+ /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}
+ 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.10
+ micromatch: 4.0.5
+ pretty-format: 29.7.0
+ slash: 3.0.0
+ stack-utils: 2.0.6
+ dev: true
+
+ /jest-mock@29.7.0:
+ resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 20.12.6
+ jest-util: 29.7.0
+ dev: true
+
+ /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0):
+ resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==}
+ engines: {node: '>=6'}
+ peerDependencies:
+ jest-resolve: '*'
+ peerDependenciesMeta:
+ jest-resolve:
+ optional: true
+ dependencies:
+ jest-resolve: 29.7.0
+ dev: true
+
+ /jest-regex-util@29.6.3:
+ resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dev: true
+
+ /jest-resolve-dependencies@29.7.0:
+ resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ jest-regex-util: 29.6.3
+ jest-snapshot: 29.7.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-resolve@29.7.0:
+ resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ chalk: 4.1.2
+ graceful-fs: 4.2.10
+ 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
+ dev: true
+
+ /jest-runner@29.7.0:
+ resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.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.6
+ chalk: 4.1.2
+ emittery: 0.13.1
+ graceful-fs: 4.2.10
+ 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
+ dev: true
+
+ /jest-runtime@29.7.0:
+ resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.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.6
+ chalk: 4.1.2
+ cjs-module-lexer: 1.2.3
+ collect-v8-coverage: 1.0.2
+ glob: 7.2.3
+ graceful-fs: 4.2.10
+ 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
+ dev: true
+
+ /jest-snapshot@29.7.0:
+ resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@babel/core': 7.24.4
+ '@babel/generator': 7.24.4
+ '@babel/plugin-syntax-jsx': 7.24.1(@babel/core@7.24.4)
+ '@babel/plugin-syntax-typescript': 7.24.1(@babel/core@7.24.4)
+ '@babel/types': 7.24.0
+ '@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.4)
+ chalk: 4.1.2
+ expect: 29.7.0
+ graceful-fs: 4.2.10
+ 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.0
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /jest-util@29.7.0:
+ resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/types': 29.6.3
+ '@types/node': 20.12.6
+ chalk: 4.1.2
+ ci-info: 3.9.0
+ graceful-fs: 4.2.10
+ picomatch: 2.3.1
+ dev: true
+
+ /jest-validate@29.7.0:
+ resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.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
+ dev: true
+
+ /jest-watcher@29.7.0:
+ resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/test-result': 29.7.0
+ '@jest/types': 29.6.3
+ '@types/node': 20.12.6
+ ansi-escapes: 4.3.2
+ chalk: 4.1.2
+ emittery: 0.13.1
+ jest-util: 29.7.0
+ string-length: 4.0.2
+ dev: true
+
+ /jest-worker@29.7.0:
+ resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@types/node': 20.12.6
+ jest-util: 29.7.0
+ merge-stream: 2.0.0
+ supports-color: 8.1.1
+ dev: true
+
+ /jest@29.7.0(@types/node@20.12.6):
+ 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
+ dependencies:
+ '@jest/core': 29.7.0
+ '@jest/types': 29.6.3
+ import-local: 3.1.0
+ jest-cli: 29.7.0(@types/node@20.12.6)
+ transitivePeerDependencies:
+ - '@types/node'
+ - babel-plugin-macros
+ - supports-color
+ - ts-node
+ dev: true
+
+ /jiti@1.21.0:
+ resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==}
+ hasBin: true
+ dev: true
+
+ /js-tokens@4.0.0:
+ resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ dev: true
+
+ /js-yaml@3.14.1:
+ resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
+ hasBin: true
+ dependencies:
+ argparse: 1.0.10
+ esprima: 4.0.1
+ dev: true
+
+ /js-yaml@4.1.0:
+ resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
+ hasBin: true
+ dependencies:
+ argparse: 2.0.1
+ dev: true
+
+ /jsesc@2.5.2:
+ resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==}
+ engines: {node: '>=4'}
+ hasBin: true
+ dev: true
+
+ /json-buffer@3.0.1:
+ resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==}
+ dev: true
+
+ /json-parse-even-better-errors@2.3.1:
+ resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==}
+ dev: true
+
+ /json-schema-traverse@0.4.1:
+ resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==}
+ dev: true
+
+ /json-schema-traverse@1.0.0:
+ resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==}
+ dev: true
+
+ /json-stable-stringify-without-jsonify@1.0.1:
+ resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==}
+ dev: true
+
+ /json5@1.0.2:
+ resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
+ hasBin: true
+ dependencies:
+ minimist: 1.2.8
+ dev: true
+
+ /json5@2.2.3:
+ resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
+ engines: {node: '>=6'}
+ hasBin: true
+ dev: true
+
+ /jsonc-parser@3.2.1:
+ resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==}
+ dev: true
+
+ /jsonfile@4.0.0:
+ resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==}
+ optionalDependencies:
+ graceful-fs: 4.2.10
+ dev: true
+
+ /jsonparse@1.3.1:
+ resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
+ engines: {'0': node >= 0.2.0}
+ dev: true
+
+ /jsx-ast-utils@3.3.5:
+ resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
+ engines: {node: '>=4.0'}
+ dependencies:
+ array-includes: 3.1.8
+ array.prototype.flat: 1.3.2
+ object.assign: 4.1.5
+ object.values: 1.2.0
+ dev: true
+
+ /keyv@4.5.4:
+ resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
+ dependencies:
+ json-buffer: 3.0.1
+ dev: true
+
+ /kind-of@6.0.3:
+ resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /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'}
+ dev: true
+
+ /language-subtag-registry@0.3.22:
+ resolution: {integrity: sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==}
+ dev: true
+
+ /language-tags@1.0.9:
+ resolution: {integrity: sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==}
+ engines: {node: '>=0.10'}
+ dependencies:
+ language-subtag-registry: 0.3.22
+ dev: true
+
+ /leven@3.1.0:
+ resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /levn@0.4.1:
+ resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /lilconfig@3.0.0:
+ resolution: {integrity: sha512-K2U4W2Ff5ibV7j7ydLr+zLAkIg5JJ4lPn1Ltsdt+Tz/IjQ8buJ55pZAxoP34lqIiwtF9iAvtLv3JGv7CAyAg+g==}
+ engines: {node: '>=14'}
+ dev: true
+
+ /lines-and-columns@1.2.4:
+ resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
+ dev: true
+
+ /lint-staged@15.2.2:
+ resolution: {integrity: sha512-TiTt93OPh1OZOsb5B7k96A/ATl2AjIZo+vnzFZ6oHK5FuTk63ByDtxGQpHm+kFETjEWqgkF95M8FRXKR/LEBcw==}
+ engines: {node: '>=18.12.0'}
+ hasBin: true
+ dependencies:
+ chalk: 5.3.0
+ commander: 11.1.0
+ debug: 4.3.4
+ execa: 8.0.1
+ lilconfig: 3.0.0
+ listr2: 8.0.1
+ micromatch: 4.0.5
+ pidtree: 0.6.0
+ string-argv: 0.3.2
+ yaml: 2.3.4
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /listr2@8.0.1:
+ resolution: {integrity: sha512-ovJXBXkKGfq+CwmKTjluEqFi3p4h8xvkxGQQAQan22YCgef4KZ1mKGjzfGh6PL6AW5Csw0QiQPNuQyH+6Xk3hA==}
+ engines: {node: '>=18.0.0'}
+ dependencies:
+ cli-truncate: 4.0.0
+ colorette: 2.0.20
+ eventemitter3: 5.0.1
+ log-update: 6.0.0
+ rfdc: 1.3.1
+ wrap-ansi: 9.0.0
+ dev: true
+
+ /load-yaml-file@0.2.0:
+ resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==}
+ engines: {node: '>=6'}
+ dependencies:
+ graceful-fs: 4.2.10
+ js-yaml: 3.14.1
+ pify: 4.0.1
+ strip-bom: 3.0.0
+ dev: true
+
+ /locate-path@3.0.0:
+ resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-locate: 3.0.0
+ path-exists: 3.0.0
+
+ /locate-path@5.0.0:
+ resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-locate: 4.1.0
+ dev: true
+
+ /locate-path@6.0.0:
+ resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-locate: 5.0.0
+ dev: true
+
+ /locate-path@7.2.0:
+ resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ p-locate: 6.0.0
+ dev: true
+
+ /lodash-es@4.17.21:
+ resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==}
+
+ /lodash.camelcase@4.3.0:
+ resolution: {integrity: sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA==}
+ dev: true
+
+ /lodash.isplainobject@4.0.6:
+ resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==}
+ dev: true
+
+ /lodash.kebabcase@4.1.1:
+ resolution: {integrity: sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==}
+ dev: true
+
+ /lodash.merge@4.6.2:
+ resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==}
+ dev: true
+
+ /lodash.mergewith@4.6.2:
+ resolution: {integrity: sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==}
+ dev: true
+
+ /lodash.snakecase@4.1.1:
+ resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
+ dev: true
+
+ /lodash.startcase@4.4.0:
+ resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==}
+ dev: true
+
+ /lodash.uniq@4.5.0:
+ resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==}
+ dev: true
+
+ /lodash.upperfirst@4.3.1:
+ resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==}
+ dev: true
+
+ /lodash@4.17.21:
+ resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
+
+ /log-symbols@4.1.0:
+ resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==}
+ engines: {node: '>=10'}
+ dependencies:
+ chalk: 4.1.2
+ is-unicode-supported: 0.1.0
+
+ /log-update@6.0.0:
+ resolution: {integrity: sha512-niTvB4gqvtof056rRIrTZvjNYE4rCUzO6X/X+kYjd7WFxXeJ0NwEFnRxX6ehkvv3jTwrXnNdtAak5XYZuIyPFw==}
+ engines: {node: '>=18'}
+ dependencies:
+ ansi-escapes: 6.2.1
+ cli-cursor: 4.0.0
+ slice-ansi: 7.1.0
+ strip-ansi: 7.1.0
+ wrap-ansi: 9.0.0
+ dev: true
+
+ /loose-envify@1.4.0:
+ resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
+ hasBin: true
+ dependencies:
+ js-tokens: 4.0.0
+ dev: true
+
+ /lru-cache@4.1.5:
+ resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==}
+ dependencies:
+ pseudomap: 1.0.2
+ yallist: 2.1.2
+ dev: true
+
+ /lru-cache@5.1.1:
+ resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
+ dependencies:
+ yallist: 3.1.1
+ dev: true
+
+ /lru-cache@6.0.0:
+ resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==}
+ engines: {node: '>=10'}
+ dependencies:
+ yallist: 4.0.0
+
+ /lz-string@1.5.0:
+ resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
+ hasBin: true
+ dev: true
+
+ /make-dir@4.0.0:
+ resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
+ engines: {node: '>=10'}
+ dependencies:
+ semver: 7.6.0
+ dev: true
+
+ /makeerror@1.0.12:
+ resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==}
+ dependencies:
+ tmpl: 1.0.5
+ dev: true
+
+ /map-obj@1.0.1:
+ resolution: {integrity: sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /map-obj@4.3.0:
+ resolution: {integrity: sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /meow@12.1.1:
+ resolution: {integrity: sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==}
+ engines: {node: '>=16.10'}
+ dev: true
+
+ /meow@6.1.1:
+ resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==}
+ engines: {node: '>=8'}
+ 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
+ dev: true
+
+ /merge-stream@2.0.0:
+ resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
+ dev: true
+
+ /merge2@1.4.1:
+ resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==}
+ engines: {node: '>= 8'}
+
+ /micromatch@4.0.5:
+ resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==}
+ engines: {node: '>=8.6'}
+ dependencies:
+ braces: 3.0.2
+ picomatch: 2.3.1
+
+ /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'}
+ dev: true
+
+ /mimic-response@3.1.0:
+ resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==}
+ engines: {node: '>=10'}
+
+ /min-indent@1.0.1:
+ resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /minimatch@3.1.2:
+ resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
+ dependencies:
+ brace-expansion: 1.1.11
+ dev: true
+
+ /minimatch@9.0.4:
+ resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==}
+ engines: {node: '>=16 || 14 >=14.17'}
+ dependencies:
+ brace-expansion: 2.0.1
+ dev: true
+
+ /minimist-options@4.1.0:
+ resolution: {integrity: sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==}
+ engines: {node: '>= 6'}
+ dependencies:
+ arrify: 1.0.1
+ is-plain-obj: 1.1.0
+ kind-of: 6.0.3
+ dev: true
+
+ /minimist@1.2.8:
+ resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
+
+ /mixme@0.5.10:
+ resolution: {integrity: sha512-5H76ANWinB1H3twpJ6JY8uvAtpmFvHNArpilJAjXRKXSDDLPIMoZArw5SH0q9z+lLs8IrMw7Q2VWpWimFKFT1Q==}
+ engines: {node: '>= 8.0.0'}
+ dev: true
+
+ /ms@2.1.2:
+ resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==}
+
+ /nanoclone@0.2.1:
+ resolution: {integrity: sha512-wynEP02LmIbLpcYw8uBKpcfF6dmg2vcpKqxeH5UcoKEYdExslsdUA4ugFauuaeYdTB76ez6gJW8XAZ6CgkXYxA==}
+
+ /nanoid@3.3.7:
+ resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
+ hasBin: true
+
+ /natural-compare-lite@1.4.0:
+ resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==}
+ dev: true
+
+ /natural-compare@1.4.0:
+ resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
+ dev: true
+
+ /node-int64@0.4.0:
+ resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==}
+ dev: true
+
+ /node-releases@2.0.14:
+ resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==}
+
+ /normalize-package-data@2.5.0:
+ resolution: {integrity: sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==}
+ dependencies:
+ hosted-git-info: 2.8.9
+ resolve: 1.22.8
+ semver: 5.7.2
+ validate-npm-package-license: 3.0.4
+ dev: true
+
+ /normalize-path@3.0.0:
+ resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
+ engines: {node: '>=0.10.0'}
+
+ /npm-run-path@4.0.1:
+ resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==}
+ engines: {node: '>=8'}
+ dependencies:
+ path-key: 3.1.1
+ dev: true
+
+ /npm-run-path@5.3.0:
+ resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ path-key: 4.0.0
+ dev: true
+
+ /object-assign@4.1.1:
+ resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /object-inspect@1.13.1:
+ resolution: {integrity: sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==}
+ dev: true
+
+ /object-is@1.1.6:
+ resolution: {integrity: sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ dev: true
+
+ /object-keys@1.1.1:
+ resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /object.assign@4.1.5:
+ resolution: {integrity: sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ has-symbols: 1.0.3
+ object-keys: 1.1.1
+ dev: true
+
+ /object.entries@1.1.8:
+ resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /object.fromentries@2.0.8:
+ resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /object.groupby@1.0.3:
+ resolution: {integrity: sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ dev: true
+
+ /object.hasown@1.1.4:
+ resolution: {integrity: sha512-FZ9LZt9/RHzGySlBARE3VF+gE26TxR38SdmqOqliuTnl9wrKulaQs+4dee1V+Io8VfxqzAfHu6YuRgUy8OHoTg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /object.values@1.2.0:
+ resolution: {integrity: sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /once@1.4.0:
+ resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==}
+ dependencies:
+ wrappy: 1.0.2
+ dev: true
+
+ /onetime@5.1.2:
+ resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==}
+ engines: {node: '>=6'}
+ dependencies:
+ mimic-fn: 2.1.0
+
+ /onetime@6.0.0:
+ resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ mimic-fn: 4.0.0
+ dev: true
+
+ /optionator@0.9.3:
+ resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ '@aashutoshrathi/word-wrap': 1.2.6
+ deep-is: 0.1.4
+ fast-levenshtein: 2.0.6
+ levn: 0.4.1
+ prelude-ls: 1.2.1
+ type-check: 0.4.0
+ dev: true
+
+ /ora@5.4.1:
+ resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==}
+ engines: {node: '>=10'}
+ 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
+
+ /os-tmpdir@1.0.2:
+ resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /outdent@0.5.0:
+ resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==}
+ dev: true
+
+ /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'}
+ dependencies:
+ p-map: 2.1.0
+ dev: true
+
+ /p-is-promise@3.0.0:
+ resolution: {integrity: sha512-Wo8VsW4IRQSKVXsJCn7TomUaVtyfjVDn3nUP7kE967BQk0CwFpdbZs0X0uk5sW9mkBa9eNM7hCMaG93WUAwxYQ==}
+ engines: {node: '>=8'}
+
+ /p-limit@2.3.0:
+ resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-try: 2.2.0
+
+ /p-limit@3.1.0:
+ resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ yocto-queue: 0.1.0
+ dev: true
+
+ /p-limit@4.0.0:
+ resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ yocto-queue: 1.0.0
+ dev: true
+
+ /p-locate@3.0.0:
+ resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ p-limit: 2.3.0
+
+ /p-locate@4.1.0:
+ resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==}
+ engines: {node: '>=8'}
+ dependencies:
+ p-limit: 2.3.0
+ dev: true
+
+ /p-locate@5.0.0:
+ resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==}
+ engines: {node: '>=10'}
+ dependencies:
+ p-limit: 3.1.0
+ dev: true
+
+ /p-locate@6.0.0:
+ resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ p-limit: 4.0.0
+ dev: true
+
+ /p-map@2.1.0:
+ resolution: {integrity: sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /p-try@2.2.0:
+ resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==}
+ engines: {node: '>=6'}
+
+ /parent-module@1.0.1:
+ resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==}
+ engines: {node: '>=6'}
+ dependencies:
+ callsites: 3.1.0
+ dev: true
+
+ /parse-headers@2.0.5:
+ resolution: {integrity: sha512-ft3iAoLOB/MlwbNXgzy43SWGP6sQki2jQvAyBg/zDFAgr9bfNWZIUj42Kw2eJIl8kEi4PbgE6U1Zau/HwI75HA==}
+
+ /parse-json@5.2.0:
+ resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==}
+ engines: {node: '>=8'}
+ 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
+ dev: true
+
+ /parse-path@7.0.0:
+ resolution: {integrity: sha512-Euf9GG8WT9CdqwuWJGdf3RkUcTBArppHABkO7Lm8IzRQp0e2r/kkFnmhu4TSK30Wcu5rVAZLmfPKSBBi9tWFog==}
+ dependencies:
+ protocols: 2.0.1
+
+ /parse-url@8.1.0:
+ resolution: {integrity: sha512-xDvOoLU5XRrcOZvnI6b8zA6n9O9ejNk/GExuz1yBuWUGn9KA97GI6HTs6u02wKara1CeVmZhH+0TZFdWScR89w==}
+ dependencies:
+ parse-path: 7.0.0
+
+ /path-exists@3.0.0:
+ resolution: {integrity: sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==}
+ engines: {node: '>=4'}
+
+ /path-exists@4.0.0:
+ resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-exists@5.0.0:
+ resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dev: true
+
+ /path-is-absolute@1.0.1:
+ resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /path-key@3.1.1:
+ resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /path-key@4.0.0:
+ resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /path-parse@1.0.7:
+ resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==}
+ dev: true
+
+ /path-type@4.0.0:
+ resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==}
+ engines: {node: '>=8'}
+
+ /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
+ dev: true
+
+ /pify@4.0.1:
+ resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /pirates@4.0.6:
+ resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==}
+ engines: {node: '>= 6'}
+ dev: true
+
+ /pkg-dir@4.2.0:
+ resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ dev: true
+
+ /pkg-up@3.1.0:
+ resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 3.0.0
+
+ /possible-typed-array-names@1.0.0:
+ resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /postcss@8.4.38:
+ resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==}
+ engines: {node: ^10 || ^12 || >=14}
+ dependencies:
+ nanoid: 3.3.7
+ picocolors: 1.0.0
+ source-map-js: 1.2.0
+
+ /preferred-pm@3.1.3:
+ resolution: {integrity: sha512-MkXsENfftWSRpzCzImcp4FRsCc3y1opwB73CfCNWyzMqArju2CrlMHlqB7VexKiPEOjGMbttv1r9fSCn5S610w==}
+ engines: {node: '>=10'}
+ dependencies:
+ find-up: 5.0.0
+ find-yarn-workspace-root2: 1.2.16
+ path-exists: 4.0.0
+ which-pm: 2.0.0
+ dev: true
+
+ /prelude-ls@1.2.1:
+ resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
+ engines: {node: '>= 0.8.0'}
+ dev: true
+
+ /prettier-linter-helpers@1.0.0:
+ resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==}
+ engines: {node: '>=6.0.0'}
+ dependencies:
+ fast-diff: 1.3.0
+ dev: true
+
+ /prettier-plugin-packagejson@2.4.12(prettier@3.2.5):
+ resolution: {integrity: sha512-hifuuOgw5rHHTdouw9VrhT8+Nd7UwxtL1qco8dUfd4XUFQL6ia3xyjSxhPQTsGnSYFraTWy5Omb+MZm/OWDTpQ==}
+ peerDependencies:
+ prettier: '>= 1.16.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+ dependencies:
+ prettier: 3.2.5
+ sort-package-json: 2.8.0
+ synckit: 0.9.0
+ dev: true
+
+ /prettier-plugin-packagejson@2.4.14(prettier@2.8.8):
+ resolution: {integrity: sha512-sli+gV5tW7uxvzDZQscaBtSfbyAW2ToL6n/HGt51PipwX9vI7M54vefG0mKSfklVkT29TNGO6Mo6g8c6Z79gmw==}
+ peerDependencies:
+ prettier: '>= 1.16.0'
+ peerDependenciesMeta:
+ prettier:
+ optional: true
+ dependencies:
+ prettier: 2.8.8
+ sort-package-json: 2.10.0
+ synckit: 0.9.0
+ dev: false
+
+ /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
+ dev: 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}
+ dependencies:
+ ansi-regex: 5.0.1
+ ansi-styles: 5.2.0
+ react-is: 17.0.2
+ dev: true
+
+ /pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.2.0
+ dev: true
+
+ /process-nextick-args@2.0.1:
+ resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==}
+
+ /progress-stream@2.0.0:
+ resolution: {integrity: sha512-xJwOWR46jcXUq6EH9yYyqp+I52skPySOeHfkxOZ2IY1AiBi/sFJhbhAKHoV3OTw/omQ45KTio9215dRJ2Yxd3Q==}
+ dependencies:
+ speedometer: 1.0.0
+ through2: 2.0.5
+
+ /prompts@2.4.2:
+ resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==}
+ engines: {node: '>= 6'}
+ dependencies:
+ kleur: 3.0.3
+ sisteransi: 1.0.5
+
+ /prop-types@15.8.1:
+ resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
+ dependencies:
+ loose-envify: 1.4.0
+ object-assign: 4.1.1
+ react-is: 16.13.1
+ dev: true
+
+ /property-expr@2.0.6:
+ resolution: {integrity: sha512-SVtmxhRE/CGkn3eZY1T6pC8Nln6Fr/lu1mKSgRud0eC73whjGfoAogbn78LkD8aFL0zz3bAFerKSnOl7NlErBA==}
+
+ /proto-list@1.2.4:
+ resolution: {integrity: sha512-vtK/94akxsTMhe0/cbfpR+syPuszcuwhqVjJq26CuNDgFGj682oRBXOP5MJpv2r7JtE8MsiepGIqvvOTBwn2vA==}
+
+ /protocols@2.0.1:
+ resolution: {integrity: sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==}
+
+ /pseudomap@1.0.2:
+ resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==}
+ dev: true
+
+ /punycode@2.3.1:
+ resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /pure-rand@6.1.0:
+ resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==}
+ dev: true
+
+ /queue-microtask@1.2.3:
+ resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==}
+
+ /quick-lru@4.0.1:
+ resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /rc@1.2.8:
+ resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==}
+ hasBin: true
+ dependencies:
+ deep-extend: 0.6.0
+ ini: 1.3.8
+ minimist: 1.2.8
+ strip-json-comments: 2.0.1
+
+ /react-is@16.13.1:
+ resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
+ dev: true
+
+ /react-is@17.0.2:
+ resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+ dev: true
+
+ /react-is@18.2.0:
+ resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==}
+ dev: true
+
+ /read-pkg-up@7.0.1:
+ resolution: {integrity: sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==}
+ engines: {node: '>=8'}
+ dependencies:
+ find-up: 4.1.0
+ read-pkg: 5.2.0
+ type-fest: 0.8.1
+ dev: true
+
+ /read-pkg@5.2.0:
+ resolution: {integrity: sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@types/normalize-package-data': 2.4.4
+ normalize-package-data: 2.5.0
+ parse-json: 5.2.0
+ type-fest: 0.6.0
+ dev: true
+
+ /read-yaml-file@1.1.0:
+ resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==}
+ engines: {node: '>=6'}
+ dependencies:
+ graceful-fs: 4.2.10
+ js-yaml: 3.14.1
+ pify: 4.0.1
+ strip-bom: 3.0.0
+ dev: true
+
+ /readable-stream@2.3.8:
+ resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==}
+ 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:
+ resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
+ engines: {node: '>= 6'}
+ dependencies:
+ inherits: 2.0.4
+ string_decoder: 1.3.0
+ util-deprecate: 1.0.2
+
+ /readdirp@3.6.0:
+ resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==}
+ engines: {node: '>=8.10.0'}
+ dependencies:
+ picomatch: 2.3.1
+
+ /redent@3.0.0:
+ resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
+ engines: {node: '>=8'}
+ dependencies:
+ indent-string: 4.0.0
+ strip-indent: 3.0.0
+ dev: true
+
+ /reflect.getprototypeof@1.0.6:
+ resolution: {integrity: sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==}
+ engines: {node: '>= 0.4'}
+ 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.3
+ which-builtin-type: 1.1.3
+ dev: true
+
+ /regenerator-runtime@0.14.1:
+ resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==}
+
+ /regexp.prototype.flags@1.5.2:
+ resolution: {integrity: sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-errors: 1.3.0
+ set-function-name: 2.0.2
+ dev: true
+
+ /regexpp@3.2.0:
+ resolution: {integrity: sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /registry-auth-token@5.0.2:
+ resolution: {integrity: sha512-o/3ikDxtXaA59BmZuZrJZDJv8NMDGSj+6j6XaeBmHw8eY1i1qd9+6H+LjVvQXx3HN6aRCGa1cUdJ9RaJZUugnQ==}
+ engines: {node: '>=14'}
+ dependencies:
+ '@pnpm/npm-conf': 2.2.2
+
+ /registry-url@5.1.0:
+ resolution: {integrity: sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==}
+ engines: {node: '>=8'}
+ dependencies:
+ rc: 1.2.8
+
+ /require-directory@2.1.1:
+ resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-from-string@2.0.2:
+ resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /require-main-filename@2.0.0:
+ resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==}
+ dev: true
+
+ /requireindex@1.2.0:
+ resolution: {integrity: sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==}
+ engines: {node: '>=0.10.5'}
+ dev: true
+
+ /resolve-cwd@3.0.0:
+ resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==}
+ engines: {node: '>=8'}
+ dependencies:
+ resolve-from: 5.0.0
+ dev: true
+
+ /resolve-from@4.0.0:
+ resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /resolve-from@5.0.0:
+ resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /resolve-pkg-maps@1.0.0:
+ resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
+ dev: true
+
+ /resolve.exports@2.0.2:
+ resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /resolve@1.22.8:
+ resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.13.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /resolve@2.0.0-next.5:
+ resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
+ hasBin: true
+ dependencies:
+ is-core-module: 2.13.1
+ path-parse: 1.0.7
+ supports-preserve-symlinks-flag: 1.0.0
+ dev: true
+
+ /restore-cursor@3.1.0:
+ resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==}
+ engines: {node: '>=8'}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+
+ /restore-cursor@4.0.0:
+ resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ dependencies:
+ onetime: 5.1.2
+ signal-exit: 3.0.7
+ dev: true
+
+ /reusify@1.0.4:
+ resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==}
+ engines: {iojs: '>=1.0.0', node: '>=0.10.0'}
+
+ /rfdc@1.3.1:
+ resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==}
+ dev: true
+
+ /rimraf@3.0.2:
+ resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==}
+ hasBin: true
+ dependencies:
+ glob: 7.2.3
+ dev: true
+
+ /rollup@4.14.1:
+ resolution: {integrity: sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+ dependencies:
+ '@types/estree': 1.0.5
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.14.1
+ '@rollup/rollup-android-arm64': 4.14.1
+ '@rollup/rollup-darwin-arm64': 4.14.1
+ '@rollup/rollup-darwin-x64': 4.14.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.14.1
+ '@rollup/rollup-linux-arm64-gnu': 4.14.1
+ '@rollup/rollup-linux-arm64-musl': 4.14.1
+ '@rollup/rollup-linux-powerpc64le-gnu': 4.14.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.14.1
+ '@rollup/rollup-linux-s390x-gnu': 4.14.1
+ '@rollup/rollup-linux-x64-gnu': 4.14.1
+ '@rollup/rollup-linux-x64-musl': 4.14.1
+ '@rollup/rollup-win32-arm64-msvc': 4.14.1
+ '@rollup/rollup-win32-ia32-msvc': 4.14.1
+ '@rollup/rollup-win32-x64-msvc': 4.14.1
+ fsevents: 2.3.3
+
+ /run-parallel@1.2.0:
+ resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
+ dependencies:
+ queue-microtask: 1.2.3
+
+ /rxjs-report-usage@1.0.6:
+ resolution: {integrity: sha512-omv1DIv5z1kV+zDAEjaDjWSkx8w5TbFp5NZoPwUipwzYVcor/4So9ZU3bUyQ1c8lxY5Q0Es/ztWW7PGjY7to0Q==}
+ hasBin: true
+ dependencies:
+ '@babel/parser': 7.24.4
+ '@babel/traverse': 7.24.1
+ '@babel/types': 7.24.0
+ bent: 7.3.12
+ chalk: 4.1.2
+ glob: 7.2.3
+ prompts: 2.4.2
+ transitivePeerDependencies:
+ - supports-color
+ dev: true
+
+ /rxjs@7.8.1:
+ resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
+ dependencies:
+ tslib: 2.6.2
+
+ /safe-array-concat@1.1.2:
+ resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
+ engines: {node: '>=0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ get-intrinsic: 1.2.4
+ has-symbols: 1.0.3
+ isarray: 2.0.5
+ dev: true
+
+ /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'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-regex: 1.1.4
+ dev: true
+
+ /safer-buffer@2.1.2:
+ resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
+ dev: true
+
+ /semver@5.7.2:
+ resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==}
+ hasBin: true
+ dev: true
+
+ /semver@6.3.1:
+ resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
+ hasBin: true
+ dev: true
+
+ /semver@7.6.0:
+ resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==}
+ engines: {node: '>=10'}
+ hasBin: true
+ dependencies:
+ lru-cache: 6.0.0
+
+ /set-blocking@2.0.0:
+ resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==}
+ dev: true
+
+ /set-function-length@1.2.2:
+ resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /set-function-name@2.0.2:
+ resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ define-data-property: 1.1.4
+ es-errors: 1.3.0
+ functions-have-names: 1.2.3
+ has-property-descriptors: 1.0.2
+ dev: true
+
+ /shebang-command@1.2.0:
+ resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==}
+ engines: {node: '>=0.10.0'}
+ dependencies:
+ shebang-regex: 1.0.0
+ dev: true
+
+ /shebang-command@2.0.0:
+ resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==}
+ engines: {node: '>=8'}
+ dependencies:
+ shebang-regex: 3.0.0
+ dev: true
+
+ /shebang-regex@1.0.0:
+ resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /shebang-regex@3.0.0:
+ resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /side-channel@1.0.6:
+ resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.4
+ object-inspect: 1.13.1
+ dev: true
+
+ /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'}
+ dev: true
+
+ /sisteransi@1.0.5:
+ resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==}
+
+ /slash@3.0.0:
+ resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /slash@4.0.0:
+ resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==}
+ engines: {node: '>=12'}
+
+ /slice-ansi@5.0.0:
+ resolution: {integrity: sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 4.0.0
+ dev: true
+
+ /slice-ansi@7.1.0:
+ resolution: {integrity: sha512-bSiSngZ/jWeX93BqeIAbImyTbEihizcwNjFoRUIY/T1wWQsfsm2Vw1agPKylXvQTU7iASGdHhyqRlqQzfz+Htg==}
+ engines: {node: '>=18'}
+ dependencies:
+ ansi-styles: 6.2.1
+ is-fullwidth-code-point: 5.0.0
+ dev: true
+
+ /smartwrap@2.0.2:
+ resolution: {integrity: sha512-vCsKNQxb7PnCNd2wY1WClWifAc2lwqsG8OaswpJkVJsvMGcnEntdTCDajZCkk93Ay1U3t/9puJmb525Rg5MZBA==}
+ engines: {node: '>=6'}
+ hasBin: true
+ 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
+ dev: true
+
+ /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
+ 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.0
+ sort-object-keys: 1.1.3
+ dev: false
+
+ /sort-package-json@2.8.0:
+ resolution: {integrity: sha512-PxeNg93bTJWmDGnu0HADDucoxfFiKkIr73Kv85EBThlI1YQPdc0XovBgg2llD0iABZbu2SlKo8ntGmOP9wOj/g==}
+ hasBin: true
+ 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
+ sort-object-keys: 1.1.3
+ dev: 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==}
+ dependencies:
+ buffer-from: 1.1.2
+ source-map: 0.6.1
+ dev: true
+
+ /source-map@0.6.1:
+ resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
+ engines: {node: '>=0.10.0'}
+ dev: true
+
+ /spawndamnit@2.0.0:
+ resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==}
+ dependencies:
+ cross-spawn: 5.1.0
+ signal-exit: 3.0.7
+ dev: true
+
+ /spdx-correct@3.2.0:
+ resolution: {integrity: sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==}
+ dependencies:
+ spdx-expression-parse: 3.0.1
+ spdx-license-ids: 3.0.17
+ dev: true
+
+ /spdx-exceptions@2.5.0:
+ resolution: {integrity: sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==}
+ dev: true
+
+ /spdx-expression-parse@3.0.1:
+ resolution: {integrity: sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==}
+ dependencies:
+ spdx-exceptions: 2.5.0
+ spdx-license-ids: 3.0.17
+ dev: true
+
+ /spdx-license-ids@3.0.17:
+ resolution: {integrity: sha512-sh8PWc/ftMqAAdFiBu6Fy6JUOYjqDJBJvIhpfDMyHrr0Rbp5liZqd4TjtQ/RgfLjKFZb+LMx5hpml5qOWy0qvg==}
+ dev: true
+
+ /speedometer@1.0.0:
+ resolution: {integrity: sha512-lgxErLl/7A5+vgIIXsh9MbeukOaCb2axgQ+bKCdIE+ibNT4XNYGNCR1qFEGq6F+YDASXK3Fh/c5FgtZchFolxw==}
+
+ /split2@4.2.0:
+ resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==}
+ engines: {node: '>= 10.x'}
+ dev: true
+
+ /sprintf-js@1.0.3:
+ resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==}
+ dev: true
+
+ /stack-utils@2.0.6:
+ resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ escape-string-regexp: 2.0.0
+ dev: true
+
+ /stop-iteration-iterator@1.0.0:
+ resolution: {integrity: sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ internal-slot: 1.0.7
+ dev: true
+
+ /stream-transform@2.1.3:
+ resolution: {integrity: sha512-9GHUiM5hMiCi6Y03jD2ARC1ettBXkQBoQAe7nJsPknnI0ow10aXjTnew8QtYQmLjzn974BnmWEAJgCY6ZP1DeQ==}
+ dependencies:
+ mixme: 0.5.10
+ dev: true
+
+ /string-argv@0.3.2:
+ resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==}
+ engines: {node: '>=0.6.19'}
+ dev: true
+
+ /string-length@4.0.2:
+ resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==}
+ engines: {node: '>=10'}
+ dependencies:
+ char-regex: 1.0.2
+ strip-ansi: 6.0.1
+ dev: true
+
+ /string-width@4.2.3:
+ resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==}
+ engines: {node: '>=8'}
+ dependencies:
+ emoji-regex: 8.0.0
+ is-fullwidth-code-point: 3.0.0
+ strip-ansi: 6.0.1
+
+ /string-width@7.1.0:
+ resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==}
+ engines: {node: '>=18'}
+ dependencies:
+ emoji-regex: 10.3.0
+ get-east-asian-width: 1.2.0
+ strip-ansi: 7.1.0
+ dev: true
+
+ /string.prototype.matchall@4.0.11:
+ resolution: {integrity: sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /string.prototype.trim@1.2.9:
+ resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-abstract: 1.23.3
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /string.prototype.trimend@1.0.8:
+ resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /string.prototype.trimstart@1.0.8:
+ resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ define-properties: 1.2.1
+ es-object-atoms: 1.0.0
+ dev: true
+
+ /string_decoder@1.1.1:
+ resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
+ dependencies:
+ safe-buffer: 5.1.2
+
+ /string_decoder@1.3.0:
+ resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
+ dependencies:
+ safe-buffer: 5.2.1
+
+ /strip-ansi@6.0.1:
+ resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-regex: 5.0.1
+
+ /strip-ansi@7.1.0:
+ resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==}
+ engines: {node: '>=12'}
+ dependencies:
+ ansi-regex: 6.0.1
+ dev: true
+
+ /strip-bom@3.0.0:
+ resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /strip-bom@4.0.0:
+ resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /strip-final-newline@2.0.0:
+ resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /strip-final-newline@3.0.0:
+ resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /strip-indent@3.0.0:
+ resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
+ engines: {node: '>=8'}
+ dependencies:
+ min-indent: 1.0.1
+ dev: true
+
+ /strip-json-comments@2.0.1:
+ resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==}
+ engines: {node: '>=0.10.0'}
+
+ /strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /supports-color@5.5.0:
+ resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==}
+ engines: {node: '>=4'}
+ dependencies:
+ has-flag: 3.0.0
+ dev: true
+
+ /supports-color@7.2.0:
+ resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==}
+ engines: {node: '>=8'}
+ dependencies:
+ has-flag: 4.0.0
+
+ /supports-color@8.1.1:
+ resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ has-flag: 4.0.0
+ dev: true
+
+ /supports-preserve-symlinks-flag@1.0.0:
+ resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==}
+ engines: {node: '>= 0.4'}
+ dev: true
+
+ /synckit@0.9.0:
+ resolution: {integrity: sha512-7RnqIMq572L8PeEzKeBINYEJDDxpcH8JEgLwUqBd3TkofhFRbkq4QLR0u+36avGAhCRbk2nnmjcW9SE531hPDg==}
+ engines: {node: ^14.18.0 || >=16.0.0}
+ dependencies:
+ '@pkgr/core': 0.1.1
+ tslib: 2.6.2
+
+ /tapable@2.2.1:
+ resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==}
+ engines: {node: '>=6'}
+ dev: true
+
+ /term-size@2.2.1:
+ resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /test-exclude@6.0.0:
+ resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==}
+ engines: {node: '>=8'}
+ dependencies:
+ '@istanbuljs/schema': 0.1.3
+ glob: 7.2.3
+ minimatch: 3.1.2
+ dev: true
+
+ /text-extensions@2.4.0:
+ resolution: {integrity: sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /text-table@0.2.0:
+ resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==}
+ dev: true
+
+ /through2@2.0.5:
+ resolution: {integrity: sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==}
+ dependencies:
+ readable-stream: 2.3.8
+ xtend: 4.0.2
+
+ /through@2.3.8:
+ resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==}
+ dev: true
+
+ /tmp@0.0.33:
+ resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
+ engines: {node: '>=0.6.0'}
+ dependencies:
+ os-tmpdir: 1.0.2
+ dev: true
+
+ /tmpl@1.0.5:
+ resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==}
+ dev: true
+
+ /to-fast-properties@2.0.0:
+ resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /to-regex-range@5.0.1:
+ resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==}
+ engines: {node: '>=8.0'}
+ dependencies:
+ is-number: 7.0.0
+
+ /toposort@2.0.2:
+ resolution: {integrity: sha512-0a5EOkAUp8D4moMi2W8ZF8jcga7BgZd91O/yabJCFY8az+XSzeGyTKs0Aoo897iV1Nj6guFq8orWDS96z91oGg==}
+
+ /trim-newlines@3.0.1:
+ resolution: {integrity: sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /ts-api-utils@1.3.0(typescript@5.4.4):
+ resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==}
+ engines: {node: '>=16'}
+ peerDependencies:
+ typescript: '>=4.2.0'
+ dependencies:
+ typescript: 5.4.4
+ dev: true
+
+ /tsconfig-paths@3.15.0:
+ resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
+ dependencies:
+ '@types/json5': 0.0.29
+ json5: 1.0.2
+ minimist: 1.2.8
+ strip-bom: 3.0.0
+ dev: true
+
+ /tslib@1.14.1:
+ resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==}
+ dev: true
+
+ /tslib@2.6.2:
+ resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==}
+
+ /tsutils-etc@1.4.2(tsutils@3.21.0)(typescript@5.4.4):
+ resolution: {integrity: sha512-2Dn5SxTDOu6YWDNKcx1xu2YUy6PUeKrWZB/x2cQ8vY2+iz3JRembKn/iZ0JLT1ZudGNwQQvtFX9AwvRHbXuPUg==}
+ hasBin: true
+ peerDependencies:
+ tsutils: ^3.0.0
+ typescript: '>=4.0.0'
+ dependencies:
+ '@types/yargs': 17.0.32
+ tsutils: 3.21.0(typescript@5.4.4)
+ typescript: 5.4.4
+ yargs: 17.7.2
+ dev: true
+
+ /tsutils@3.21.0(typescript@5.4.4):
+ 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'
+ dependencies:
+ tslib: 1.14.1
+ typescript: 5.4.4
+ dev: true
+
+ /tty-table@4.2.3:
+ resolution: {integrity: sha512-Fs15mu0vGzCrj8fmJNP7Ynxt5J7praPXqFN0leZeZBXJwkMxv9cb2D454k1ltrtUSJbZ4yH4e0CynsHLxmUfFA==}
+ engines: {node: '>=8.0.0'}
+ hasBin: true
+ 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
+ dev: true
+
+ /tunnel-agent@0.6.0:
+ resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==}
+ dependencies:
+ safe-buffer: 5.2.1
+
+ /type-check@0.4.0:
+ resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
+ engines: {node: '>= 0.8.0'}
+ dependencies:
+ prelude-ls: 1.2.1
+ dev: true
+
+ /type-detect@4.0.8:
+ resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==}
+ engines: {node: '>=4'}
+ dev: true
+
+ /type-fest@0.13.1:
+ resolution: {integrity: sha512-34R7HTnG0XIJcBSn5XhDd7nNFPRcXYRZrBB2O2jdKqYODldSzBAqzsWoZYYvduky73toYS/ESqxPvkDf/F0XMg==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /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'}
+ dev: true
+
+ /type-fest@0.6.0:
+ resolution: {integrity: sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /type-fest@0.8.1:
+ resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==}
+ engines: {node: '>=8'}
+ dev: true
+
+ /typed-array-buffer@1.0.2:
+ resolution: {integrity: sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ call-bind: 1.0.7
+ es-errors: 1.3.0
+ is-typed-array: 1.1.13
+ dev: true
+
+ /typed-array-byte-length@1.0.1:
+ resolution: {integrity: sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /typed-array-byte-offset@1.0.2:
+ resolution: {integrity: sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /typed-array-length@1.0.6:
+ resolution: {integrity: sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /typescript@5.3.2:
+ resolution: {integrity: sha512-6l+RyNy7oAHDfxC4FzSJcz9vnjTKxrLpDG5M2Vu4SHRVNg6xzqZp6LYSR9zjqQTu8DU/f5xwxUdADOkbrIX2gQ==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+ dev: true
+
+ /typescript@5.4.4:
+ resolution: {integrity: sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==}
+ engines: {node: '>=14.17'}
+ hasBin: true
+
+ /unbox-primitive@1.0.2:
+ resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==}
+ dependencies:
+ call-bind: 1.0.7
+ has-bigints: 1.0.2
+ has-symbols: 1.0.3
+ which-boxed-primitive: 1.0.2
+ dev: true
+
+ /undici-types@5.26.5:
+ resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==}
+
+ /unicorn-magic@0.1.0:
+ resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==}
+ engines: {node: '>=18'}
+ dev: true
+
+ /universalify@0.1.2:
+ resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==}
+ engines: {node: '>= 4.0.0'}
+ dev: true
+
+ /update-browserslist-db@1.0.13(browserslist@4.23.0):
+ resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==}
+ hasBin: true
+ peerDependencies:
+ browserslist: '>= 4.21.0'
+ dependencies:
+ browserslist: 4.23.0
+ escalade: 3.1.2
+ picocolors: 1.0.0
+
+ /uri-js@4.4.1:
+ resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
+ dependencies:
+ punycode: 2.3.1
+ dev: true
+
+ /util-deprecate@1.0.2:
+ resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
+
+ /v8-to-istanbul@9.2.0:
+ resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==}
+ engines: {node: '>=10.12.0'}
+ dependencies:
+ '@jridgewell/trace-mapping': 0.3.25
+ '@types/istanbul-lib-coverage': 2.0.6
+ convert-source-map: 2.0.0
+ dev: true
+
+ /validate-npm-package-license@3.0.4:
+ resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==}
+ dependencies:
+ spdx-correct: 3.2.0
+ spdx-expression-parse: 3.0.1
+ dev: true
+
+ /vite@5.1.6(@types/node@20.12.6):
+ resolution: {integrity: sha512-yYIAZs9nVfRJ/AiOLCA91zzhjsHUgMjB+EigzFb6W2XTLO8JixBCKCjvhKZaye+NKYHCrkv3Oh50dH9EdLU2RA==}
+ 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
+ dependencies:
+ '@types/node': 20.12.6
+ esbuild: 0.19.11
+ postcss: 8.4.38
+ rollup: 4.14.1
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: true
+
+ /vite@5.2.8(@types/node@20.12.6):
+ resolution: {integrity: sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==}
+ 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
+ dependencies:
+ '@types/node': 20.12.6
+ esbuild: 0.20.2
+ postcss: 8.4.38
+ rollup: 4.14.1
+ optionalDependencies:
+ fsevents: 2.3.3
+ dev: false
+
+ /walker@1.0.8:
+ resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==}
+ dependencies:
+ makeerror: 1.0.12
+ dev: true
+
+ /wcwidth@1.0.1:
+ resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==}
+ dependencies:
+ defaults: 1.0.4
+
+ /which-boxed-primitive@1.0.2:
+ resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==}
+ 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
+ dev: true
+
+ /which-builtin-type@1.1.3:
+ resolution: {integrity: sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /which-collection@1.0.2:
+ resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
+ engines: {node: '>= 0.4'}
+ dependencies:
+ is-map: 2.0.3
+ is-set: 2.0.3
+ is-weakmap: 2.0.2
+ is-weakset: 2.0.3
+ dev: true
+
+ /which-module@2.0.1:
+ resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==}
+ dev: true
+
+ /which-pm@2.0.0:
+ resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==}
+ engines: {node: '>=8.15'}
+ dependencies:
+ load-yaml-file: 0.2.0
+ path-exists: 4.0.0
+ dev: true
+
+ /which-typed-array@1.1.15:
+ resolution: {integrity: sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==}
+ engines: {node: '>= 0.4'}
+ 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
+ dev: true
+
+ /which@1.3.1:
+ resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /which@2.0.2:
+ resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==}
+ engines: {node: '>= 8'}
+ hasBin: true
+ dependencies:
+ isexe: 2.0.0
+ dev: true
+
+ /widest-line@3.1.0:
+ resolution: {integrity: sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==}
+ engines: {node: '>=8'}
+ dependencies:
+ string-width: 4.2.3
+
+ /wrap-ansi@6.2.0:
+ resolution: {integrity: sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==}
+ engines: {node: '>=8'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+ dev: true
+
+ /wrap-ansi@7.0.0:
+ resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==}
+ engines: {node: '>=10'}
+ dependencies:
+ ansi-styles: 4.3.0
+ string-width: 4.2.3
+ strip-ansi: 6.0.1
+
+ /wrap-ansi@9.0.0:
+ resolution: {integrity: sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==}
+ engines: {node: '>=18'}
+ dependencies:
+ ansi-styles: 6.2.1
+ string-width: 7.1.0
+ strip-ansi: 7.1.0
+ dev: true
+
+ /wrappy@1.0.2:
+ resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==}
+ dev: true
+
+ /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}
+ dependencies:
+ imurmurhash: 0.1.4
+ signal-exit: 3.0.7
+ dev: true
+
+ /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==}
+ dev: true
+
+ /y18n@5.0.8:
+ resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yallist@2.1.2:
+ resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==}
+ dev: true
+
+ /yallist@3.1.1:
+ resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
+ dev: true
+
+ /yallist@4.0.0:
+ resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==}
+
+ /yaml@2.3.4:
+ resolution: {integrity: sha512-8aAvwVUSHpfEqTQ4w/KMlf3HcRdt50E5ODIQJBw1fQ5RL34xabzxtUlzTXVqc4rkZsPbvrXKWnABCD7kWSmocA==}
+ engines: {node: '>= 14'}
+ dev: true
+
+ /yargs-parser@18.1.3:
+ resolution: {integrity: sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==}
+ engines: {node: '>=6'}
+ dependencies:
+ camelcase: 5.3.1
+ decamelize: 1.2.0
+ dev: true
+
+ /yargs-parser@21.1.1:
+ resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==}
+ engines: {node: '>=12'}
+ dev: true
+
+ /yargs@15.4.1:
+ resolution: {integrity: sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==}
+ engines: {node: '>=8'}
+ 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
+ dev: true
+
+ /yargs@17.7.2:
+ resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==}
+ engines: {node: '>=12'}
+ 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
+ dev: true
+
+ /yocto-queue@0.1.0:
+ resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==}
+ engines: {node: '>=10'}
+ dev: true
+
+ /yocto-queue@1.0.0:
+ resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==}
+ engines: {node: '>=12.20'}
+ dev: true
+
+ /yup@0.32.9:
+ resolution: {integrity: sha512-Ci1qN+i2H0XpY7syDQ0k5zKQ/DoxO0LzPg8PAR/X4Mpj6DqaeCoIYEEjDJwhArh3Fa7GWbQQVDZKeXYlSH4JMg==}
+ engines: {node: '>=10'}
+ dependencies:
+ '@babel/runtime': 7.24.4
+ '@types/lodash': 4.17.0
+ lodash: 4.17.21
+ lodash-es: 4.17.21
+ nanoclone: 0.2.1
+ property-expr: 2.0.6
+ toposort: 2.0.2
diff --git a/scripts/build.ts b/scripts/build.ts
new file mode 100644
index 0000000..6a2359c
--- /dev/null
+++ b/scripts/build.ts
@@ -0,0 +1,8 @@
+import path from 'path';
+
+import { build } from '../src';
+
+build({ cwd: path.resolve(__dirname, '..'), debug: !!process.env.DEBUG }).catch((err) => {
+ console.error(err.stack);
+ process.exit(1);
+});
diff --git a/scripts/check.ts b/scripts/check.ts
new file mode 100644
index 0000000..e0e5509
--- /dev/null
+++ b/scripts/check.ts
@@ -0,0 +1,6 @@
+import { check } from '../src';
+
+check().catch((err) => {
+ console.error(err.stack);
+ process.exit(1);
+});
diff --git a/scripts/watch.ts b/scripts/watch.ts
new file mode 100644
index 0000000..315e480
--- /dev/null
+++ b/scripts/watch.ts
@@ -0,0 +1,8 @@
+import path from 'path';
+
+import { watch } from '../src';
+
+watch({ cwd: path.resolve(__dirname, '..'), debug: !!process.env.DEBUG }).catch((err) => {
+ console.error(err.stack);
+ process.exit(1);
+});
diff --git a/src/__tests__/cli.test.ts b/src/__tests__/cli.test.ts
new file mode 100644
index 0000000..4db21ba
--- /dev/null
+++ b/src/__tests__/cli.test.ts
@@ -0,0 +1,45 @@
+import { spawn } from '../../tests/spawn';
+
+/**
+ * This has issues running in the CI due to how yarn3 works.
+ */
+// TODO: move this to an actual CLI test since it's too flaky and isn't really necessary since it is already de-facto tested by building everything
+describe.skip('cli', () => {
+ const timeout = 1000 * 120;
+
+ describe.skip('build & check', () => {
+ it(
+ 'should build `cjs-js` package',
+ async () => {
+ const project = await spawn('cjs-js');
+
+ await project.install();
+
+ const { stdout } = await project.run('build');
+
+ expect(stdout).toContain('./src/index.js β ./dist/index.mjs');
+ expect(stdout).toContain('./src/index.js β ./dist/index.js');
+
+ await project.remove();
+ },
+ timeout
+ );
+
+ it(
+ 'should build `esm-js` package',
+ async () => {
+ const project = await spawn('esm-js');
+
+ await project.install();
+
+ const { stdout } = await project.run('build');
+
+ expect(stdout).toContain('./src/index.js β ./dist/index.cjs');
+ expect(stdout).toContain('./src/index.js β ./dist/index.js');
+
+ await project.remove();
+ },
+ timeout
+ );
+ });
+});
diff --git a/src/__tests__/node.test.ts b/src/__tests__/node.test.ts
new file mode 100644
index 0000000..8d5a719
--- /dev/null
+++ b/src/__tests__/node.test.ts
@@ -0,0 +1,343 @@
+import { stripColor } from '../../tests/console';
+import { createWorkspace } from '../../tests/workspaces';
+import { init } from '../node/init';
+import { defaultTemplate } from '../node/templates/internal/default';
+
+import type {
+ Template,
+ TemplateOrTemplateResolver,
+ TemplateResolver,
+} from '../node/templates/types';
+
+const loggerMock = {
+ debug: jest.fn(),
+ info: jest.fn(),
+ warn: jest.fn(),
+ error: jest.fn(),
+};
+
+describe('node', () => {
+ /**
+ * @note You can't use the default template because it has prompts and we can't
+ * interact with the terminal when using the node-api. Instead we just pass a small
+ * template that doesn't have any prompts to ensure it runs all the way through.
+ */
+ describe('init', () => {
+ afterEach(() => {
+ jest.clearAllMocks();
+ });
+
+ const infoRegex = /^\[INFO\]\s+Creating a new package at/;
+ const successRegex = /^\[SUCCESS\]\s+Wrote .*tests\/__tmp__\//;
+
+ it('should init a package with the default template', async () => {
+ const infoSpy = jest.spyOn(global.console, 'info').mockImplementation(() => {});
+
+ const workspace = await createWorkspace();
+
+ const template = await makeTemplateFromDefault(workspace.path, [
+ {
+ name: 'pkgName',
+ answer: 'test',
+ },
+ {
+ name: 'pkgName',
+ answer: 'test',
+ },
+ {
+ name: 'license',
+ answer: 'MIT',
+ },
+ {
+ name: 'typescript',
+ answer: true,
+ },
+ {
+ name: 'eslint',
+ answer: true,
+ },
+ ]);
+
+ await init({
+ path: workspace.path,
+ template,
+ });
+
+ expect(infoSpy.mock.calls).toHaveLength(12);
+
+ const [info, ...successMsgs] = infoSpy.mock.calls;
+
+ expect(infoRegex.test(stripColor(info.join('')))).toBeTruthy();
+
+ successMsgs.forEach((msg) => {
+ expect(successRegex.test(stripColor(msg.join('')))).toBeTruthy();
+ });
+
+ expect(getFilesProducedFromSuccessMessags(successMsgs)).toMatchInlineSnapshot(`
+ [
+ ".editorconfig",
+ ".eslintignore",
+ ".eslintrc",
+ ".gitignore",
+ ".prettierignore",
+ ".prettierrc",
+ "package.json",
+ "src/index.ts",
+ "tsconfig.build.json",
+ "tsconfig.eslint.json",
+ "tsconfig.json",
+ ]
+ `);
+
+ await workspace.remove();
+ });
+
+ it('should init a package with the default template but not include typescript', async () => {
+ const infoSpy = jest.spyOn(global.console, 'info').mockImplementation(() => {});
+
+ const workspace = await createWorkspace();
+
+ const template = await makeTemplateFromDefault(workspace.path, [
+ {
+ name: 'pkgName',
+ answer: 'test',
+ },
+ {
+ name: 'pkgName',
+ answer: 'test',
+ },
+ {
+ name: 'license',
+ answer: 'MIT',
+ },
+ {
+ name: 'typescript',
+ answer: false,
+ },
+ {
+ name: 'eslint',
+ answer: true,
+ },
+ ]);
+
+ await init({
+ path: workspace.path,
+ template,
+ });
+
+ expect(infoSpy.mock.calls).toHaveLength(9);
+
+ const [info, ...successMsgs] = infoSpy.mock.calls;
+
+ expect(infoRegex.test(stripColor(info.join('')))).toBeTruthy();
+
+ successMsgs.forEach((msg) => {
+ expect(successRegex.test(stripColor(msg.join('')))).toBeTruthy();
+ });
+
+ expect(getFilesProducedFromSuccessMessags(successMsgs)).toMatchInlineSnapshot(`
+ [
+ ".editorconfig",
+ ".eslintignore",
+ ".eslintrc",
+ ".gitignore",
+ ".prettierignore",
+ ".prettierrc",
+ "package.json",
+ "src/index.js",
+ ]
+ `);
+
+ await workspace.remove();
+ });
+
+ it('should init a package with the default template but not include eslint', async () => {
+ const infoSpy = jest.spyOn(global.console, 'info').mockImplementation(() => {});
+
+ const workspace = await createWorkspace();
+
+ const template = await makeTemplateFromDefault(workspace.path, [
+ {
+ name: 'pkgName',
+ answer: 'test',
+ },
+ {
+ name: 'pkgName',
+ answer: 'test',
+ },
+ {
+ name: 'license',
+ answer: 'MIT',
+ },
+ {
+ name: 'typescript',
+ answer: true,
+ },
+ {
+ name: 'eslint',
+ answer: false,
+ },
+ ]);
+
+ await init({
+ path: workspace.path,
+ template,
+ });
+
+ expect(infoSpy.mock.calls).toHaveLength(9);
+
+ const [info, ...successMsgs] = infoSpy.mock.calls;
+
+ expect(infoRegex.test(stripColor(info.join('')))).toBeTruthy();
+
+ successMsgs.forEach((msg) => {
+ expect(successRegex.test(stripColor(msg.join('')))).toBeTruthy();
+ });
+
+ expect(getFilesProducedFromSuccessMessags(successMsgs)).toMatchInlineSnapshot(`
+ [
+ ".editorconfig",
+ ".gitignore",
+ ".prettierignore",
+ ".prettierrc",
+ "package.json",
+ "src/index.ts",
+ "tsconfig.build.json",
+ "tsconfig.json",
+ ]
+ `);
+
+ await workspace.remove();
+ });
+
+ it('should init a package with the default template but not include eslint or typescript', async () => {
+ const infoSpy = jest.spyOn(global.console, 'info').mockImplementation(() => {});
+
+ const workspace = await createWorkspace();
+
+ const template = await makeTemplateFromDefault(workspace.path, [
+ {
+ name: 'pkgName',
+ answer: 'test',
+ },
+ {
+ name: 'pkgName',
+ answer: 'test',
+ },
+ {
+ name: 'license',
+ answer: 'MIT',
+ },
+ {
+ name: 'typescript',
+ answer: false,
+ },
+ {
+ name: 'eslint',
+ answer: false,
+ },
+ ]);
+
+ await init({
+ path: workspace.path,
+ template,
+ });
+
+ expect(infoSpy.mock.calls).toHaveLength(7);
+
+ const [info, ...successMsgs] = infoSpy.mock.calls;
+
+ expect(infoRegex.test(stripColor(info.join('')))).toBeTruthy();
+
+ successMsgs.forEach((msg) => {
+ expect(successRegex.test(stripColor(msg.join('')))).toBeTruthy();
+ });
+
+ expect(getFilesProducedFromSuccessMessags(successMsgs)).toMatchInlineSnapshot(`
+ [
+ ".editorconfig",
+ ".gitignore",
+ ".prettierignore",
+ ".prettierrc",
+ "package.json",
+ "src/index.js",
+ ]
+ `);
+
+ await workspace.remove();
+ });
+
+ it('should init a package with the provided template', async () => {
+ const infoSpy = jest.spyOn(global.console, 'info').mockImplementation(() => {});
+
+ const workspace = await createWorkspace();
+
+ const template: TemplateOrTemplateResolver = {
+ async getFiles() {
+ return [
+ {
+ name: 'package.json',
+ contents: '',
+ },
+ {
+ name: 'README.md',
+ contents: '',
+ },
+ ];
+ },
+ };
+
+ await init({
+ path: workspace.path,
+ template,
+ });
+
+ expect(infoSpy.mock.calls).toHaveLength(3);
+
+ const [info, ...successMsgs] = infoSpy.mock.calls;
+
+ expect(infoRegex.test(stripColor(info.join('')))).toBeTruthy();
+
+ successMsgs.forEach((msg) => {
+ expect(successRegex.test(stripColor(msg.join('')))).toBeTruthy();
+ });
+
+ expect(getFilesProducedFromSuccessMessags(successMsgs)).toMatchInlineSnapshot(`
+ [
+ "package.json",
+ "README.md",
+ ]
+ `);
+
+ await workspace.remove();
+ });
+ });
+});
+
+const makeTemplateFromDefault = async (
+ path: string,
+ answers: Parameters['0']
+) => {
+ const template = await (defaultTemplate as TemplateResolver)({
+ packagePath: path,
+ cwd: '.',
+ // @ts-expect-error it's okay to mock this.
+ logger: loggerMock,
+ });
+
+ const files = await template.getFiles(answers);
+
+ return {
+ getFiles: async () => files,
+ };
+};
+
+const getFilesProducedFromSuccessMessags = (successMsgs: Array) => {
+ const everythingAfterUUIDRegex =
+ /([a-f\d]{8}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{4}-[a-f\d]{12})\/(.*)/;
+ const filesProduce = successMsgs.map(([, msg]) => msg.match(everythingAfterUUIDRegex));
+
+ return (filesProduce.filter((match) => match !== null) as RegExpMatchArray[]).map(
+ ([, , file]) => file
+ );
+};
diff --git a/src/cli/commands/build.ts b/src/cli/commands/build.ts
new file mode 100644
index 0000000..ee419ab
--- /dev/null
+++ b/src/cli/commands/build.ts
@@ -0,0 +1,12 @@
+import { build as nodeBuild } from '../../node/build';
+import { handleError } from '../errors';
+
+import type { BuildCLIOptions } from '../../node/build';
+
+export const build = async (options: BuildCLIOptions) => {
+ try {
+ await nodeBuild(options);
+ } catch (err) {
+ handleError(err);
+ }
+};
diff --git a/src/cli/commands/check.ts b/src/cli/commands/check.ts
new file mode 100644
index 0000000..4d97a5a
--- /dev/null
+++ b/src/cli/commands/check.ts
@@ -0,0 +1,12 @@
+import { check as nodeCheck } from '../../node/check';
+import { handleError } from '../errors';
+
+import type { CheckOptions } from '../../node/check';
+
+export const check = async (options: CheckOptions) => {
+ try {
+ await nodeCheck(options);
+ } catch (err) {
+ handleError(err);
+ }
+};
diff --git a/src/cli/commands/init.ts b/src/cli/commands/init.ts
new file mode 100644
index 0000000..2455025
--- /dev/null
+++ b/src/cli/commands/init.ts
@@ -0,0 +1,12 @@
+import { init as nodeInit } from '../../node/init';
+import { handleError } from '../errors';
+
+import type { InitOptions } from '../../node/init';
+
+export const init = async (options: InitOptions) => {
+ try {
+ await nodeInit(options);
+ } catch (err) {
+ handleError(err);
+ }
+};
diff --git a/src/cli/commands/watch.ts b/src/cli/commands/watch.ts
new file mode 100644
index 0000000..60296b9
--- /dev/null
+++ b/src/cli/commands/watch.ts
@@ -0,0 +1,12 @@
+import { watch as nodeWatch } from '../../node/watch';
+import { handleError } from '../errors';
+
+import type { WatchCLIOptions } from '../../node/watch';
+
+export const watch = async (options: WatchCLIOptions) => {
+ try {
+ await nodeWatch(options);
+ } catch (err) {
+ handleError(err);
+ }
+};
diff --git a/src/cli/errors.ts b/src/cli/errors.ts
new file mode 100644
index 0000000..d401338
--- /dev/null
+++ b/src/cli/errors.ts
@@ -0,0 +1,29 @@
+import boxen from 'boxen';
+import chalk from 'chalk';
+import os from 'os';
+
+import { isError } from '../node/core/errors';
+
+export const handleError = (err: unknown) => {
+ console.error(
+ chalk.red(
+ '[ERROR] ',
+ 'There seems to be an unexpected error, try again with --debug for more information',
+ os.EOL
+ )
+ );
+
+ if (isError(err) && err.stack) {
+ // eslint-disable-next-line no-console
+ console.log(
+ chalk.red(
+ boxen(err.stack, {
+ padding: 1,
+ align: 'left',
+ })
+ )
+ );
+ }
+
+ process.exit(1);
+};
diff --git a/src/cli/index.ts b/src/cli/index.ts
new file mode 100644
index 0000000..ac8b88b
--- /dev/null
+++ b/src/cli/index.ts
@@ -0,0 +1,57 @@
+import chalk from 'chalk';
+import { program } from 'commander';
+import os from 'os';
+
+import { version } from '../../package.json';
+
+const command = (name: string) =>
+ program
+ .command(name)
+ .option('-d, --debug', 'Get more logs in debug mode', false)
+ .option('-s, --silent', "Don't log anything", false);
+
+command('check').action(async (options) => {
+ const { check } = await import('./commands/check');
+
+ return check(options);
+});
+
+command('build')
+ .option('--sourcemap', 'produce sourcemaps', true)
+ .option('--minify', 'minify the output', false)
+ .action(async (options) => {
+ const { build } = await import('./commands/build');
+
+ return build(options);
+ });
+
+command('init')
+ .argument('', 'path to the package')
+ .option('--template', 'path to a custom template')
+ .action(async (path, options) => {
+ const { init } = await import('./commands/init');
+
+ return init({ path, ...options });
+ });
+
+command('watch').action(async (options) => {
+ const { watch } = await import('./commands/watch');
+
+ return watch(options);
+});
+
+program
+ .usage(' [options]')
+ .on('command:*', ([invalidCmd]) => {
+ console.error(
+ chalk.red(
+ `[ERROR] Invalid command: ${invalidCmd}.${os.EOL} See --help for a list of available commands.`
+ )
+ );
+
+ process.exit(1);
+ })
+ .helpOption('-h, --help', 'Print command line options')
+ .addHelpCommand('help [command]', 'Print options for a specific command')
+ .version(version)
+ .parse(process.argv);
diff --git a/src/index.ts b/src/index.ts
new file mode 100644
index 0000000..4d6f28b
--- /dev/null
+++ b/src/index.ts
@@ -0,0 +1,23 @@
+export * from './node/build';
+export * from './node/watch';
+export * from './node/check';
+export * from './node/init';
+
+export { defineConfig } from './node/core/config';
+export type {
+ Config,
+ ConfigOptions,
+ ConfigBundle,
+ ConfigPropertyResolver,
+ ConfigProperty,
+ PluginOption,
+ Runtime,
+} from './node/core/config';
+
+export { defineTemplate, definePackageFeature, definePackageOption } from './node/templates/create';
+export type {
+ TemplateOrTemplateResolver,
+ TemplateFeature,
+ TemplateOption,
+ TemplateFile,
+} from './node/templates/types';
diff --git a/src/node/build.ts b/src/node/build.ts
new file mode 100644
index 0000000..ecd8285
--- /dev/null
+++ b/src/node/build.ts
@@ -0,0 +1,167 @@
+import fs from 'fs/promises';
+import ora from 'ora';
+import os from 'os';
+
+import { loadConfig, type Config } from './core/config';
+import { isError } from './core/errors';
+import { getExportExtensionMap, validateExportsOrdering } from './core/exports';
+import { createLogger } from './core/logger';
+import { loadPkg, validatePkg } from './core/pkg';
+import { createBuildContext } from './createBuildContext';
+import { createBuildTasks } from './createTasks';
+import { taskHandlers } from './tasks';
+
+import type { BuildTask } from './createTasks';
+import type { TaskHandler } from './tasks';
+import type { CommonCLIOptions } from '../types';
+
+interface BuildCLIOptions extends CommonCLIOptions {
+ minify?: boolean;
+ sourcemap?: boolean;
+}
+
+interface BuildWithConfigFile extends BuildCLIOptions {
+ configFile?: true;
+ config?: never;
+ cwd?: string;
+}
+
+interface BuildWithoutConfigFile extends BuildCLIOptions {
+ configFile: false;
+ config?: Config;
+ cwd?: string;
+}
+
+type BuildOptions = BuildWithConfigFile | BuildWithoutConfigFile;
+
+const build = async (opts: BuildOptions = {}) => {
+ /**
+ * We always want to run in production mode when building and some packages
+ * use NODE_ENV to determine which type of package to import (looking at your react).
+ * Therefore for building, unless it's specifically set by the user, we'll set it to production.
+ */
+ process.env.NODE_ENV = process.env.NODE_ENV || 'production';
+
+ const {
+ silent,
+ debug,
+ cwd = process.cwd(),
+ configFile = true,
+ config: providedConfig,
+ ...configOptions
+ } = opts;
+
+ const logger = createLogger({ silent, debug });
+
+ /**
+ * Load the closest package.json and then verify the structure against what we expect.
+ */
+ const packageJsonLoader = ora(`Verifying package.json ${os.EOL}`).start();
+
+ const rawPkg = await loadPkg({ cwd, logger }).catch((err) => {
+ packageJsonLoader.fail();
+
+ if (isError(err)) {
+ logger.error(err.message);
+ }
+
+ logger.debug(`Path checked β ${cwd}`);
+ process.exit(1);
+ });
+
+ const validatedPkg = await validatePkg({
+ pkg: rawPkg,
+ }).catch((err) => {
+ packageJsonLoader.fail();
+
+ if (isError(err)) {
+ logger.error(err.message);
+ }
+
+ process.exit(1);
+ });
+
+ /**
+ * Validate the exports of the package incl. the order of the
+ * exports within the exports map if applicable
+ */
+ const packageJson = await validateExportsOrdering({ pkg: validatedPkg, logger }).catch((err) => {
+ packageJsonLoader.fail();
+ if (isError(err)) {
+ logger.error(err.message);
+ }
+ process.exit(1);
+ });
+
+ packageJsonLoader.succeed('Verified package.json');
+
+ /**
+ * If configFile is true β which is the default, atempt to load the config
+ * otherwise if it's explicitly false then we suspect there might be a config passed
+ * in the options, so we'll use that instead.
+ */
+ const config = configFile ? await loadConfig({ cwd, logger }) : providedConfig;
+
+ /**
+ * We create tasks based on the exports of the package.json
+ * their handlers are then ran in the order of the exports map
+ * and results are logged to see gradual progress.
+ */
+ const buildContextLoader = ora(`Creating build context ${os.EOL}`).start();
+
+ const extMap = getExportExtensionMap();
+
+ const ctx = await createBuildContext({
+ config: { ...config, ...configOptions },
+ cwd,
+ extMap,
+ logger,
+ pkg: packageJson,
+ }).catch((err) => {
+ buildContextLoader.fail();
+ if (isError(err)) {
+ logger.error(err.message);
+ }
+ process.exit(1);
+ });
+
+ logger.debug(`Build context: ${os.EOL}`, ctx);
+
+ const buildTasks = await createBuildTasks(ctx);
+
+ buildContextLoader.succeed('Created build context');
+
+ /**
+ * If the distPath already exists, clean it
+ */
+ try {
+ logger.debug(`Cleaning dist folder: ${ctx.distPath}`);
+ await fs.rm(ctx.distPath, { recursive: true, force: true });
+ logger.debug('Cleaned dist folder');
+ } catch {
+ // do nothing, it will fail if the folder does not exist
+ logger.debug('There was no dist folder to clean');
+ }
+
+ for (const task of buildTasks) {
+ const handler = taskHandlers[task.type] as TaskHandler;
+
+ handler.print(ctx, task);
+
+ const result$ = handler.run$(ctx, task);
+
+ result$.subscribe({
+ complete() {
+ handler.success(ctx, task);
+ },
+ error(err) {
+ handler.fail(ctx, task, err);
+ // exit as soon as one task fails
+ process.exit(1);
+ },
+ });
+ }
+};
+
+export { build };
+export type { BuildOptions, BuildCLIOptions, BuildWithConfigFile, BuildWithoutConfigFile };
diff --git a/src/node/check.ts b/src/node/check.ts
new file mode 100644
index 0000000..915b30c
--- /dev/null
+++ b/src/node/check.ts
@@ -0,0 +1,278 @@
+import chalk from 'chalk';
+import esbuild from 'esbuild';
+import ora from 'ora';
+import os from 'os';
+import { resolve } from 'path';
+
+import { loadConfig } from './core/config';
+import { isError } from './core/errors';
+import { getExportExtensionMap, validateExportsOrdering } from './core/exports';
+import { pathExists } from './core/files';
+import { createLogger } from './core/logger';
+import { loadPkg, validatePkg } from './core/pkg';
+import { createBuildContext } from './createBuildContext';
+
+import type { Logger } from './core/logger';
+import type { CommonCLIOptions } from '../types';
+import type { BuildFailure, Format, Message } from 'esbuild';
+
+export interface CheckOptions extends CommonCLIOptions {
+ cwd?: string;
+}
+
+export const check = async (opts: CheckOptions = {}) => {
+ const { silent, debug, cwd = process.cwd() } = opts;
+
+ const logger = createLogger({ silent, debug });
+
+ /**
+ * Load the closest package.json and then verify the structure against what we expect.
+ */
+ const packageJsonLoader = ora(`Verifying package.json ${os.EOL}`).start();
+
+ const rawPkg = await loadPkg({ cwd, logger }).catch((err) => {
+ packageJsonLoader.fail();
+ logger.error(err.message);
+ logger.debug(`Path checked β ${cwd}`);
+ process.exit(1);
+ });
+
+ const validatedPkg = await validatePkg({
+ pkg: rawPkg,
+ }).catch((err) => {
+ packageJsonLoader.fail();
+ logger.error(err.message);
+ process.exit(1);
+ });
+
+ /**
+ * Validate the exports of the package incl. the order of the
+ * exports within the exports map if applicable
+ */
+ const packageJson = await validateExportsOrdering({ pkg: validatedPkg, logger }).catch((err) => {
+ packageJsonLoader.fail();
+ logger.error(err.message);
+ process.exit(1);
+ });
+
+ packageJsonLoader.succeed('Verified package.json');
+
+ /**
+ * We create tasks based on the exports of the package.json
+ * their handlers are then ran in the order of the exports map
+ * and results are logged to see gradual progress.
+ */
+ const config = await loadConfig({ cwd, logger });
+
+ const extMap = getExportExtensionMap();
+
+ const ctx = await createBuildContext({
+ config: { ...config },
+ cwd,
+ extMap,
+ logger,
+ pkg: packageJson,
+ }).catch((err) => {
+ logger.error(err.message);
+ process.exit(1);
+ });
+
+ logger.debug(`Build context: ${os.EOL}`, ctx);
+
+ const missingExports: string[] = [];
+
+ const checkingFilePathsLoader = ora('Checking files for exports').start();
+
+ /**
+ * This is arguably verbose but realistically it's clearer what we're checking here
+ * which is _every_ export option you've declared in your package.json is a real file.
+ */
+ for (const exp of Object.values(ctx.exports)) {
+ if (exp.source && !(await pathExists(resolve(ctx.cwd, exp.source)))) {
+ missingExports.push(exp.source);
+ }
+
+ if (exp.types && !(await pathExists(resolve(ctx.cwd, exp.types)))) {
+ missingExports.push(exp.types);
+ }
+
+ if (exp.require && !(await pathExists(resolve(ctx.cwd, exp.require)))) {
+ missingExports.push(exp.require);
+ }
+
+ if (exp.import && !(await pathExists(resolve(ctx.cwd, exp.import)))) {
+ missingExports.push(exp.import);
+ }
+
+ if (exp.module && !(await pathExists(resolve(ctx.cwd, exp.module)))) {
+ missingExports.push(exp.module);
+ }
+
+ if (exp.default && !(await pathExists(resolve(ctx.cwd, exp.default)))) {
+ missingExports.push(exp.default);
+ }
+
+ if (exp.browser) {
+ if (exp.browser.source && !(await pathExists(resolve(ctx.cwd, exp.browser.source)))) {
+ missingExports.push(exp.browser.source);
+ }
+
+ if (exp.browser.import && !(await pathExists(resolve(ctx.cwd, exp.browser.import)))) {
+ missingExports.push(exp.browser.import);
+ }
+
+ if (exp.browser.require && !(await pathExists(resolve(ctx.cwd, exp.browser.require)))) {
+ missingExports.push(exp.browser.require);
+ }
+ }
+
+ if (exp.node) {
+ if (exp.node.source && !(await pathExists(resolve(ctx.cwd, exp.node.source)))) {
+ missingExports.push(exp.node.source);
+ }
+
+ if (exp.node.import && !(await pathExists(resolve(ctx.cwd, exp.node.import)))) {
+ missingExports.push(exp.node.import);
+ }
+
+ if (exp.node.require && !(await pathExists(resolve(ctx.cwd, exp.node.require)))) {
+ missingExports.push(exp.node.require);
+ }
+
+ if (exp.node.module && !(await pathExists(resolve(ctx.cwd, exp.node.module)))) {
+ missingExports.push(exp.node.module);
+ }
+ }
+ }
+
+ if (missingExports.length) {
+ checkingFilePathsLoader.fail('');
+ logger.error(
+ [
+ 'Missing files for exports:',
+ ...missingExports.map((str) => ` ${chalk.blue(str)} -> ${resolve(ctx.cwd, str)}`),
+ ].join(os.EOL)
+ );
+ process.exit(1);
+ }
+
+ checkingFilePathsLoader.succeed('');
+
+ /**
+ * Now we know the files exist, we want to double check that they can be accurately resolved.
+ */
+ const exportPaths = Object.values(ctx.exports).reduce<{ require: string[]; import: string[] }>(
+ (acc, exp) => {
+ if (exp.require) {
+ acc.require.push(exp.require);
+ }
+ if (exp.import) {
+ acc.import.push(exp.import);
+ }
+
+ return acc;
+ },
+ {
+ require: [],
+ import: [],
+ }
+ );
+
+ if (exportPaths.import.length > 0) {
+ await resolveExports(exportPaths.import, {
+ cwd: ctx.cwd,
+ external: ctx.external,
+ format: 'esm',
+ logger,
+ });
+ }
+ if (exportPaths.require.length > 0) {
+ await resolveExports(exportPaths.require, {
+ cwd: ctx.cwd,
+ external: ctx.external,
+ format: 'cjs',
+ logger,
+ });
+ }
+};
+
+interface ResolveExportsOptions {
+ cwd: string;
+ external: string[];
+ format: Format;
+ logger: Logger;
+}
+
+const resolveExports = async (
+ paths: string[],
+ { cwd, format, external, logger }: ResolveExportsOptions
+) => {
+ const esbuildLoader = ora(`Resolving ${format} exports`).start();
+
+ const code = paths
+ .map((id) => (format === 'esm' ? `import('${id}');` : `require('${id}');`))
+ .join(os.EOL);
+
+ try {
+ const esbuildResult = await esbuild.build({
+ bundle: true,
+ external,
+ format,
+ logLevel: 'silent',
+ // otherwise output maps to stdout as we're using stdin
+ outfile: '/dev/null',
+ platform: 'node',
+ stdin: {
+ contents: code,
+ loader: 'js',
+ resolveDir: cwd,
+ },
+ });
+
+ if (esbuildResult.errors.length > 0) {
+ for (const msg of esbuildResult.errors) {
+ printESBuildMessage(msg, logger.error);
+ }
+
+ esbuildLoader.fail();
+ process.exit(1);
+ }
+
+ const esbuildWarnings = esbuildResult.warnings.filter(
+ (msg) => !(msg.detail || msg.text).includes("does not affect esbuild's own target setting")
+ );
+
+ for (const msg of esbuildWarnings) {
+ printESBuildMessage(msg, logger.warn);
+ }
+
+ esbuildLoader.succeed();
+ } catch (err) {
+ if (isESBuildError(err)) {
+ for (const msg of err.errors) {
+ printESBuildMessage(msg, logger.error);
+ }
+ }
+
+ esbuildLoader.fail();
+ process.exit(1);
+ }
+};
+
+const isESBuildError = (err: unknown): err is BuildFailure => {
+ return isError(err) && 'errors' in err && 'warnings' in err;
+};
+
+const printESBuildMessage = (msg: Message, log: Logger['error']) => {
+ if (msg.location) {
+ log(
+ [
+ `${msg.detail || msg.text}`,
+ `${msg.location.line} | ${msg.location.lineText}`,
+ `in ./${msg.location.file}:${msg.location.line}:${msg.location.column}`,
+ ].join(os.EOL)
+ );
+ } else {
+ log(msg.detail || msg.text);
+ }
+};
diff --git a/src/node/core/__tests__/exports.test.ts b/src/node/core/__tests__/exports.test.ts
new file mode 100644
index 0000000..6abc9ac
--- /dev/null
+++ b/src/node/core/__tests__/exports.test.ts
@@ -0,0 +1,365 @@
+import { validateExportsOrdering, parseExports, getExportExtensionMap } from '../exports';
+
+import type { PackageJson } from '../pkg';
+
+const loggerMock = {
+ debug: jest.fn(),
+ info: jest.fn(),
+ warn: jest.fn(),
+ error: jest.fn(),
+};
+
+describe('exports', () => {
+ afterEach(() => {
+ jest.resetAllMocks();
+ });
+
+ describe('validateExportsOrdering', () => {
+ it('should throw if there are no exports at all and log that error', async () => {
+ const pkg = {
+ name: 'testing',
+ version: '0.0.0',
+ };
+
+ await expect(
+ // @ts-expect-error - we are testing the error case
+ validateExportsOrdering({ pkg, logger: loggerMock })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ "\"'package.json' must contain a 'main' and 'module' property\""
+ );
+ });
+
+ it("should return the package if there is at least a 'main' or 'module' property", async () => {
+ // @ts-expect-error - issue with Yup inference
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ main: './index.js',
+ };
+
+ // @ts-expect-error - Logger is mocked
+ const validatedPkg = await validateExportsOrdering({ pkg, logger: loggerMock });
+
+ expect(validatedPkg).toMatchInlineSnapshot(`
+ {
+ "main": "./index.js",
+ "name": "testing",
+ "version": "0.0.0",
+ }
+ `);
+ });
+
+ it('should return the package if there is an exports property with a valid structure', async () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ exports: {
+ './package.json': './package.json',
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ types: './admin/index.d.ts',
+ import: './admin/index.js',
+ require: './admin/index.cjs',
+ source: './src/admin/index.js',
+ default: './admin/index.js',
+ },
+ },
+ };
+
+ // @ts-expect-error - Logger is mocked
+ const validatedPkg = await validateExportsOrdering({ pkg, logger: loggerMock });
+
+ expect(validatedPkg).toMatchInlineSnapshot(`
+ {
+ "exports": {
+ "./admin": {
+ "default": "./admin/index.js",
+ "import": "./admin/index.js",
+ "require": "./admin/index.cjs",
+ "source": "./src/admin/index.js",
+ "types": "./admin/index.d.ts",
+ },
+ "./package.json": "./package.json",
+ },
+ "name": "testing",
+ "version": "0.0.0",
+ }
+ `);
+ });
+
+ it('should throw if the types property is not the first in an export object', async () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ exports: {
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ import: './admin/index.js',
+ types: './admin/index.d.ts',
+ require: './admin/index.cjs',
+ source: './src/admin/index.js',
+ default: './admin/index.js',
+ },
+ },
+ };
+
+ await expect(
+ // @ts-expect-error - Logger is mocked
+ validateExportsOrdering({ pkg, logger: loggerMock })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '"exports["./admin"]: the \'types\' property should be the first property"'
+ );
+ });
+
+ it('should log a warning if the require property comes before the import property in an export object', async () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ exports: {
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ types: './admin/index.d.ts',
+ require: './admin/index.cjs',
+ import: './admin/index.js',
+ source: './src/admin/index.js',
+ default: './admin/index.js',
+ },
+ },
+ };
+
+ // @ts-expect-error - Logger is mocked
+ await validateExportsOrdering({ pkg, logger: loggerMock });
+
+ expect(loggerMock.warn.mock.calls[0]).toMatchInlineSnapshot(`
+ [
+ "exports["./admin"]: the 'import' property should come before the 'require' property",
+ ]
+ `);
+ });
+ });
+
+ describe('getExportExtensionMap', () => {
+ it('should just return the default mapping', async () => {
+ expect(getExportExtensionMap()).toMatchInlineSnapshot(`
+ {
+ "commonjs": {
+ "cjs": ".js",
+ "es": ".mjs",
+ },
+ "module": {
+ "cjs": ".cjs",
+ "es": ".js",
+ },
+ }
+ `);
+ });
+ });
+
+ describe('parseExports', () => {
+ const extMap = getExportExtensionMap();
+
+ it('should by default return a root exports map using the standard export fields from the pkg.json', () => {
+ // @ts-expect-error - issue with Yup inference
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ types: './dist/index.d.ts',
+ main: './dist/index.js',
+ module: './dist/index.mjs',
+ source: './src/index.ts',
+ };
+
+ expect(parseExports({ pkg, extMap })).toMatchInlineSnapshot(`
+ [
+ {
+ "_path": ".",
+ "default": "./dist/index.mjs",
+ "import": "./dist/index.mjs",
+ "require": "./dist/index.js",
+ "source": "./src/index.ts",
+ "types": "./dist/index.d.ts",
+ },
+ ]
+ `);
+ });
+
+ it("should not return anything if the standard export fields don't exist and there is no export map", () => {
+ const pkg = {};
+
+ // @ts-expect-error - We expect this to fail
+ expect(parseExports({ pkg, extMap })).toMatchInlineSnapshot('[]');
+ });
+
+ it('should return a combination of the standard export fields and the export map if they both exist', () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ types: './dist/index.d.ts',
+ main: './dist/index.js',
+ module: './dist/index.mjs',
+ source: './src/index.ts',
+ exports: {
+ './package.json': './package.json',
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ types: './admin/index.d.ts',
+ import: './admin/index.mjs',
+ require: './admin/index.js',
+ default: './admin/index.js',
+ source: './src/admin/index.js',
+ },
+ },
+ };
+
+ expect(parseExports({ pkg, extMap })).toMatchInlineSnapshot(`
+ [
+ {
+ "_path": ".",
+ "default": "./dist/index.mjs",
+ "import": "./dist/index.mjs",
+ "require": "./dist/index.js",
+ "source": "./src/index.ts",
+ "types": "./dist/index.d.ts",
+ },
+ {
+ "_exported": true,
+ "_path": "./admin",
+ "default": "./admin/index.js",
+ "import": "./admin/index.mjs",
+ "require": "./admin/index.js",
+ "source": "./src/admin/index.js",
+ "types": "./admin/index.d.ts",
+ },
+ ]
+ `);
+ });
+
+ it('should return just the exports map if there are no standard export fields and the export map exists', () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ exports: {
+ './package.json': './package.json',
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ types: './admin/index.d.ts',
+ import: './admin/index.mjs',
+ require: './admin/index.js',
+ default: './admin/index.js',
+ source: './src/admin/index.js',
+ },
+ },
+ };
+
+ expect(parseExports({ pkg, extMap })).toMatchInlineSnapshot(`
+ [
+ {
+ "_exported": true,
+ "_path": "./admin",
+ "default": "./admin/index.js",
+ "import": "./admin/index.mjs",
+ "require": "./admin/index.js",
+ "source": "./src/admin/index.js",
+ "types": "./admin/index.d.ts",
+ },
+ ]
+ `);
+ });
+
+ it('should throw an error if you try to use an exports map without supplying an export for the package.json file', () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ exports: {
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ types: './admin/index.d.ts',
+ import: './admin/index.mjs',
+ require: './admin/index.js',
+ default: './admin/index.js',
+ source: './src/admin/index.js',
+ },
+ },
+ };
+
+ expect(() => parseExports({ pkg, extMap })).toThrowErrorMatchingInlineSnapshot(`
+ "
+ - package.json: \`exports["./package.json"] must be declared."
+ `);
+ });
+
+ it('should throw an error if the pkg.json type is undefined and you try to export like a module', () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ exports: {
+ './package.json': './package.json',
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ types: './admin/index.d.ts',
+ import: './admin/index.js',
+ require: './admin/index.cjs',
+ default: './admin/index.cjs',
+ source: './src/admin/index.js',
+ },
+ },
+ };
+
+ expect(() => parseExports({ pkg, extMap })).toThrowErrorMatchingInlineSnapshot(`
+ "
+ - package.json with 'type: "undefined"' - 'exports["./admin"].require' must end with ".js"
+ - package.json with 'type: "undefined"' - 'exports["./admin"].import' must end with ".mjs""
+ `);
+ });
+
+ it('should throw an error if the pkg.json type is commonjs and you try to export like a module', () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ type: 'commonjs',
+ exports: {
+ './package.json': './package.json',
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ types: './admin/index.d.ts',
+ import: './admin/index.js',
+ require: './admin/index.cjs',
+ default: './admin/index.cjs',
+ source: './src/admin/index.js',
+ },
+ },
+ };
+
+ expect(() => parseExports({ pkg, extMap })).toThrowErrorMatchingInlineSnapshot(`
+ "
+ - package.json with 'type: "commonjs"' - 'exports["./admin"].require' must end with ".js"
+ - package.json with 'type: "commonjs"' - 'exports["./admin"].import' must end with ".mjs""
+ `);
+ });
+
+ it('should throw an error if the pkg.json type is module and you try to export like a commonjs', () => {
+ const pkg: PackageJson = {
+ name: 'testing',
+ version: '0.0.0',
+ type: 'module',
+ exports: {
+ './package.json': './package.json',
+ // @ts-expect-error - issue with Yup inference
+ './admin': {
+ types: './admin/index.d.ts',
+ import: './admin/index.mjs',
+ require: './admin/index.js',
+ default: './admin/index.js',
+ source: './src/admin/index.js',
+ },
+ },
+ };
+
+ expect(() => parseExports({ pkg, extMap })).toThrowErrorMatchingInlineSnapshot(`
+ "
+ - package.json with 'type: "module"' - 'exports["./admin"].require' must end with ".cjs"
+ - package.json with 'type: "module"' - 'exports["./admin"].import' must end with ".js""
+ `);
+ });
+ });
+});
diff --git a/src/node/core/__tests__/fixtures/test.pkg.json b/src/node/core/__tests__/fixtures/test.pkg.json
new file mode 100644
index 0000000..85a32fd
--- /dev/null
+++ b/src/node/core/__tests__/fixtures/test.pkg.json
@@ -0,0 +1,4 @@
+{
+ "name": "testing",
+ "version": "0.0.0"
+}
diff --git a/src/node/core/__tests__/pkg.test.ts b/src/node/core/__tests__/pkg.test.ts
new file mode 100644
index 0000000..c304661
--- /dev/null
+++ b/src/node/core/__tests__/pkg.test.ts
@@ -0,0 +1,169 @@
+import fs from 'fs/promises';
+import path from 'path';
+
+import { loadPkg, validatePkg } from '../pkg';
+
+const loggerMock = {
+ debug: jest.fn(),
+ info: jest.fn(),
+ warn: jest.fn(),
+ error: jest.fn(),
+};
+
+describe('pkg', () => {
+ const tmpfolder = path.resolve(__dirname, '.tmp');
+
+ afterEach(() => {
+ jest.resetAllMocks();
+ });
+
+ describe('loadPkg', () => {
+ beforeEach(async () => {
+ await fs.mkdir(tmpfolder);
+ await fs.copyFile(
+ path.resolve(__dirname, 'fixtures', 'test.pkg.json'),
+ path.resolve(tmpfolder, 'package.json')
+ );
+ });
+
+ afterEach(async () => {
+ await fs.rm(tmpfolder, { recursive: true });
+ });
+
+ it('should succesfully load the package.json closest to the cwd provided & call the debug logger', async () => {
+ // @ts-expect-error - Logger is mocked
+ const pkg = await loadPkg({ cwd: tmpfolder, logger: loggerMock });
+
+ expect(pkg).toMatchInlineSnapshot(`
+ {
+ "name": "testing",
+ "version": "0.0.0",
+ }
+ `);
+
+ expect(loggerMock.debug).toHaveBeenCalled();
+ });
+
+ it('should throw an error if it cannot find a package.json', async () => {
+ await expect(
+ // @ts-expect-error - Logger is mocked
+ loadPkg({ cwd: '/', logger: loggerMock })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '"Could not find a package.json in the current directory"'
+ );
+ });
+ });
+
+ describe('validatePkg', () => {
+ it("should return the validated package.json if it's valid", async () => {
+ const pkg = {
+ name: 'testing',
+ version: '0.0.0',
+ };
+
+ const validatedPkg = await validatePkg({ pkg });
+
+ expect(validatedPkg).toMatchInlineSnapshot(`
+ {
+ "name": "testing",
+ "version": "0.0.0",
+ }
+ `);
+ });
+
+ it('should fail if a required field is missing and call the error logger with the correct message', async () => {
+ expect(() =>
+ validatePkg({
+ pkg: {
+ version: '0.0.0',
+ },
+ })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ "\"'name' in 'package.json' is required as type '[35mstring[39m'\""
+ );
+
+ expect(() =>
+ validatePkg({
+ pkg: {
+ name: 'testing',
+ },
+ })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ "\"'version' in 'package.json' is required as type '[35mstring[39m'\""
+ );
+ });
+
+ it('should fail if a required field does not match the correct type and call the error logger with the correct message', async () => {
+ expect(() =>
+ validatePkg({
+ pkg: {
+ name: 'testing',
+ version: 0,
+ },
+ })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ "\"'version' in 'package.json' must be of type '[35mstring[39m' (recieved '[35mnumber[39m')\""
+ );
+ });
+
+ it("should fail if the regex for a field doesn't match and call the error logger with the correct message", async () => {
+ expect(() =>
+ validatePkg({
+ pkg: {
+ name: 'testing',
+ version: '0.0.0',
+ exports: {
+ apple: './apple.xyzx',
+ },
+ },
+ })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ "\"'exports.apple' in 'package.json' must be of type '[35m/^\\.\\/.*\\.json$/[39m' (recieved the value '[35m./apple.xyzx[39m')\""
+ );
+
+ expect(() =>
+ validatePkg({
+ pkg: {
+ name: 'testing',
+ version: '0.0.0',
+ type: 'something',
+ },
+ })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ '"type must be one of the following values: commonjs, module"'
+ );
+ });
+
+ it('should fail if the exports object does not match expectations', async () => {
+ expect(() =>
+ validatePkg({
+ pkg: {
+ name: 'testing',
+ version: '0.0.0',
+ exports: 'hello',
+ },
+ })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ "\"'exports' in 'package.json' must be of type '[35mobject[39m' (recieved '[35mstring[39m')\""
+ );
+
+ expect(() =>
+ validatePkg({
+ pkg: {
+ name: 'testing',
+ version: '0.0.0',
+ exports: {
+ './package.json': './package.json',
+ './admin': {
+ import: './admin/index.js',
+ something: 'xyz',
+ },
+ },
+ },
+ })
+ ).rejects.toThrowErrorMatchingInlineSnapshot(
+ "\"'exports[\"./admin\"]' in 'package.json' contains the unknown key [35msomething[39m, for compatability only the following keys are allowed: [35m['types', 'source', 'import', 'require', 'default'][39m\""
+ );
+ });
+ });
+});
diff --git a/src/node/core/config.ts b/src/node/core/config.ts
new file mode 100644
index 0000000..964c6ec
--- /dev/null
+++ b/src/node/core/config.ts
@@ -0,0 +1,147 @@
+import { register } from 'esbuild-register/dist/node';
+import * as fs from 'fs';
+import os from 'os';
+import * as path from 'path';
+import pkgUp from 'pkg-up';
+
+import type { Export } from './exports';
+import type { Logger } from './logger';
+import type { Runtime } from '../createBuildContext';
+import type { PluginOption } from 'vite';
+
+interface LoadConfigOptions {
+ cwd: string;
+ logger: Logger;
+}
+
+const CONFIG_FILE_NAMES = [
+ 'packup.config.ts',
+ 'packup.config.js',
+ 'packup.config.cjs',
+ 'packup.config.mjs',
+];
+
+const loadConfig = async ({ cwd, logger }: LoadConfigOptions): Promise => {
+ const pkgPath = await pkgUp({ cwd });
+
+ if (!pkgPath) {
+ logger.debug(
+ 'Could not find a package.json in the current directory, therefore no config was loaded'
+ );
+
+ return undefined;
+ }
+
+ const root = path.dirname(pkgPath);
+
+ for (const fileName of CONFIG_FILE_NAMES) {
+ const configPath = path.resolve(root, fileName);
+
+ const exists = fs.existsSync(configPath);
+
+ if (exists) {
+ const esbuildOptions = { extensions: ['.js', '.mjs', '.ts'] };
+
+ const { unregister } = register(esbuildOptions);
+
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
+ const mod = require(configPath);
+
+ unregister();
+
+ /**
+ * handles esm or cjs exporting.
+ */
+ const config = mod?.default || mod || undefined;
+
+ if (config) {
+ logger.debug('Loaded configuration:', os.EOL, config);
+ }
+
+ return config;
+ }
+ }
+
+ return undefined;
+};
+
+interface ConfigBundle {
+ source: string;
+ import?: string;
+ require?: string;
+ runtime?: Runtime;
+ tsconfig?: string;
+ types?: string;
+}
+
+interface ConfigOptions {
+ bundles?: ConfigBundle[];
+ /**
+ * @description the directory to output the bundle to.
+ */
+ dist?: string;
+ /**
+ * @description Overwrite the default exports.
+ */
+ exports?: ConfigProperty>;
+ /**
+ * @description a list of external dependencies to exclude from the bundle.
+ * We already collect the dependencies & peerDeps from the package.json.
+ */
+ externals?: string[];
+ minify?: boolean;
+ plugins?: PluginOption[] | (({ runtime }: { runtime: Runtime }) => PluginOption[]);
+ /**
+ * @alpha
+ *
+ * @description Instead of creating as few chunks as possible, this mode
+ * will create separate chunks for all modules using the original module
+ * names as file names
+ */
+ preserveModules?: boolean;
+ sourcemap?: boolean;
+ runtime?: Runtime;
+ /**
+ * @description path to the tsconfig file to use for the bundle.
+ *
+ * @default tsconfig.build.json
+ */
+ tsconfig?: string;
+}
+
+/**
+ * @public
+ *
+ * @description a helper function to define your config in a typesafe manner.
+ */
+const defineConfig = (configOptions: ConfigOptions): ConfigOptions => configOptions;
+
+type Config = ConfigOptions;
+
+type ConfigPropertyResolver = (currentValue: T) => T;
+
+type ConfigProperty = T | ConfigPropertyResolver;
+
+/** @internal */
+export function resolveConfigProperty(prop: ConfigProperty | undefined, initialValue: T): T {
+ if (!prop) {
+ return initialValue;
+ }
+
+ if (typeof prop === 'function') {
+ return (prop as ConfigPropertyResolver)(initialValue);
+ }
+
+ return prop;
+}
+
+export { loadConfig, defineConfig, CONFIG_FILE_NAMES };
+export type {
+ Config,
+ ConfigOptions,
+ ConfigBundle,
+ ConfigPropertyResolver,
+ ConfigProperty,
+ PluginOption,
+ Runtime,
+};
diff --git a/src/node/core/errors.ts b/src/node/core/errors.ts
new file mode 100644
index 0000000..eebf072
--- /dev/null
+++ b/src/node/core/errors.ts
@@ -0,0 +1,3 @@
+const isError = (err: unknown): err is Error => err instanceof Error;
+
+export { isError };
diff --git a/src/node/core/exports.ts b/src/node/core/exports.ts
new file mode 100644
index 0000000..93a34fd
--- /dev/null
+++ b/src/node/core/exports.ts
@@ -0,0 +1,339 @@
+import os from 'os';
+
+import type { Logger } from './logger';
+import type { PackageJson } from './pkg';
+
+/**
+ * @description validate the `exports` property of the package.json against a set of rules.
+ * If the validation fails, the process will throw with an appropriate error message. If
+ * there is no `exports` property we check the standard export-like properties on the root
+ * of the package.json.
+ */
+const validateExportsOrdering = async ({
+ pkg,
+ logger,
+}: {
+ pkg: PackageJson;
+ logger: Logger;
+}): Promise => {
+ if (pkg.exports) {
+ const exports = Object.entries(pkg.exports);
+
+ for (const [expPath, exp] of exports) {
+ if (typeof exp === 'string') {
+ // eslint-disable-next-line no-continue
+ continue;
+ }
+
+ const keys = Object.keys(exp);
+
+ if (!assertFirst('types', keys)) {
+ throw new Error(`exports["${expPath}"]: the 'types' property should be the first property`);
+ }
+
+ if (exp.node) {
+ const nodeKeys = Object.keys(exp.node);
+
+ if (!assertOrder('module', 'import', nodeKeys)) {
+ throw new Error(
+ `exports["${expPath}"]: the 'node.module' property should come before the 'node.import' property`
+ );
+ }
+
+ if (!assertOrder('import', 'require', nodeKeys)) {
+ logger.warn(
+ `exports["${expPath}"]: the 'node.import' property should come before the 'node.require' property`
+ );
+ }
+
+ if (!assertOrder('module', 'require', nodeKeys)) {
+ logger.warn(
+ `exports["${expPath}"]: the 'node.module' property should come before 'node.require' property`
+ );
+ }
+
+ if (exp.import && exp.node.import && !assertOrder('node', 'import', keys)) {
+ throw new Error(
+ `exports["${expPath}"]: the 'node' property should come before the 'import' property`
+ );
+ }
+
+ if (exp.module && exp.node.module && !assertOrder('node', 'module', keys)) {
+ throw new Error(
+ `exports["${expPath}"]: the 'node' property should come before the 'module' property`
+ );
+ }
+
+ /**
+ * If there's a `node.import` property but not a `node.require` we can assume `node.import`
+ * is wrapping `import` and `node.module` should be added for bundlers.
+ */
+ if (
+ exp.node.import &&
+ (!exp.node.require || exp.require === exp.node.require) &&
+ !exp.node.module
+ ) {
+ logger.warn(
+ `exports["${expPath}"]: the 'node.module' property should be added so bundlers don't unintentionally try to bundle 'node.import'. Its value should be '"module": "${exp.import}"'`
+ );
+ }
+
+ if (
+ exp.node.import &&
+ !exp.node.require &&
+ exp.node.module &&
+ exp.import &&
+ exp.node.module !== exp.import
+ ) {
+ throw new Error(
+ `exports["${expPath}"]: the 'node.module' property should match 'import'`
+ );
+ }
+
+ if (exp.require && exp.node.require && exp.require === exp.node.require) {
+ throw new Error(
+ `exports["${expPath}"]: the 'node.require' property isn't necessary as it's identical to 'require'`
+ );
+ } else if (exp.require && exp.node.require && !assertOrder('node', 'require', keys)) {
+ throw new Error(
+ `exports["${expPath}"]: the 'node' property should come before the 'require' property`
+ );
+ }
+ } else {
+ if (!assertOrder('import', 'require', keys)) {
+ logger.warn(
+ `exports["${expPath}"]: the 'import' property should come before the 'require' property`
+ );
+ }
+
+ if (!assertOrder('module', 'import', keys)) {
+ logger.warn(
+ `exports["${expPath}"]: the 'module' property should come before 'import' property`
+ );
+ }
+ }
+ if (!assertLast('default', keys)) {
+ throw new Error(
+ `exports["${expPath}"]: the 'default' property should be the last property`
+ );
+ }
+ }
+ } else if (!['main', 'module'].some((key) => Object.prototype.hasOwnProperty.call(pkg, key))) {
+ throw new Error("'package.json' must contain a 'main' and 'module' property");
+ }
+
+ return pkg;
+};
+
+/** @internal */
+function assertFirst(key: string, arr: string[]) {
+ const aIdx = arr.indexOf(key);
+
+ // if not found, then we don't care
+ if (aIdx === -1) {
+ return true;
+ }
+
+ return aIdx === 0;
+}
+
+/** @internal */
+function assertLast(key: string, arr: string[]) {
+ const aIdx = arr.indexOf(key);
+
+ // if not found, then we don't care
+ if (aIdx === -1) {
+ return true;
+ }
+
+ return aIdx === arr.length - 1;
+}
+
+/** @internal */
+function assertOrder(keyA: string, keyB: string, arr: string[]) {
+ const aIdx = arr.indexOf(keyA);
+ const bIdx = arr.indexOf(keyB);
+
+ // if either is not found, then we don't care
+ if (aIdx === -1 || bIdx === -1) {
+ return true;
+ }
+
+ return aIdx < bIdx;
+}
+
+type Extensions = 'cjs' | 'es';
+
+interface ExtMap {
+ commonjs: Record;
+ module: Record;
+}
+
+/**
+ * @internal
+ */
+const DEFAULT_PKG_EXT_MAP = {
+ // pkg.type: "commonjs"
+ commonjs: {
+ cjs: '.js',
+ es: '.mjs',
+ },
+
+ // pkg.type: "module"
+ module: {
+ cjs: '.cjs',
+ es: '.js',
+ },
+} satisfies ExtMap;
+
+/**
+ * We potentially might need to support legacy exports or as package
+ * development continues we have space to tweak this.
+ */
+const getExportExtensionMap = (): ExtMap => {
+ return DEFAULT_PKG_EXT_MAP;
+};
+
+/**
+ * @internal
+ *
+ * @description validate the `require` and `import` properties of a given exports maps from the package.json
+ * returning if any errors are found.
+ */
+const validateExports = (
+ _exports: Array,
+ options: { extMap: ExtMap; pkg: PackageJson }
+) => {
+ const { extMap, pkg } = options;
+ const ext = extMap[pkg.type || 'commonjs'];
+
+ const errors = [];
+
+ for (const exp of _exports) {
+ if (exp.require && !exp.require.endsWith(ext.cjs)) {
+ errors.push(
+ `package.json with 'type: "${pkg.type}"' - 'exports["${exp._path}"].require' must end with "${ext.cjs}"`
+ );
+ }
+
+ if (exp.import && !exp.import.endsWith(ext.es)) {
+ errors.push(
+ `package.json with 'type: "${pkg.type}"' - 'exports["${exp._path}"].import' must end with "${ext.es}"`
+ );
+ }
+ }
+
+ return errors;
+};
+
+interface Export {
+ types?: string;
+ source: string;
+ browser?: {
+ source: string;
+ import?: string;
+ require?: string;
+ };
+ node?: {
+ source?: string;
+ module?: string;
+ import?: string;
+ require?: string;
+ };
+ module?: string;
+ import?: string;
+ require?: string;
+ default: string;
+}
+
+/**
+ * @description parse the exports map from the package.json into a standardised
+ * format that we can use to generate build tasks from.
+ */
+const parseExports = ({ extMap, pkg }: { extMap: ExtMap; pkg: PackageJson }) => {
+ const rootExport = {
+ _path: '.',
+ types: pkg.types,
+ source: pkg.source || '',
+ require: pkg.main,
+ import: pkg.module,
+ default: pkg.module || pkg.main || '',
+ } satisfies Export & { _path: string };
+
+ const extraExports: Export[] = [];
+
+ const errors: string[] = [];
+
+ if (pkg.exports) {
+ if (!pkg.exports['./package.json']) {
+ errors.push('package.json: `exports["./package.json"] must be declared.');
+ }
+
+ Object.entries(pkg.exports).forEach(([path, entry]) => {
+ if (path.endsWith('.json')) {
+ if (path === './package.json' && entry !== './package.json') {
+ errors.push("package.json: 'exports[\"./package.json\"]' must be './package.json'.");
+ }
+ } else if (Boolean(entry) && typeof entry === 'object' && !Array.isArray(entry)) {
+ if (path === '.') {
+ if (entry.require && rootExport.require && entry.require !== rootExport.require) {
+ errors.push(
+ "package.json: mismatch between 'main' and 'exports.require'. These must be equal."
+ );
+ }
+
+ if (entry.import && rootExport.import && entry.import !== rootExport.import) {
+ errors.push(
+ "package.json: mismatch between 'module' and 'exports.import' These must be equal."
+ );
+ }
+
+ if (entry.types && rootExport.types && entry.types !== rootExport.types) {
+ errors.push(
+ "package.json: mismatch between 'types' and 'exports.types'. These must be equal."
+ );
+ }
+
+ if (entry.source && rootExport.source && entry.source !== rootExport.source) {
+ errors.push(
+ "package.json: mismatch between 'source' and 'exports.source'. These must be equal."
+ );
+ }
+
+ Object.assign(rootExport, entry);
+ } else {
+ const extraExport = {
+ _exported: true,
+ _path: path,
+ ...entry,
+ };
+
+ extraExports.push(extraExport);
+ }
+ } else {
+ errors.push('package.json: exports must be an object');
+ }
+ });
+ }
+
+ // eslint-disable-next-line @typescript-eslint/naming-convention
+ const _exports = [
+ /**
+ * In the case of strapi plugins, we don't have a root export because we
+ * ship a server side and client side package. So this can be completely omitted.
+ */
+ Object.values(rootExport).some((exp) => exp !== rootExport._path && Boolean(exp)) && rootExport,
+ ...extraExports,
+ ].filter((exp) => Boolean(exp)) as Array;
+
+ errors.push(...validateExports(_exports, { extMap, pkg }));
+
+ if (errors.length) {
+ throw new Error(`${os.EOL}- ${errors.join(`${os.EOL}- `)}`);
+ }
+
+ return _exports;
+};
+
+export { validateExportsOrdering, getExportExtensionMap, parseExports };
+export type { ExtMap, Export, Extensions };
diff --git a/src/node/core/files.ts b/src/node/core/files.ts
new file mode 100644
index 0000000..809aec1
--- /dev/null
+++ b/src/node/core/files.ts
@@ -0,0 +1,60 @@
+import { readdir, lstat, access, mkdir } from 'fs/promises';
+
+/**
+ * @internal
+ */
+const isEmptyDirectory = async (dir: string) => {
+ const files = await readdir(dir);
+
+ return files.length === 0;
+};
+
+/**
+ * @internal
+ */
+const isDirectory = async (dir: string) => {
+ const stats = await lstat(dir);
+
+ return stats.isDirectory();
+};
+
+/**
+ * @internal
+ */
+const pathExists = async (path: string) => {
+ try {
+ await access(path);
+ return true;
+ } catch (error) {
+ return false;
+ }
+};
+
+/**
+ * @internal
+ *
+ * @description Ensures that the path is viable for a package to be created at
+ * by checking if it exists, if not creating it and if it does exist ensuring it's
+ * an empty directory. It will fail if any of these conditions are not met.
+ */
+const ensurePackagePathIsViable = async (path: string) => {
+ const exists = await pathExists(path);
+
+ if (!exists) {
+ await mkdir(path, { recursive: true });
+ }
+
+ const isEmpty = await isEmptyDirectory(path);
+
+ if (!isEmpty) {
+ throw new Error(`${path} is not empty`);
+ }
+
+ const isDir = await isDirectory(path);
+
+ if (!isDir) {
+ throw new Error(`${path} is not a directory`);
+ }
+};
+
+export { ensurePackagePathIsViable, pathExists };
diff --git a/src/node/core/git.ts b/src/node/core/git.ts
new file mode 100644
index 0000000..d63d3d6
--- /dev/null
+++ b/src/node/core/git.ts
@@ -0,0 +1,61 @@
+/**
+ * Extracted & reduced from https://github.com/jonschlinkert/parse-git-config/blob/master/index.js
+ */
+import fs from 'fs/promises';
+import ini from 'ini';
+import os from 'os';
+import path from 'path';
+
+const resolveConfigPath = async ({ cwd }: { cwd: string }) => {
+ const configPath = path.join(os.homedir(), '.gitconfig');
+
+ try {
+ await fs.access(configPath);
+ return path.resolve(cwd, configPath);
+ } catch (err) {
+ return null;
+ }
+};
+
+/**
+ * This is the type for a parsed git config file.
+ *
+ * There's another object attached but for ease of
+ * readability we're only interested in user information.
+ */
+interface GitConfig {
+ user: {
+ name?: string;
+ email?: string;
+ };
+}
+
+const parseIni = (str: string): GitConfig => {
+ const normalisedString = str.replace(/\[(\S+) "(.*)"\]/g, (m, $1, $2) => {
+ return $1 && $2 ? `[${$1} "${$2.split('.').join('\\.')}"]` : m;
+ });
+
+ return ini.parse(normalisedString) as GitConfig;
+};
+
+/**
+ * @internal
+ *
+ * @description Parses the global git config file.
+ */
+const parseGlobalGitConfig = async (): Promise => {
+ const cwd = process.cwd();
+
+ const filepath = await resolveConfigPath({ cwd });
+
+ if (!filepath) {
+ return null;
+ }
+
+ const file = await fs.stat(filepath).then(() => fs.readFile(filepath, 'utf8'));
+
+ return parseIni(file);
+};
+
+export { parseGlobalGitConfig };
+export type { GitConfig };
diff --git a/src/node/core/logger.ts b/src/node/core/logger.ts
new file mode 100644
index 0000000..08d6fab
--- /dev/null
+++ b/src/node/core/logger.ts
@@ -0,0 +1,85 @@
+import chalk from 'chalk';
+
+interface LoggerOptions {
+ silent?: boolean;
+ debug?: boolean;
+}
+
+export interface Logger {
+ warnings: number;
+ errors: number;
+ debug: (...args: any[]) => void;
+ info: (...args: any[]) => void;
+ warn: (...args: any[]) => void;
+ error: (...args: any[]) => void;
+ log: (...args: any[]) => void;
+ success: (...args: any[]) => void;
+}
+
+export const createLogger = (options: LoggerOptions = {}): Logger => {
+ const { silent = false, debug = false } = options;
+
+ const state = { errors: 0, warning: 0 };
+
+ return {
+ get warnings() {
+ return state.warning;
+ },
+
+ get errors() {
+ return state.errors;
+ },
+
+ debug(...args) {
+ if (silent || !debug) {
+ return;
+ }
+
+ console.debug(chalk.cyan('[DEBUG] '), ...args);
+ },
+
+ info(...args) {
+ if (silent) {
+ return;
+ }
+
+ console.info(chalk.blue('[INFO] '), ...args);
+ },
+
+ log(...args) {
+ if (silent) {
+ return;
+ }
+
+ console.log(...args);
+ },
+
+ warn(...args) {
+ state.warning += 1;
+
+ if (silent) {
+ return;
+ }
+
+ console.warn(chalk.yellow('[WARN] '), ...args);
+ },
+
+ error(...args) {
+ state.errors += 1;
+
+ if (silent) {
+ return;
+ }
+
+ console.error(chalk.red('[ERROR] '), ...args);
+ },
+
+ success(...args) {
+ if (silent) {
+ return;
+ }
+
+ console.info(chalk.green('[SUCCESS] '), ...args);
+ },
+ };
+};
diff --git a/src/node/core/pkg.ts b/src/node/core/pkg.ts
new file mode 100644
index 0000000..de24490
--- /dev/null
+++ b/src/node/core/pkg.ts
@@ -0,0 +1,226 @@
+/**
+ * Utility functions for loading and validating package.json
+ * this includes the specific validation of specific parts of
+ * the package.json.
+ */
+import chalk from 'chalk';
+import fs from 'fs/promises';
+import os from 'os';
+import pkgUp from 'pkg-up';
+import * as yup from 'yup';
+
+import type { Export } from './exports';
+import type { Logger } from './logger';
+
+const record = (value: unknown) =>
+ yup
+ .object(
+ typeof value === 'object' && value
+ ? Object.entries(value).reduce>>((acc, [key]) => {
+ acc[key] = yup.string().required();
+
+ return acc;
+ }, {})
+ : {}
+ )
+ .optional();
+
+/**
+ * The schema for the package.json that we expect,
+ * currently pretty loose.
+ */
+const packageJsonSchema = yup.object({
+ name: yup.string().required(),
+ version: yup.string().required(),
+ description: yup.string().optional(),
+ author: yup.lazy((value) => {
+ if (typeof value === 'object') {
+ return yup
+ .object({
+ name: yup.string().required(),
+ email: yup.string().optional(),
+ url: yup.string().optional(),
+ })
+ .optional();
+ }
+
+ return yup.string().optional();
+ }),
+ keywords: yup.array(yup.string()).optional(),
+ type: yup.mixed().oneOf(['commonjs', 'module']).optional(),
+ license: yup.string().optional(),
+ repository: yup
+ .object({
+ type: yup.string().required(),
+ url: yup.string().required(),
+ })
+ .optional(),
+ bugs: yup
+ .object({
+ url: yup.string().required(),
+ })
+ .optional(),
+ homepage: yup.string().optional(),
+ // TODO: be nice just to make this either a string or a record of strings.
+ bin: yup.lazy((value) => {
+ if (typeof value === 'object') {
+ return record(value);
+ }
+
+ return yup.string().optional();
+ }),
+ // TODO: be nice just to make this either a string or a record of strings.
+ browser: yup.lazy((value) => {
+ if (typeof value === 'object') {
+ return record(value);
+ }
+
+ return yup.string().optional();
+ }),
+ main: yup.string().optional(),
+ module: yup.string().optional(),
+ source: yup.string().optional(),
+ types: yup.string().optional(),
+ exports: yup.lazy((value) =>
+ yup
+ .object(
+ typeof value === 'object'
+ ? Object.entries(value).reduce((acc, [key, v]) => {
+ if (typeof v === 'object') {
+ // @ts-expect-error yup is not typed correctly
+ acc[key] = yup
+ .object({
+ types: yup.string().optional(),
+ source: yup.string().required(),
+ browser: yup
+ .object({
+ source: yup.string().required(),
+ import: yup.string().optional(),
+ require: yup.string().optional(),
+ })
+ .optional(),
+ node: yup
+ .object({
+ source: yup.string().optional(),
+ module: yup.string().optional(),
+ import: yup.string().optional(),
+ require: yup.string().optional(),
+ })
+ .optional(),
+ module: yup.string().optional(),
+ import: yup.string().optional(),
+ require: yup.string().optional(),
+ default: yup.string().required(),
+ })
+ .noUnknown(true);
+ } else {
+ acc[key] = yup
+ .string()
+ .matches(/^\.\/.*\.json$/)
+ .required();
+ }
+
+ return acc;
+ }, {} as Record | yup.SchemaOf>)
+ : undefined
+ )
+ .optional()
+ ),
+ files: yup.array(yup.string()).optional(),
+ scripts: yup.lazy(record),
+ dependencies: yup.lazy(record),
+ devDependencies: yup.lazy(record),
+ peerDependencies: yup.lazy(record),
+ engines: yup.lazy(record),
+ browserslist: yup.array(yup.string().required()).optional(),
+});
+
+/**
+ * @description being a task to load the package.json starting from the current working directory
+ * using a shallow find for the package.json and `fs` to read the file. If no package.json is found,
+ * the process will throw with an appropriate error message.
+ */
+const loadPkg = async ({ cwd, logger }: { cwd: string; logger: Logger }): Promise => {
+ const pkgPath = await pkgUp({ cwd });
+
+ if (!pkgPath) {
+ throw new Error('Could not find a package.json in the current directory');
+ }
+
+ const buffer = await fs.readFile(pkgPath);
+
+ const pkg = JSON.parse(buffer.toString());
+
+ logger.debug('Loaded package.json:', os.EOL, pkg);
+
+ return pkg;
+};
+
+interface PackageJson extends Omit, 'type'> {
+ type?: 'commonjs' | 'module';
+}
+
+/**
+ * @description validate the package.json against a standardised schema using `yup`.
+ * If the validation fails, the process will throw with an appropriate error message.
+ */
+const validatePkg = async ({ pkg }: { pkg: object }): Promise => {
+ try {
+ const validatedPkg = await packageJsonSchema.validate(pkg, {
+ strict: true,
+ });
+
+ return validatedPkg;
+ } catch (err) {
+ if (err instanceof yup.ValidationError) {
+ switch (err.type) {
+ case 'required':
+ if (err.path) {
+ throw new Error(
+ `'${err.path}' in 'package.json' is required as type '${chalk.magenta(
+ yup.reach(packageJsonSchema, err.path).type
+ )}'`
+ );
+ }
+ break;
+ case 'matches':
+ if (err.params && err.path && 'value' in err.params && 'regex' in err.params) {
+ throw new Error(
+ `'${err.path}' in 'package.json' must be of type '${chalk.magenta(
+ err.params.regex
+ )}' (recieved the value '${chalk.magenta(err.params.value)}')`
+ );
+ }
+ break;
+ /**
+ * This will only be thrown if there are keys in the export map
+ * that we don't expect so we can therefore make some assumptions
+ */
+ case 'noUnknown':
+ if (err.path && err.params && 'unknown' in err.params) {
+ throw new Error(
+ `'${err.path}' in 'package.json' contains the unknown key ${chalk.magenta(
+ err.params.unknown
+ )}, for compatability only the following keys are allowed: ${chalk.magenta(
+ "['types', 'source', 'import', 'require', 'default']"
+ )}`
+ );
+ }
+ break;
+ default:
+ if (err.path && err.params && 'type' in err.params && 'value' in err.params) {
+ throw new Error(
+ `'${err.path}' in 'package.json' must be of type '${chalk.magenta(
+ err.params.type
+ )}' (recieved '${chalk.magenta(typeof err.params.value)}')`
+ );
+ }
+ }
+ }
+
+ throw err;
+ }
+};
+
+export { loadPkg, validatePkg };
+export type { PackageJson };
diff --git a/src/node/core/tsconfig.ts b/src/node/core/tsconfig.ts
new file mode 100644
index 0000000..459e12e
--- /dev/null
+++ b/src/node/core/tsconfig.ts
@@ -0,0 +1,66 @@
+import os from 'os';
+import nodePath from 'path';
+import ts from 'typescript';
+
+import type { Logger } from './logger';
+
+/**
+ * @description Load a tsconfig.json file and return the parsed config
+ * after injecting some required defaults for producing types.
+ *
+ * @internal
+ */
+const loadTsConfig = ({
+ cwd,
+ path,
+ logger,
+}: {
+ cwd: string;
+ path: string;
+ logger: Logger;
+}):
+ | {
+ config: ts.ParsedCommandLine;
+ path: string;
+ }
+ | undefined => {
+ const providedPath = path.split(nodePath.sep);
+ const [configFileName] = providedPath.slice(-1);
+ const pathToConfig = nodePath.join(cwd, providedPath.slice(0, -1).join(nodePath.sep));
+
+ const configPath = ts.findConfigFile(pathToConfig, ts.sys.fileExists, configFileName);
+
+ if (!configPath) {
+ return undefined;
+ }
+
+ const configFile = ts.readConfigFile(configPath, ts.sys.readFile);
+
+ const parsedConfig = ts.parseJsonConfigFileContent(configFile.config, ts.sys, pathToConfig);
+
+ logger.debug('Loaded user TS config:', os.EOL, parsedConfig);
+
+ const { outDir } = parsedConfig.raw.compilerOptions;
+
+ if (!outDir) {
+ throw new Error("tsconfig.json is missing 'compilerOptions.outDir'");
+ }
+
+ parsedConfig.options = {
+ ...parsedConfig.options,
+ declaration: true,
+ declarationDir: outDir,
+ emitDeclarationOnly: true,
+ noEmit: false,
+ outDir,
+ };
+
+ logger.debug('Using TS config:', os.EOL, parsedConfig);
+
+ return {
+ config: parsedConfig,
+ path: configPath,
+ };
+};
+
+export { loadTsConfig };
diff --git a/src/node/createBuildContext.ts b/src/node/createBuildContext.ts
new file mode 100644
index 0000000..ebd6a88
--- /dev/null
+++ b/src/node/createBuildContext.ts
@@ -0,0 +1,189 @@
+import browserslistToEsbuild from 'browserslist-to-esbuild';
+import path from 'path';
+
+import { resolveConfigProperty } from './core/config';
+import { parseExports } from './core/exports';
+import { loadTsConfig } from './core/tsconfig';
+
+import type { Config } from './core/config';
+import type { ExtMap, Export } from './core/exports';
+import type { Logger } from './core/logger';
+import type { PackageJson } from './core/pkg';
+import type { ParsedCommandLine } from 'typescript';
+
+interface BuildContextArgs {
+ config: Config;
+ cwd: string;
+ extMap: ExtMap;
+ logger: Logger;
+ pkg: PackageJson;
+}
+
+interface Targets {
+ node: string[];
+ web: string[];
+ '*': string[];
+}
+
+type Runtime = '*' | 'node' | 'web';
+
+interface BuildContext {
+ config: Config;
+ cwd: string;
+ distPath: string;
+ exports: Record;
+ external: string[];
+ extMap: ExtMap;
+ logger: Logger;
+ pkg: PackageJson;
+ runtime?: Runtime;
+ targets: Targets;
+ ts?: {
+ config: ParsedCommandLine;
+ path: string;
+ };
+}
+
+const DEFAULT_BROWSERS_LIST_CONFIG = [
+ 'last 3 major versions',
+ 'Firefox ESR',
+ 'last 2 Opera versions',
+ 'not dead',
+ 'node 18.0.0',
+];
+
+/**
+ * @description Create a build context for the pipeline we're creating,
+ * this is shared among tasks so they all use the same settings for core pieces
+ * such as a target, distPath, externals etc.
+ */
+const createBuildContext = async ({
+ config,
+ cwd,
+ extMap,
+ logger,
+ pkg,
+}: BuildContextArgs): Promise => {
+ const tsConfig = loadTsConfig({
+ cwd,
+ path: resolveConfigProperty(config.tsconfig, 'tsconfig.build.json'),
+ logger,
+ });
+
+ const targets = {
+ '*': browserslistToEsbuild(pkg.browserslist ?? DEFAULT_BROWSERS_LIST_CONFIG),
+ node: browserslistToEsbuild(['node 18.0.0']),
+ web: ['esnext'],
+ };
+
+ const parsedExports = parseExports({ extMap, pkg }).reduce((acc, x) => {
+ const { _path: exportPath, ...exportEntry } = x;
+
+ return { ...acc, [exportPath]: exportEntry };
+ }, {} as Record);
+
+ const exports = resolveConfigProperty(config.exports, parsedExports);
+
+ const parsedExternals = [
+ ...(pkg.dependencies ? Object.keys(pkg.dependencies) : []),
+ ...(pkg.peerDependencies ? Object.keys(pkg.peerDependencies) : []),
+ ];
+
+ const external =
+ config && Array.isArray(config.externals)
+ ? [...parsedExternals, ...config.externals]
+ : parsedExternals;
+
+ const outputPaths = Object.values(exports)
+ .flatMap((exportEntry) => {
+ return [
+ exportEntry.import,
+ exportEntry.require,
+ exportEntry.browser?.import,
+ exportEntry.browser?.require,
+ exportEntry.node?.source && exportEntry.node.import,
+ exportEntry.node?.source && exportEntry.node.require,
+ ].filter(Boolean) as string[];
+ })
+ .map((p) => path.resolve(cwd, p));
+
+ const commonDistPath = findCommonDirPath(outputPaths);
+
+ if (commonDistPath === cwd) {
+ throw new Error(
+ 'all output files must share a common parent directory which is not the root package directory'
+ );
+ }
+
+ if (commonDistPath && !pathContains(cwd, commonDistPath)) {
+ throw new Error('all output files must be located within the package');
+ }
+
+ const configDistPath = config?.dist ? path.resolve(cwd, config.dist) : undefined;
+
+ const distPath = configDistPath || commonDistPath;
+
+ if (!distPath) {
+ throw new Error("could not detect 'dist' path");
+ }
+
+ return {
+ config,
+ cwd,
+ distPath,
+ exports,
+ external,
+ extMap,
+ logger,
+ pkg,
+ runtime: config?.runtime,
+ targets,
+ ts: tsConfig,
+ };
+};
+
+/**
+ * @internal
+ */
+const pathContains = (containerPath: string, itemPath: string): boolean => {
+ return !path.relative(containerPath, itemPath).startsWith('..');
+};
+
+/**
+ * @internal
+ */
+const findCommonDirPath = (filePaths: string[]): string | undefined => {
+ let commonPath: string | undefined;
+
+ for (const filePath of filePaths) {
+ let dirPath = path.dirname(filePath);
+
+ if (!commonPath) {
+ commonPath = dirPath;
+ // eslint-disable-next-line no-continue
+ continue;
+ }
+
+ while (dirPath !== commonPath) {
+ dirPath = path.dirname(dirPath);
+
+ if (dirPath === commonPath) {
+ break;
+ }
+
+ if (pathContains(dirPath, commonPath)) {
+ commonPath = dirPath;
+ break;
+ }
+
+ if (dirPath === '.') {
+ return undefined;
+ }
+ }
+ }
+
+ return commonPath;
+};
+
+export { createBuildContext };
+export type { BuildContext, Targets, Runtime };
diff --git a/src/node/createTasks.ts b/src/node/createTasks.ts
new file mode 100644
index 0000000..ecd582e
--- /dev/null
+++ b/src/node/createTasks.ts
@@ -0,0 +1,165 @@
+import path from 'path';
+
+import type { Extensions } from './core/exports';
+import type { BuildContext, Runtime } from './createBuildContext';
+import type { DtsBuildTask } from './tasks/dts/build';
+import type { DtsBaseTask } from './tasks/dts/types';
+import type { DtsWatchTask } from './tasks/dts/watch';
+import type { ViteBuildTask } from './tasks/vite/build';
+import type { ViteBaseTask, ViteTaskEntry } from './tasks/vite/types';
+import type { ViteWatchTask } from './tasks/vite/watch';
+
+type BuildTask = DtsBuildTask | ViteBuildTask;
+type WatchTask = ViteWatchTask | DtsWatchTask;
+
+type BaseTask = ViteBaseTask | DtsBaseTask;
+
+/**
+ * @description Create the build tasks for the pipeline, this
+ * comes from the exports map we've created in the build context.
+ * But handles each export line uniquely with space to add more
+ * as the standard develops.
+ */
+const createTasks =
+ (mode: TMode) =>
+ async (ctx: BuildContext): Promise => {
+ const tasks: Array = [];
+
+ const dtsTask: DtsBaseTask = {
+ type: `${mode}:dts`,
+ entries: [],
+ };
+
+ const viteTasks: Record = {};
+
+ const createViteTask = (
+ format: Extensions,
+ runtime: Runtime,
+ { output, ...restEntry }: ViteTaskEntry & Pick
+ ) => {
+ const buildId = `${format}:${output}`;
+
+ if (viteTasks[buildId]) {
+ viteTasks[buildId]?.entries.push(restEntry);
+
+ if (output !== viteTasks[buildId]?.output) {
+ ctx.logger.warn(
+ 'Multiple entries with different outputs for the same format are not supported. The first output will be used.'
+ );
+ }
+ } else {
+ viteTasks[buildId] = {
+ type: `${mode}:js`,
+ format,
+ output,
+ runtime,
+ entries: [restEntry],
+ };
+ }
+ };
+
+ const exps = Object.entries(ctx.exports).map(([exportPath, exportEntry]) => ({
+ ...exportEntry,
+ _path: exportPath,
+ }));
+
+ for (const exp of exps) {
+ if (exp.types) {
+ const importId = path.join(ctx.pkg.name, exp._path);
+
+ dtsTask.entries.push({
+ importId,
+ exportPath: exp._path,
+ sourcePath: exp.source,
+ targetPath: exp.types,
+ });
+ }
+
+ if (exp.require) {
+ /**
+ * register CJS task
+ */
+ createViteTask('cjs', ctx.runtime ?? '*', {
+ path: exp._path,
+ entry: exp.source,
+ output: exp.require,
+ });
+ }
+
+ if (exp.import) {
+ /**
+ * register ESM task
+ */
+ createViteTask('es', ctx.runtime ?? '*', {
+ path: exp._path,
+ entry: exp.source,
+ output: exp.import,
+ });
+ }
+
+ if (exp.browser?.require) {
+ createViteTask('cjs', 'web', {
+ path: exp._path,
+ entry: exp.browser?.source || exp.source,
+ output: exp.browser.require,
+ });
+ }
+
+ if (exp.browser?.import) {
+ createViteTask('cjs', 'web', {
+ path: exp._path,
+ entry: exp.browser?.source || exp.source,
+ output: exp.browser.import,
+ });
+ }
+ }
+
+ const bundles = ctx.config.bundles ?? [];
+
+ for (const bundle of bundles) {
+ const idx = bundles.indexOf(bundle);
+
+ if (bundle.require) {
+ createViteTask('cjs', (bundle.runtime || ctx.runtime) ?? '*', {
+ path: `bundle_cjs_${idx}`,
+ entry: bundle.source,
+ output: bundle.require,
+ });
+ }
+
+ if (bundle.import) {
+ createViteTask('es', (bundle.runtime || ctx.runtime) ?? '*', {
+ path: `bundle_esm_${idx}`,
+ entry: bundle.source,
+ output: bundle.import,
+ });
+ }
+
+ if (bundle.types) {
+ const importId = path.join(ctx.pkg.name, bundle.source);
+
+ dtsTask.entries.push({
+ importId,
+ exportPath: bundle.source,
+ sourcePath: bundle.source,
+ targetPath: bundle.types,
+ tsconfig: bundle.tsconfig,
+ });
+ }
+ }
+
+ if (dtsTask.entries.length) {
+ tasks.push(dtsTask);
+ }
+ if (Object.values(viteTasks).length) {
+ tasks.push(...Object.values(viteTasks));
+ }
+
+ return tasks as TMode extends 'build' ? BuildTask[] : WatchTask[];
+ };
+
+const createBuildTasks = createTasks('build');
+const createWatchTasks = createTasks('watch');
+
+export { createBuildTasks, createWatchTasks };
+export type { BuildTask, WatchTask, BaseTask };
diff --git a/src/node/init.ts b/src/node/init.ts
new file mode 100644
index 0000000..0ade294
--- /dev/null
+++ b/src/node/init.ts
@@ -0,0 +1,65 @@
+import { resolve } from 'path';
+
+import { isError } from './core/errors';
+import { ensurePackagePathIsViable } from './core/files';
+import { createLogger } from './core/logger';
+import { createPackageFromTemplate } from './templates/create';
+import { defaultTemplate } from './templates/internal/default';
+import { loadTemplate } from './templates/load';
+
+import type { TemplateOrTemplateResolver } from './templates/types';
+import type { CommonCLIOptions } from '../types';
+
+export interface InitOptions extends CommonCLIOptions {
+ cwd?: string;
+ path: string;
+ template?: TemplateOrTemplateResolver | string;
+}
+
+export const init = async (opts: InitOptions) => {
+ const { silent, debug, cwd = process.cwd(), path } = opts;
+ let { template = defaultTemplate } = opts;
+
+ const logger = createLogger({ silent, debug });
+
+ if (!path) {
+ logger.error('Path is a required option');
+ process.exit(1);
+ }
+
+ const packageRoot = resolve(cwd, path);
+
+ logger.debug('Package is: ', packageRoot);
+
+ if (typeof template === 'string') {
+ const templatePath = resolve(cwd, template);
+ const userTemplate = loadTemplate(templatePath, { logger });
+
+ if (userTemplate) {
+ template = userTemplate;
+ } else {
+ /**
+ * the loadTemplate function would have already warned the user
+ * we can't find their template, we just now ensure we don't
+ * pass the string.
+ */
+ template = defaultTemplate;
+ }
+ }
+
+ await ensurePackagePathIsViable(packageRoot).catch((err) => {
+ if (isError(err)) {
+ logger.error(err.message);
+ }
+
+ process.exit(1);
+ });
+
+ logger.debug('Package path is viable');
+
+ await createPackageFromTemplate(packageRoot, {
+ logger,
+ cwd,
+ template,
+ });
+};
diff --git a/src/node/tasks/dts/build.ts b/src/node/tasks/dts/build.ts
new file mode 100644
index 0000000..09a59af
--- /dev/null
+++ b/src/node/tasks/dts/build.ts
@@ -0,0 +1,105 @@
+import chalk from 'chalk';
+import os from 'os';
+import { Observable } from 'rxjs';
+import ts from 'typescript';
+
+import { isError } from '../../core/errors';
+import { loadTsConfig } from '../../core/tsconfig';
+
+import { printDiagnostic } from './diagnostic';
+
+import type { DtsBaseTask } from './types';
+import type { TaskHandler } from '../index';
+
+interface DtsBuildTask extends DtsBaseTask {
+ type: 'build:dts';
+}
+
+const dtsBuildTask: TaskHandler = {
+ print(ctx, task) {
+ const entries = [
+ ' entries:',
+ ...task.entries.map((entry) =>
+ [
+ ' β ',
+ chalk.green(`${entry.importId} `),
+ `${chalk.cyan(entry.sourcePath)} ${chalk.gray('->')} ${chalk.cyan(entry.targetPath)}`,
+ ].join('')
+ ),
+ ];
+
+ ctx.logger.log(['Building type files:', ...entries].join(os.EOL));
+ },
+ run$(ctx, task) {
+ return new Observable((subscriber) => {
+ Promise.all(
+ task.entries.map(async (entry) => {
+ /**
+ * Entry level tsconfig's take precedence
+ */
+ const tsconfig = entry.tsconfig
+ ? loadTsConfig({
+ cwd: ctx.cwd,
+ path: entry.tsconfig,
+ logger: ctx.logger,
+ })
+ : ctx.ts;
+
+ if (!tsconfig) {
+ ctx.logger.warn(
+ `You've added a types entry but no tsconfig.json was found for ${entry.targetPath}. Skipping...`
+ );
+
+ return;
+ }
+
+ const program = ts.createProgram(tsconfig.config.fileNames, tsconfig.config.options);
+
+ const emitResult = program.emit();
+
+ const allDiagnostics = ts.getPreEmitDiagnostics(program).concat(emitResult.diagnostics);
+
+ for (const diagnostic of allDiagnostics) {
+ printDiagnostic(diagnostic, { logger: ctx.logger, cwd: ctx.cwd });
+ }
+
+ const errors = allDiagnostics.filter(
+ (diag) => diag.category === ts.DiagnosticCategory.Error
+ );
+
+ if (errors.length) {
+ throw new Error('Failed to compile TypeScript definitions');
+ }
+ })
+ )
+ .then(() => {
+ subscriber.complete();
+ })
+ .catch((err) => {
+ subscriber.error(err);
+ });
+ });
+ },
+ async success(ctx, task) {
+ const msg = [
+ 'Built types, entries:',
+ task.entries
+ .map(
+ (entry) =>
+ ` ${chalk.blue(`${entry.importId}`)}: ${entry.sourcePath} -> ${entry.targetPath}`
+ )
+ .join(os.EOL),
+ ];
+
+ ctx.logger.success(msg.join(os.EOL));
+ },
+ async fail(ctx, task, err) {
+ if (isError(err)) {
+ ctx.logger.error(err.message);
+ }
+ },
+};
+
+export { dtsBuildTask };
+
+export type { DtsBuildTask };
diff --git a/src/node/tasks/dts/diagnostic.ts b/src/node/tasks/dts/diagnostic.ts
new file mode 100644
index 0000000..5ce66b8
--- /dev/null
+++ b/src/node/tasks/dts/diagnostic.ts
@@ -0,0 +1,43 @@
+import chalk from 'chalk';
+import path from 'path';
+import ts from 'typescript';
+
+import type { Logger } from '../../core/logger';
+
+const printDiagnostic = (
+ diagnostic: ts.Diagnostic,
+ { logger, cwd }: { logger: Logger; cwd: string }
+) => {
+ if (diagnostic.file && diagnostic.start) {
+ const { line, character } = ts.getLineAndCharacterOfPosition(diagnostic.file, diagnostic.start);
+ const message = ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine);
+
+ const file = path.relative(cwd, diagnostic.file.fileName);
+
+ const output = [
+ `${chalk.cyan(file)}:${chalk.cyan(line + 1)}:${chalk.cyan(character + 1)} - `,
+ `${chalk.gray(`TS${diagnostic.code}:`)} ${message}`,
+ ].join('');
+
+ switch (diagnostic.category) {
+ case ts.DiagnosticCategory.Error:
+ logger.error(output);
+ break;
+ case ts.DiagnosticCategory.Warning:
+ logger.warn(output);
+ break;
+ case ts.DiagnosticCategory.Message:
+ logger.info(output);
+ break;
+ case ts.DiagnosticCategory.Suggestion:
+ logger.info(output);
+ break;
+ default:
+ break;
+ }
+ } else {
+ logger.info(ts.flattenDiagnosticMessageText(diagnostic.messageText, ts.sys.newLine));
+ }
+};
+
+export { printDiagnostic };
diff --git a/src/node/tasks/dts/types.ts b/src/node/tasks/dts/types.ts
new file mode 100644
index 0000000..7eea2a9
--- /dev/null
+++ b/src/node/tasks/dts/types.ts
@@ -0,0 +1,19 @@
+interface DtsTaskEntry {
+ importId: string;
+ exportPath: string;
+ sourcePath: string;
+ targetPath: string;
+ /**
+ * Allow a particular task to have it's own tsconfig
+ * great for when you're creating a server & web bundle
+ * package.
+ */
+ tsconfig?: string;
+}
+
+interface DtsBaseTask {
+ type: string;
+ entries: DtsTaskEntry[];
+}
+
+export type { DtsBaseTask, DtsTaskEntry };
diff --git a/src/node/tasks/dts/watch.ts b/src/node/tasks/dts/watch.ts
new file mode 100644
index 0000000..8f1082c
--- /dev/null
+++ b/src/node/tasks/dts/watch.ts
@@ -0,0 +1,124 @@
+import chalk from 'chalk';
+import os from 'os';
+import { Observable } from 'rxjs';
+import ts from 'typescript';
+
+import { isError } from '../../core/errors';
+import { loadTsConfig } from '../../core/tsconfig';
+
+import { printDiagnostic } from './diagnostic';
+
+import type { DtsBaseTask } from './types';
+import type { TaskHandler } from '../index';
+
+interface DtsWatchTask extends DtsBaseTask {
+ type: 'watch:dts';
+}
+
+const dtsWatchTask: TaskHandler = {
+ print(ctx, task) {
+ const msg = [
+ 'Building Types, entries:',
+ task.entries
+ .map(
+ (entry) =>
+ ` ${chalk.blue(`${entry.importId}`)}: ${entry.sourcePath} -> ${entry.targetPath}`
+ )
+ .join(os.EOL),
+ ];
+
+ ctx.logger.success(msg.join(os.EOL));
+ },
+ run$(ctx, task) {
+ let programs: Array<
+ ts.WatchOfConfigFile | undefined
+ > = [];
+
+ return new Observable((subscriber) => {
+ Promise.all(
+ task.entries.map(async (entry) => {
+ /**
+ * Entry level tsconfig's take precedence
+ */
+ const tsconfig = entry.tsconfig
+ ? loadTsConfig({
+ cwd: ctx.cwd,
+ path: entry.tsconfig,
+ logger: ctx.logger,
+ })
+ : ctx.ts;
+
+ if (!tsconfig) {
+ ctx.logger.warn(
+ `You've added a types entry but no tsconfig.json was found for ${entry.targetPath}. Skipping...`
+ );
+
+ return;
+ }
+
+ const compilerHost = ts.createWatchCompilerHost(
+ tsconfig.path,
+ tsconfig.config.options,
+ ts.sys,
+ ts.createEmitAndSemanticDiagnosticsBuilderProgram,
+ (diagnostic) => {
+ subscriber.next(diagnostic);
+ },
+ (diagnostic) => {
+ subscriber.next(diagnostic);
+ }
+ );
+
+ return ts.createWatchProgram(compilerHost);
+ })
+ )
+ .then((progs) => {
+ programs = progs;
+ })
+ .catch((err) => {
+ subscriber.error(err);
+ });
+
+ return () => {
+ programs.forEach((prog) => {
+ prog?.close();
+ });
+ };
+ });
+ },
+ async success(ctx, task, diagnostic) {
+ const { logger, cwd } = ctx;
+
+ /**
+ * This code is "Found 0 errors. Watching for file changes."
+ * which is equivalent to "BUNDLE_END" code with rollup/vite.
+ *
+ * So we use this to say, hey we've built your types again!
+ */
+ if (diagnostic.code === 6194) {
+ this.print(ctx, task);
+ }
+
+ /**
+ * We don't want to print messages or suggestions.
+ * Only errors and warnings in watch mode.
+ */
+ if (
+ diagnostic.category === ts.DiagnosticCategory.Message ||
+ diagnostic.category === ts.DiagnosticCategory.Suggestion
+ ) {
+ return;
+ }
+
+ printDiagnostic(diagnostic, { logger, cwd });
+ },
+ async fail(ctx, task, err) {
+ if (isError(err)) {
+ ctx.logger.error(err);
+ }
+ },
+};
+
+export { dtsWatchTask };
+
+export type { DtsWatchTask };
diff --git a/src/node/tasks/index.ts b/src/node/tasks/index.ts
new file mode 100644
index 0000000..1aa2095
--- /dev/null
+++ b/src/node/tasks/index.ts
@@ -0,0 +1,36 @@
+import { dtsBuildTask } from './dts/build';
+import { dtsWatchTask } from './dts/watch';
+import { viteBuildTask } from './vite/build';
+import { viteWatchTask } from './vite/watch';
+
+import type { DtsBuildTask } from './dts/build';
+import type { DtsWatchTask } from './dts/watch';
+import type { ViteBuildTask } from './vite/build';
+import type { RollupWatcherEvent, ViteWatchTask } from './vite/watch';
+import type { BuildContext } from '../createBuildContext';
+import type { Observable } from 'rxjs';
+import type ts from 'typescript';
+
+interface TaskHandler {
+ print(ctx: BuildContext, task: Task): void;
+ run$(ctx: BuildContext, task: Task): Observable;
+ success(ctx: BuildContext, task: Task, result: Result): void;
+ fail(ctx: BuildContext, task: Task, err: unknown): void;
+}
+
+interface TaskHandlers {
+ 'build:js': TaskHandler;
+ 'build:dts': TaskHandler;
+ 'watch:js': TaskHandler;
+ 'watch:dts': TaskHandler;
+}
+
+const taskHandlers: TaskHandlers = {
+ 'build:js': viteBuildTask,
+ 'build:dts': dtsBuildTask,
+ 'watch:js': viteWatchTask,
+ 'watch:dts': dtsWatchTask,
+};
+
+export { taskHandlers };
+export type { TaskHandler, TaskHandlers };
diff --git a/src/node/tasks/vite/build.ts b/src/node/tasks/vite/build.ts
new file mode 100644
index 0000000..0347441
--- /dev/null
+++ b/src/node/tasks/vite/build.ts
@@ -0,0 +1,78 @@
+import chalk from 'chalk';
+import os from 'os';
+import path from 'path';
+import { Observable } from 'rxjs';
+
+import { isError } from '../../core/errors';
+
+import { resolveViteConfig } from './config';
+
+import type { ViteBaseTask } from './types';
+import type { TaskHandler } from '../index';
+
+interface ViteBuildTask extends ViteBaseTask {
+ type: 'build:js';
+}
+
+const viteBuildTask: TaskHandler = {
+ print(ctx, task) {
+ const targetLines = [
+ ' target:',
+ ...ctx.targets[task.runtime].map((t) => chalk.cyan(` - ${t}`)),
+ ];
+ const entries = [
+ ' entries:',
+ ...task.entries.map((entry) =>
+ [
+ ' β ',
+ chalk.green(`${path.join(ctx.pkg.name, entry.path)}: `),
+ `${chalk.cyan(entry.entry)} ${chalk.gray('β')} ${chalk.cyan(task.output)}`,
+ ].join('')
+ ),
+ ];
+
+ ctx.logger.log(
+ ['Building javascript files:', ` format: ${task.format}`, ...targetLines, ...entries].join(
+ os.EOL
+ )
+ );
+ },
+ run$(ctx, task) {
+ return new Observable((subscriber) => {
+ resolveViteConfig(ctx, task).then((config) => {
+ ctx.logger.debug('Vite config:', os.EOL, config);
+ import('vite').then(({ build }) => {
+ build(config)
+ .then(() => {
+ subscriber.complete();
+ })
+ .catch((err) => {
+ subscriber.error(err);
+ });
+ });
+ });
+ });
+ },
+ async success(ctx, task) {
+ const msg = [
+ `Built javascript (runtime: ${task.runtime} β target: ${task.format})`,
+ task.entries
+ .map(
+ (e) => ` ${chalk.blue(path.join(ctx.pkg.name, e.path))}: ${e.entry} -> ${task.output}`
+ )
+ .join(os.EOL),
+ ];
+
+ ctx.logger.success(msg.join(os.EOL));
+ },
+ async fail(ctx, task, err) {
+ if (isError(err)) {
+ ctx.logger.error(err.message);
+ }
+
+ process.exit(1);
+ },
+};
+
+export { viteBuildTask };
+export type { ViteBuildTask };
diff --git a/src/node/tasks/vite/config.ts b/src/node/tasks/vite/config.ts
new file mode 100644
index 0000000..03cc883
--- /dev/null
+++ b/src/node/tasks/vite/config.ts
@@ -0,0 +1,139 @@
+/* eslint-disable no-nested-ternary */
+import react from '@vitejs/plugin-react-swc';
+import { builtinModules } from 'node:module';
+import path from 'path';
+
+import { resolveConfigProperty } from '../../core/config';
+
+import type { ViteBaseTask } from './types';
+import type { BuildContext } from '../../createBuildContext';
+import type { InlineConfig } from 'vite';
+
+/**
+ * @internal
+ */
+const resolveViteConfig = async (ctx: BuildContext, task: ViteBaseTask) => {
+ const { cwd, distPath, targets, external, extMap, pkg, exports: exportMap } = ctx;
+ const { entries, format, output, runtime } = task;
+ const outputExt = extMap[pkg.type || 'commonjs'][format];
+ const outDir = path.relative(cwd, distPath);
+
+ const { createLogger } = await import('vite');
+ const customLogger = createLogger();
+ customLogger.warn = (msg) => ctx.logger.warn(msg);
+ customLogger.warnOnce = (msg) => ctx.logger.warn(msg);
+ customLogger.error = (msg) => ctx.logger.error(msg);
+ customLogger.info = () => {};
+
+ const exportIds = Object.keys(exportMap).map((exportPath) => path.join(pkg.name, exportPath));
+ const sourcePaths = Object.values(exportMap).map((exp) => path.resolve(cwd, exp.source));
+
+ const basePlugins = runtime === 'node' ? [] : [react()];
+
+ const plugins = ctx.config.plugins
+ ? typeof ctx.config.plugins === 'function'
+ ? ctx.config.plugins({ runtime })
+ : ctx.config.plugins
+ : [];
+
+ const config = {
+ configFile: false,
+ root: cwd,
+ mode: 'production',
+ logLevel: 'warn',
+ clearScreen: false,
+ customLogger,
+ build: {
+ minify: resolveConfigProperty(ctx.config.minify, false),
+ sourcemap: resolveConfigProperty(ctx.config.sourcemap, true),
+ /**
+ * The task runner will clear this for us
+ */
+ emptyOutDir: false,
+ target: targets[runtime],
+ outDir,
+ lib: {
+ entry: entries.map((e) => e.entry),
+ formats: [format],
+ /**
+ * this enforces the file name to match what the output we've
+ * determined from the package.json exports. However, when preserving modules
+ * we want to let Rollup handle the file names.
+ */
+ fileName: resolveConfigProperty(ctx.config.preserveModules, false)
+ ? undefined
+ : () => {
+ return `${path.relative(outDir, output).replace(/\.[^/.]+$/, '')}${outputExt}`;
+ },
+ },
+ rollupOptions: {
+ external(id, importer) {
+ // Check if the id is a self-referencing import
+ if (exportIds?.includes(id)) {
+ return true;
+ }
+
+ // Check if the id is a file path that points to an exported source file
+ if (importer && (id.startsWith('.') || id.startsWith('/'))) {
+ const idPath = path.resolve(path.dirname(importer), id);
+
+ if (sourcePaths?.includes(idPath)) {
+ ctx.logger.warn(
+ `detected self-referencing import β treating as external: ${path.relative(
+ cwd,
+ idPath
+ )}`
+ );
+
+ return true;
+ }
+ }
+
+ const idParts = id.split('/');
+
+ const name = idParts[0]?.startsWith('@') ? `${idParts[0]}/${idParts[1]}` : idParts[0];
+
+ const builtinModulesWithNodePrefix = [
+ ...builtinModules,
+ ...builtinModules.map((modName) => `node:${modName}`),
+ ];
+
+ if (
+ (name && external.includes(name)) ||
+ (name && builtinModulesWithNodePrefix.includes(name))
+ ) {
+ return true;
+ }
+
+ return false;
+ },
+ output: {
+ preserveModules: resolveConfigProperty(ctx.config.preserveModules, false),
+ /**
+ * Mimic TypeScript's behavior, by setting the value to "auto" to control
+ * how Rollup handles default, namespace and dynamic imports from external
+ * dependencies in formats like CommonJS that do not natively support
+ * these concepts. Mainly styled-components@5
+ *
+ * For more info see https://rollupjs.org/configuration-options/#output-interop
+ */
+ interop: 'auto',
+ chunkFileNames() {
+ const parts = outputExt.split('.');
+
+ if (parts.length === 3) {
+ return `_chunks/[name]-[hash].${parts[2]}`;
+ }
+
+ return `_chunks/[name]-[hash]${outputExt}`;
+ },
+ },
+ },
+ },
+ plugins: [...basePlugins, ...plugins],
+ } satisfies InlineConfig;
+
+ return config;
+};
+
+export { resolveViteConfig };
diff --git a/src/node/tasks/vite/types.ts b/src/node/tasks/vite/types.ts
new file mode 100644
index 0000000..b1697d7
--- /dev/null
+++ b/src/node/tasks/vite/types.ts
@@ -0,0 +1,17 @@
+import type { Extensions } from '../../core/exports';
+import type { Targets } from '../../createBuildContext';
+
+interface ViteTaskEntry {
+ path: string;
+ entry: string;
+}
+
+interface ViteBaseTask {
+ type: string;
+ entries: ViteTaskEntry[];
+ format: Extensions;
+ output: string;
+ runtime: keyof Targets;
+}
+
+export type { ViteBaseTask, ViteTaskEntry };
diff --git a/src/node/tasks/vite/watch.ts b/src/node/tasks/vite/watch.ts
new file mode 100644
index 0000000..80a00de
--- /dev/null
+++ b/src/node/tasks/vite/watch.ts
@@ -0,0 +1,106 @@
+import chalk from 'chalk';
+import os from 'os';
+import path from 'path';
+import { Observable } from 'rxjs';
+
+import { isError } from '../../core/errors';
+
+import { resolveViteConfig } from './config';
+
+import type { ViteBaseTask } from './types';
+import type { TaskHandler } from '../index';
+
+export type InputOption = string | string[] | { [entryAlias: string]: string };
+
+/**
+ * This is a copy because it can't be imported from `vite`.
+ */
+export type RollupWatcherEvent =
+ | { code: 'START' }
+ | { code: 'BUNDLE_START'; input?: InputOption; output: readonly string[] }
+ | {
+ code: 'BUNDLE_END';
+ duration: number;
+ input?: InputOption;
+ output: readonly string[];
+ result: object;
+ }
+ | { code: 'END' }
+ | { code: 'ERROR'; error: object; result: object | null };
+
+interface ViteWatchTask extends ViteBaseTask {
+ type: 'watch:js';
+}
+
+const viteWatchTask: TaskHandler = {
+ print(ctx, task) {
+ const msg = [
+ `Building Javascript (runtime: ${task.runtime} β target: ${task.format})`,
+ task.entries
+ .map(
+ (e) => ` ${chalk.blue(path.join(ctx.pkg.name, e.path))}: ${e.entry} -> ${task.output}`
+ )
+ .join(os.EOL),
+ ];
+
+ ctx.logger.success(msg.join(os.EOL));
+ },
+ run$(ctx, task) {
+ /**
+ * We need to return an observable here, but vite build
+ * is an async function which the observable does not want,
+ * so we do some classic let definition with if to workaround.
+ */
+ return new Observable((subscriber) => {
+ let watcher: object | null = null;
+
+ resolveViteConfig(ctx, task).then((config) => {
+ ctx.logger.debug(`Vite config:${os.EOL}`, config);
+ import('vite').then(({ build }) => {
+ build({
+ ...config,
+ mode: 'development',
+ build: {
+ ...config.build,
+ watch: {},
+ },
+ }).then((rollupWatcher) => {
+ watcher = rollupWatcher;
+
+ if ('on' in watcher && typeof watcher.on === 'function') {
+ watcher.on('event', (ev: any) => {
+ subscriber.next(ev);
+ });
+ }
+ });
+ });
+ });
+
+ return () => {
+ if (watcher !== null && 'close' in watcher && typeof watcher.close === 'function') {
+ watcher.close();
+ }
+ };
+ });
+ },
+ success(ctx, task, result) {
+ switch (result.code) {
+ case 'BUNDLE_END':
+ this.print(ctx, task);
+ break;
+ case 'ERROR':
+ ctx.logger.error(result.error);
+ break;
+ default:
+ break;
+ }
+ },
+ fail(ctx, task, err) {
+ if (isError(err)) {
+ ctx.logger.error(err);
+ }
+ },
+};
+
+export { viteWatchTask };
+export type { ViteWatchTask };
diff --git a/src/node/templates/create.ts b/src/node/templates/create.ts
new file mode 100644
index 0000000..9bd9ea9
--- /dev/null
+++ b/src/node/templates/create.ts
@@ -0,0 +1,157 @@
+import { mkdir, writeFile } from 'fs/promises';
+import os from 'os';
+import { relative, resolve, dirname } from 'path';
+import prompts from 'prompts';
+
+import { isError } from '../core/errors';
+import { parseGlobalGitConfig } from '../core/git';
+
+import type {
+ Template,
+ TemplateFeature,
+ TemplateOption,
+ TemplateOrTemplateResolver,
+} from './types';
+import type { Logger } from '../core/logger';
+import type { Config as PrettierConfig } from 'prettier';
+
+interface CreatePackageFromTemplateOpts {
+ logger: Logger;
+ cwd: string;
+ template: TemplateOrTemplateResolver;
+}
+
+/**
+ * @internal
+ *
+ * @description Resolves a template if it's a function and runs
+ * through the template to create a new package.
+ */
+const createPackageFromTemplate = async (
+ packagePath: string,
+ opts: CreatePackageFromTemplateOpts
+) => {
+ const { cwd, logger, template: templateOrResolver } = opts;
+
+ const prettier = await import('prettier'); // ESM-only
+
+ const gitConfig = await parseGlobalGitConfig();
+
+ const template =
+ typeof templateOrResolver === 'function'
+ ? await templateOrResolver({ cwd, logger, packagePath, gitConfig })
+ : templateOrResolver;
+
+ logger.info('Creating a new package at: ', relative(cwd, packagePath));
+
+ logger.debug('Loaded template:', os.EOL, template);
+
+ const answers: Parameters[0] = [];
+
+ if (Array.isArray(template.prompts)) {
+ for (const prompt of template.prompts) {
+ /**
+ * We know it's a TemplateOption if it has a type property.
+ */
+ if ('type' in prompt) {
+ const res = await prompts(prompt, {
+ onCancel() {
+ process.exit(0);
+ },
+ });
+
+ answers.push({ name: prompt.name, answer: res[prompt.name] });
+ } else {
+ const res = prompt.optional
+ ? await prompts({
+ type: 'confirm',
+ name: 'confirm',
+ message: `use ${prompt.name}?`,
+ initial: prompt.initial,
+ })
+ : null;
+
+ answers.push({
+ name: prompt.name,
+ answer: res?.confirm ?? !prompt.optional,
+ });
+ }
+ }
+
+ logger.debug(
+ [
+ 'User answers: ',
+ ...answers.map((ans) => ` ${ans.name}: ${JSON.stringify(ans.answer)}`),
+ ].join(os.EOL)
+ );
+ }
+
+ const files = await template.getFiles(answers);
+
+ logger.debug(
+ ['Files to write: ', ...files.map((f) => ` ${f.name}: ${f.contents}`)].join(os.EOL)
+ );
+
+ /**
+ * Sort files alphabetically, just cause it's nice.
+ */
+ files.sort((a, b) => {
+ return a.name.localeCompare(b.name);
+ });
+
+ for (const file of files) {
+ const filePath = resolve(packagePath, file.name);
+
+ await mkdir(dirname(filePath), { recursive: true });
+
+ const defaultPrettierConfig: PrettierConfig = {
+ endOfLine: 'lf',
+ tabWidth: 2,
+ printWidth: 100,
+ singleQuote: true,
+ trailingComma: 'es5',
+ };
+ try {
+ const formattedContents = await prettier.format(file.contents, {
+ ...defaultPrettierConfig,
+ filepath: filePath,
+ });
+
+ await writeFile(filePath, `${formattedContents.trim()}${os.EOL}`);
+ } catch (err) {
+ if (isError(err)) {
+ logger.debug(err.message);
+ }
+
+ await writeFile(filePath, `${file.contents.trim()}${os.EOL}`);
+ }
+
+ logger.success(`Wrote ${relative(cwd, filePath)}`);
+ }
+};
+
+/**
+ * @public
+ *
+ * @description a helper function to define your package template in a typesafe manner.
+ */
+const defineTemplate = (template: TemplateOrTemplateResolver): TemplateOrTemplateResolver =>
+ template;
+
+/**
+ * @public
+ *
+ * @description Create a prompt for your users to input data for your package template.
+ * e.g. "what is the name of your package?"
+ */
+const definePackageOption = (option: TemplateOption): TemplateOption =>
+ option;
+
+/**
+ * @public
+ *
+ * @description Create a feature option for your package e.g. "do you want typescript?" β yes/no.
+ */
+const definePackageFeature = (feature: TemplateFeature): TemplateFeature => feature;
+
+export { createPackageFromTemplate, definePackageFeature, definePackageOption, defineTemplate };
diff --git a/src/node/templates/internal/default.ts b/src/node/templates/internal/default.ts
new file mode 100644
index 0000000..049fc83
--- /dev/null
+++ b/src/node/templates/internal/default.ts
@@ -0,0 +1,364 @@
+import getLatestVersion from 'get-latest-version';
+import gitUrlParse from 'git-url-parse';
+import { outdent } from 'outdent';
+
+import { isError } from '../../core/errors';
+import { definePackageFeature, definePackageOption, defineTemplate } from '../create';
+
+import { editorConfigFile } from './files/editorConfig';
+import { gitIgnoreFile } from './files/gitIgnore';
+import { prettierFile, prettierIgnoreFile } from './files/prettier';
+
+import type { PackageJson } from '../../core/pkg';
+import type { TemplateFile } from '../types';
+
+const PACKAGE_NAME_REGEXP = /^(?:@(?:[a-z0-9-*~][a-z0-9-*._~]*)\/)?[a-z0-9-~][a-z0-9-._~]*$/i;
+
+const defaultTemplate = defineTemplate(async ({ logger, gitConfig }) => {
+ let repo: {
+ source?: string;
+ owner?: string;
+ name?: string;
+ };
+
+ return {
+ prompts: [
+ definePackageOption({
+ name: 'repo',
+ type: 'text',
+ message: 'git url',
+ validate(v) {
+ if (!v) {
+ return true;
+ }
+
+ try {
+ const result = gitUrlParse(v);
+
+ repo = { source: result.source, owner: result.owner, name: result.name };
+
+ return true;
+ } catch (err) {
+ return 'invalid git url';
+ }
+ },
+ }),
+ definePackageOption({
+ name: 'pkgName',
+ type: 'text',
+ message: 'package name',
+ initial: () => repo?.name ?? '',
+ validate(v) {
+ if (!v) {
+ return 'package name is required';
+ }
+
+ const match = PACKAGE_NAME_REGEXP.exec(v);
+
+ if (!match) {
+ return 'invalid package name';
+ }
+
+ return true;
+ },
+ }),
+ definePackageOption({
+ name: 'description',
+ type: 'text',
+ message: 'package description',
+ }),
+ definePackageOption({
+ name: 'authorName',
+ type: 'text',
+ message: 'package author name',
+ initial: gitConfig?.user?.name,
+ }),
+ definePackageOption({
+ name: 'authorEmail',
+ type: 'text',
+ message: 'package author email',
+ initial: gitConfig?.user?.email,
+ }),
+ definePackageOption({
+ name: 'license',
+ type: 'text',
+ message: 'package license',
+ initial: 'MIT',
+ validate(v) {
+ if (!v) {
+ return 'license is required';
+ }
+
+ return true;
+ },
+ }),
+ definePackageFeature({
+ name: 'typescript',
+ initial: true,
+ optional: true,
+ }),
+ definePackageFeature({
+ name: 'eslint',
+ initial: true,
+ optional: true,
+ }),
+ ],
+ async getFiles(answers) {
+ const devDepsToInstall: string[] = [];
+ const author: string[] = [];
+ let isTypescript = false;
+
+ const files: TemplateFile[] = [];
+
+ // package.json
+ const pkgJson: PackageJson = {
+ version: '0.0.0',
+ keywords: [],
+ type: 'commonjs',
+ exports: {
+ // @ts-expect-error yup typings are a bit weak.
+ '.': {
+ require: './dist/index.js',
+ import: './dist/index.mjs',
+ source: '',
+ default: './dist/index.js',
+ },
+ './package.json': './package.json',
+ },
+ main: './dist/index.js',
+ module: './dist/index.mjs',
+ files: ['dist'],
+ scripts: {
+ check: 'pack-up check',
+ build: 'pack-up build',
+ watch: 'pack-up watch',
+ },
+ dependencies: {},
+ devDependencies: {
+ /**
+ * We set * as a default version, but further down
+ * we try to resolve each package to their latest
+ * version, failing that we leave the fallback of *.
+ */
+ '@strapi/pack-up': '*',
+ prettier: '*',
+ },
+ };
+
+ if (Array.isArray(answers)) {
+ for (const ans of answers) {
+ const { name, answer } = ans;
+
+ switch (name) {
+ case 'pkgName': {
+ pkgJson.name = String(answer);
+ break;
+ }
+ case 'description': {
+ pkgJson.description = String(answer) ?? undefined;
+ break;
+ }
+ case 'authorName': {
+ author.push(String(answer));
+ break;
+ }
+ case 'authorEmail': {
+ if (answer) {
+ author.push(`<${answer}>`);
+ }
+ break;
+ }
+ case 'license': {
+ pkgJson.license = String(answer);
+ break;
+ }
+ case 'typescript': {
+ isTypescript = Boolean(answer);
+
+ pkgJson.source = isTypescript ? './src/index.ts' : './src/index.js';
+
+ if (isRecord(pkgJson.exports['.'])) {
+ pkgJson.exports['.'].source = isTypescript ? './src/index.ts' : './src/index.js';
+ }
+
+ if (isTypescript) {
+ pkgJson.types = './dist/index.d.ts';
+
+ if (isRecord(pkgJson.exports['.'])) {
+ pkgJson.exports['.'] = {
+ // @ts-expect-error it won't be overwritten.
+ types: './dist/index.d.ts',
+ ...pkgJson.exports['.'],
+ };
+ }
+
+ pkgJson.scripts = {
+ ...pkgJson.scripts,
+ 'test:ts': 'tsc --build',
+ };
+
+ devDepsToInstall.push('typescript');
+
+ const { tsconfigBuildFile, tsconfigFile } = await import('./files/typescript');
+
+ files.push(tsconfigFile, tsconfigBuildFile);
+ }
+
+ // source
+ files.push({
+ name: isTypescript ? 'src/index.ts' : 'src/index.js',
+ contents: outdent`
+ /**
+ * @public
+ */
+ const main = () => {
+ // silence is golden
+ }
+
+ export { main }
+ `,
+ });
+
+ break;
+ }
+ case 'eslint': {
+ if (answer) {
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
+ const eslintConfig: any = {
+ root: true,
+ env: {
+ browser: true,
+ es6: true,
+ node: true,
+ },
+ extends: ['eslint:recommended', 'plugin:prettier/recommended'],
+ parserOptions: {
+ ecmaVersion: 'latest',
+ sourceType: 'module',
+ },
+ plugins: ['prettier'],
+ };
+
+ if (isTypescript) {
+ eslintConfig.overrides = [
+ {
+ files: ['**/*.ts', '**/*.tsx'],
+ parser: '@typescript-eslint/parser',
+ parserOptions: {
+ project: ['./tsconfig.eslint.json'],
+ },
+ extends: [
+ 'eslint:recommended',
+ 'plugin:prettier/recommended',
+ 'plugin:@typescript-eslint/eslint-recommended',
+ 'plugin:@typescript-eslint/recommended',
+ ],
+ plugins: ['@typescript-eslint', 'prettier'],
+ },
+ ];
+
+ const { tsconfigEslintFile } = await import('./files/typescript');
+
+ // tsconfig.eslint.json
+ files.push(tsconfigEslintFile);
+ }
+
+ pkgJson.scripts = {
+ ...pkgJson.scripts,
+ lint: isTypescript
+ ? 'eslint . --ext .cjs,.js,.ts,.tsx'
+ : 'eslint . --ext .cjs,.js',
+ };
+
+ devDepsToInstall.push('eslint', 'eslint-config-prettier', 'eslint-plugin-prettier');
+
+ if (isTypescript) {
+ devDepsToInstall.push(
+ '@typescript-eslint/eslint-plugin',
+ '@typescript-eslint/parser'
+ );
+ }
+
+ const { eslintIgnoreFile } = await import('./files/eslint');
+
+ files.push(
+ {
+ name: '.eslintrc',
+ contents: outdent`
+ ${JSON.stringify(eslintConfig, null, 2)}
+ `,
+ },
+ eslintIgnoreFile
+ );
+ }
+
+ break;
+ }
+ default:
+ break;
+ }
+ }
+ }
+
+ if (repo) {
+ pkgJson.repository = {
+ type: 'git',
+ url: `git+ssh://git@${repo.source}/${repo.owner}/${repo.name}.git`,
+ };
+ pkgJson.bugs = {
+ url: `https://${repo.source}/${repo.owner}/${repo.name}/issues`,
+ };
+ pkgJson.homepage = `https://${repo.source}/${repo.owner}/${repo.name}#readme`;
+ }
+
+ pkgJson.author = author.filter(Boolean).join(' ') ?? undefined;
+
+ try {
+ pkgJson.devDependencies = await resolveLatestVerisonOfDeps([
+ ...devDepsToInstall,
+ ...Object.keys(pkgJson.devDependencies),
+ ]);
+ } catch (err) {
+ if (isError(err)) {
+ logger.error(err.message);
+ } else {
+ logger.error(err);
+ }
+ }
+
+ files.push({
+ name: 'package.json',
+ contents: outdent`
+ ${JSON.stringify(pkgJson, null, 2)}
+ `,
+ });
+
+ /**
+ * PRETTIER IS INSTALLED BY DEFAULT.
+ */
+ files.push(prettierFile, prettierIgnoreFile, editorConfigFile, gitIgnoreFile);
+
+ return files;
+ },
+ };
+});
+
+const isRecord = (value: unknown): value is Record =>
+ Boolean(value) && !Array.isArray(value) && typeof value === 'object';
+
+const resolveLatestVerisonOfDeps = async (deps: string[]): Promise> => {
+ const latestDeps: Record = {};
+
+ for (const name of deps) {
+ try {
+ const latestVersion = await getLatestVersion(name, '*');
+ latestDeps[name] = latestVersion ? `^${latestVersion}` : '*';
+ } catch (err) {
+ latestDeps[name] = '*';
+ }
+ }
+
+ return latestDeps;
+};
+
+export { defaultTemplate };
diff --git a/src/node/templates/internal/files/editorConfig.ts b/src/node/templates/internal/files/editorConfig.ts
new file mode 100644
index 0000000..2451161
--- /dev/null
+++ b/src/node/templates/internal/files/editorConfig.ts
@@ -0,0 +1,27 @@
+import { outdent } from 'outdent';
+
+import type { TemplateFile } from '../../types';
+
+const editorConfigFile: TemplateFile = {
+ name: '.editorconfig',
+ contents: outdent`
+ root = true
+
+ [*]
+ indent_style = space
+ indent_size = 2
+ end_of_line = lf
+ charset = utf-8
+ trim_trailing_whitespace = true
+ insert_final_newline = true
+
+ [{package.json,*.yml}]
+ indent_style = space
+ indent_size = 2
+
+ [*.md]
+ trim_trailing_whitespace = false
+ `,
+};
+
+export { editorConfigFile };
diff --git a/src/node/templates/internal/files/eslint.ts b/src/node/templates/internal/files/eslint.ts
new file mode 100644
index 0000000..e03ab89
--- /dev/null
+++ b/src/node/templates/internal/files/eslint.ts
@@ -0,0 +1,12 @@
+import { outdent } from 'outdent';
+
+import type { TemplateFile } from '../../types';
+
+const eslintIgnoreFile: TemplateFile = {
+ name: '.eslintignore',
+ contents: outdent`
+ dist
+ `,
+};
+
+export { eslintIgnoreFile };
diff --git a/src/node/templates/internal/files/gitIgnore.ts b/src/node/templates/internal/files/gitIgnore.ts
new file mode 100644
index 0000000..285c7ab
--- /dev/null
+++ b/src/node/templates/internal/files/gitIgnore.ts
@@ -0,0 +1,39 @@
+import { outdent } from 'outdent';
+
+import type { TemplateFile } from '../../types';
+
+const gitIgnoreFile: TemplateFile = {
+ name: '.gitignore',
+ contents: outdent`
+ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files.
+
+ # dependencies
+ node_modules
+ .pnp
+ .pnp.js
+
+ # testing
+ coverage
+
+ # production
+ dist
+
+ # 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
+ `,
+};
+
+export { gitIgnoreFile };
diff --git a/src/node/templates/internal/files/prettier.ts b/src/node/templates/internal/files/prettier.ts
new file mode 100644
index 0000000..1577f91
--- /dev/null
+++ b/src/node/templates/internal/files/prettier.ts
@@ -0,0 +1,26 @@
+import { outdent } from 'outdent';
+
+import type { TemplateFile } from '../../types';
+
+const prettierFile: TemplateFile = {
+ name: '.prettierrc',
+ contents: outdent`
+ {
+ "endOfLine": 'lf',
+ "tabWidth": 2,
+ "printWidth": 100,
+ "singleQuote": true,
+ "trailingComma": 'es5',
+ }
+ `,
+};
+
+const prettierIgnoreFile: TemplateFile = {
+ name: '.prettierignore',
+ contents: outdent`
+ dist
+ coverage
+ `,
+};
+
+export { prettierFile, prettierIgnoreFile };
diff --git a/src/node/templates/internal/files/typescript.ts b/src/node/templates/internal/files/typescript.ts
new file mode 100644
index 0000000..44ebb17
--- /dev/null
+++ b/src/node/templates/internal/files/typescript.ts
@@ -0,0 +1,59 @@
+import { outdent } from 'outdent';
+
+import type { TemplateFile } from '../../types';
+
+const tsconfigFile: TemplateFile = {
+ name: 'tsconfig.json',
+ contents: outdent`
+ {
+ "include": ["src"],
+ "exclude": ["**/*.test.ts"],
+ "compilerOptions": {
+ "composite": false,
+ "declaration": true,
+ "declarationMap": true,
+ "esModuleInterop": true,
+ "forceConsistentCasingInFileNames": true,
+ "inlineSources": false,
+ "isolatedModules": true,
+ "moduleResolution": "Bundler",
+ "module": "ESNext",
+ "noEmit": true,
+ "noUnusedLocals": false,
+ "noUnusedParameters": false,
+ "preserveWatchOutput": true,
+ "skipLibCheck": true,
+ "strict": true
+ }
+ }
+ `,
+};
+
+const tsconfigBuildFile: TemplateFile = {
+ name: 'tsconfig.build.json',
+ contents: outdent`
+ {
+ "extends": "./tsconfig",
+ "include": ["./src"],
+ "compilerOptions": {
+ "rootDir": ".",
+ "outDir": "./dist",
+ "emitDeclarationOnly": true,
+ "noEmit": false,
+ "resolveJsonModule": true
+ }
+ }
+ `,
+};
+
+const tsconfigEslintFile: TemplateFile = {
+ name: 'tsconfig.eslint.json',
+ contents: outdent`
+ {
+ "extends": "./tsconfig",
+ "include": ["src", "*.ts", "*.js"],
+ }
+ `,
+};
+
+export { tsconfigFile, tsconfigBuildFile, tsconfigEslintFile };
diff --git a/src/node/templates/load.ts b/src/node/templates/load.ts
new file mode 100644
index 0000000..c2ee4da
--- /dev/null
+++ b/src/node/templates/load.ts
@@ -0,0 +1,49 @@
+import { register } from 'esbuild-register/dist/node';
+import { existsSync } from 'fs';
+import { resolve } from 'path';
+
+import type { TemplateOrTemplateResolver } from './types';
+import type { Logger } from '../core/logger';
+
+/**
+ * @internal
+ *
+ * @description Resolve a template from a path and return it.
+ */
+const loadTemplate = (
+ path: string,
+ { logger }: { logger: Logger }
+): TemplateOrTemplateResolver | undefined => {
+ const configPath = resolve(path);
+
+ const exists = existsSync(configPath);
+
+ if (exists) {
+ const esbuildOptions = { extensions: ['.js', '.mjs', '.ts'] };
+
+ const { unregister } = register(esbuildOptions);
+
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
+ const mod = require(configPath);
+
+ unregister();
+
+ if (!mod) {
+ logger.warn(`Could not find template at: ${path}. Are you sure it exists?`);
+ return undefined;
+ }
+
+ logger.debug('Loaded user provided template from: ', path);
+
+ /**
+ * handles esm or cjs exporting.
+ */
+ return mod?.default || mod;
+ }
+
+ logger.warn(`Could not find template at: ${path}. Are you sure it exists?`);
+
+ return undefined;
+};
+
+export { loadTemplate };
diff --git a/src/node/templates/types.ts b/src/node/templates/types.ts
new file mode 100644
index 0000000..dd79c3a
--- /dev/null
+++ b/src/node/templates/types.ts
@@ -0,0 +1,65 @@
+import type { GitConfig } from '../core/git';
+import type { Logger } from '../core/logger';
+import type { PromptObject } from 'prompts';
+
+interface TemplateFeature extends Pick, 'initial'> {
+ /**
+ * Name of the feature you want to add to your package.
+ * This must be identical to the name of the feature on npm.
+ */
+ name: string;
+ /**
+ * @default true
+ */
+ optional?: boolean;
+}
+
+interface TemplateOption
+ extends Omit, 'onState' | 'onRender' | 'stdout' | 'stdin' | 'name'> {
+ name: string;
+}
+
+interface TemplateFile {
+ name: string;
+ contents: string;
+}
+
+interface Template {
+ /**
+ * If you're not using a template in a CLI environment,
+ * it's not recommended to use prompts. Instead, you should
+ * just return all the files your template needs in from the
+ * `getFiles` function.
+ */
+ prompts?: Array;
+ /**
+ * A dictionary of the files that will be created in the
+ * new package. The key is the file name and the value is
+ * the file contents, we prettify the contents before writing
+ * using a default config if there's not one in the package.
+ */
+ getFiles: (
+ answers?: Array<{ name: string; answer: string | boolean }>
+ ) => Promise>;
+}
+
+interface TemplateContext {
+ cwd: string;
+ gitConfig: GitConfig | null;
+ logger: Logger;
+ packagePath: string;
+}
+
+type TemplateResolver = (ctx: TemplateContext) => Promise;
+
+type TemplateOrTemplateResolver = Template | TemplateResolver;
+
+export type {
+ Template,
+ TemplateContext,
+ TemplateResolver,
+ TemplateOrTemplateResolver,
+ TemplateFile,
+ TemplateFeature,
+ TemplateOption,
+};
diff --git a/src/node/watch.ts b/src/node/watch.ts
new file mode 100644
index 0000000..9dffd51
--- /dev/null
+++ b/src/node/watch.ts
@@ -0,0 +1,179 @@
+import chokidar from 'chokidar';
+import path from 'path';
+import { Observable, distinctUntilChanged, scan, startWith, switchMap } from 'rxjs';
+
+import { CONFIG_FILE_NAMES, loadConfig } from './core/config';
+import { getExportExtensionMap, validateExportsOrdering } from './core/exports';
+import { createLogger } from './core/logger';
+import { loadPkg, validatePkg } from './core/pkg';
+import { createBuildContext } from './createBuildContext';
+import { createWatchTasks } from './createTasks';
+import { taskHandlers } from './tasks';
+
+import type { Config } from './core/config';
+import type { WatchTask } from './createTasks';
+import type { TaskHandler } from './tasks';
+import type { CommonCLIOptions } from '../types';
+
+type WatchCLIOptions = CommonCLIOptions;
+
+interface WatchOptionsWithoutConfig extends WatchCLIOptions {
+ configFile?: true;
+ config?: never;
+ cwd?: string;
+}
+
+interface WatchOptionsWithConfig extends WatchCLIOptions {
+ configFile: false;
+ config?: Config;
+ cwd?: string;
+}
+
+type WatchOptions = WatchOptionsWithConfig | WatchOptionsWithoutConfig;
+
+const watch = async (opts: WatchOptions) => {
+ const { silent, debug, cwd = process.cwd(), configFile = true, config: providedConfig } = opts;
+
+ const logger = createLogger({ silent, debug });
+
+ logger.debug('watching config files');
+
+ const configFilePaths = ['package.json', ...CONFIG_FILE_NAMES].map((fileName) =>
+ path.resolve(cwd, fileName).split(path.sep).join(path.posix.sep)
+ );
+
+ interface FileEvent {
+ event: 'add' | 'addDir' | 'change' | 'unlink' | 'unlinkDir';
+ path: string;
+ }
+
+ const watcher$ = new Observable((subscriber) => {
+ const watcher = chokidar.watch(configFilePaths, {
+ ignoreInitial: true,
+ });
+
+ const handleEvent = (event: FileEvent['event'], filePath: FileEvent['path']) => {
+ subscriber.next({
+ event,
+ path: filePath,
+ });
+ };
+
+ watcher.on('all', handleEvent);
+
+ return () => {
+ watcher.off('all', handleEvent);
+ watcher.close();
+ };
+ });
+
+ const configFiles$ = watcher$.pipe(
+ scan((files, { event, path: filePath }) => {
+ if (event === 'add') {
+ logger.debug('config file added', filePath);
+
+ return [...files, filePath];
+ }
+
+ if (event === 'unlink') {
+ logger.debug('config file removed', filePath);
+
+ return files.filter((fPath) => fPath !== filePath);
+ }
+
+ if (event === 'change') {
+ logger.log(
+ '--------------------------------------------------------------------------------'
+ );
+ logger.info(path.relative(cwd, filePath), 'changed');
+
+ return files.slice(0);
+ }
+
+ return files;
+ }, configFilePaths),
+ startWith(configFilePaths),
+ distinctUntilChanged()
+ );
+
+ const ctx$ = configFiles$.pipe(
+ switchMap(async (configFiles) => {
+ const files = configFiles.map((f) => path.relative(cwd, f));
+
+ const packageJsonPath = files.find((f) => f === 'package.json');
+
+ if (!packageJsonPath) {
+ throw new Error('missing package.json');
+ }
+
+ const rawPkg = await loadPkg({ cwd, logger });
+
+ const validatedPkg = await validatePkg({
+ pkg: rawPkg,
+ }).catch((err) => {
+ logger.error(err.message);
+ process.exit(1);
+ });
+
+ /**
+ * Validate the exports of the package incl. the order of the
+ * exports within the exports map if applicable
+ */
+ const packageJson = await validateExportsOrdering({ pkg: validatedPkg, logger }).catch(
+ (err) => {
+ logger.error(err.message);
+ process.exit(1);
+ }
+ );
+
+ /**
+ * If configFile is true β which is the default, atempt to load the config
+ * otherwise if it's explicitly false then we suspect there might be a config passed
+ * in the options, so we'll use that instead.
+ */
+ const config = configFile ? await loadConfig({ cwd, logger }) : providedConfig;
+ /**
+ * We create tasks based on the exports of the package.json
+ * their handlers are then ran in the order of the exports map
+ * and results are logged to see gradual progress.
+ */
+
+ const extMap = getExportExtensionMap();
+
+ return createBuildContext({
+ config: { ...config },
+ cwd,
+ extMap,
+ logger,
+ pkg: packageJson,
+ }).catch((err) => {
+ logger.error(err.message);
+ process.exit(1);
+ });
+ })
+ );
+
+ ctx$.subscribe(async (ctx) => {
+ const watchTasks = await createWatchTasks(ctx);
+
+ for (const task of watchTasks) {
+ const handler = taskHandlers[task.type] as TaskHandler;
+
+ const result$ = handler.run$(ctx, task);
+
+ result$.subscribe({
+ error(err) {
+ handler.fail(ctx, task, err);
+
+ process.exit(1);
+ },
+ next(result) {
+ handler.success(ctx, task, result);
+ },
+ });
+ }
+ });
+};
+
+export { watch };
+export type { WatchOptions, WatchOptionsWithConfig, WatchOptionsWithoutConfig, WatchCLIOptions };
diff --git a/src/types.ts b/src/types.ts
new file mode 100644
index 0000000..35c2670
--- /dev/null
+++ b/src/types.ts
@@ -0,0 +1,4 @@
+export interface CommonCLIOptions {
+ silent?: boolean;
+ debug?: boolean;
+}
diff --git a/tests/console.ts b/tests/console.ts
new file mode 100644
index 0000000..fa11bad
--- /dev/null
+++ b/tests/console.ts
@@ -0,0 +1,13 @@
+/**
+ * Removes the color pieces from a string, useful
+ * for testing strings when you use `chalk`.
+ */
+
+// eslint-disable-next-line no-control-regex
+const ANSI_COLOR_RE = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
+
+function stripColor(str: string) {
+ return str.replace(ANSI_COLOR_RE, '');
+}
+
+export { stripColor };
diff --git a/tests/spawn.ts b/tests/spawn.ts
new file mode 100644
index 0000000..9d247f9
--- /dev/null
+++ b/tests/spawn.ts
@@ -0,0 +1,109 @@
+/* eslint-disable no-console */
+import child_process from 'child_process';
+import { mkdir, readdir, stat as fsStat, copyFile } from 'fs/promises';
+import path from 'path';
+
+import { stripColor } from './console';
+import { createWorkspace } from './workspaces';
+
+const copyDirectory = async (source: string, destination: string): Promise => {
+ await mkdir(destination, { recursive: true });
+
+ const files = await readdir(source);
+
+ for (const file of files) {
+ const currentPath = path.join(source, file);
+ const destinationPath = path.join(destination, file);
+
+ const stat = await fsStat(currentPath);
+
+ if (stat.isDirectory()) {
+ await copyDirectory(currentPath, destinationPath);
+ } else {
+ await copyFile(currentPath, destinationPath);
+ }
+ }
+};
+
+const exec = (
+ command: string,
+ options: child_process.ExecOptions = {}
+): Promise<{ stdout: string; stderr: string }> => {
+ return new Promise((resolve, reject) => {
+ child_process.exec(command, options, (err, stdout, stderr) => {
+ if (err) {
+ const execErr = new ExecError(err.message, stdout, stderr);
+
+ execErr.stack = err.stack;
+ reject(execErr);
+
+ return;
+ }
+
+ resolve({ stdout: stripColor(stdout), stderr: stripColor(stderr) });
+ });
+ });
+};
+
+export class ExecError extends Error {
+ stdout: string;
+
+ stderr: string;
+
+ constructor(message: string, stdout: string, stderr: string) {
+ super(message);
+ this.stdout = stdout;
+ this.stderr = stderr;
+ }
+}
+
+const runExec = (cwd: string) => async (cmd: string) => {
+ try {
+ const env = {
+ ...process.env,
+ PATH: `${process.env.PATH}:${path.resolve(__dirname, '../../bin')}`,
+ };
+
+ const res = await exec(cmd, { cwd, env });
+
+ return res;
+ } catch (execErr) {
+ if (execErr instanceof ExecError) {
+ console.log(execErr.stdout);
+ console.error(execErr.stderr);
+
+ return execErr;
+ }
+
+ throw execErr;
+ }
+};
+
+interface Project {
+ cwd: string;
+ install: () => Promise<{ stdout: string; stderr: string }>;
+ remove: () => Promise;
+ run: (cmd: string) => Promise<{ stdout: string; stderr: string }>;
+}
+
+const spawn = async (projectName: string): Promise => {
+ const { path: tmpPath, remove: tmpRemove } = await createWorkspace();
+
+ const packagePath = path.resolve(__dirname, '..', 'examples', projectName);
+
+ /**
+ * Clone the project into the tmp space
+ */
+ await copyDirectory(packagePath, tmpPath);
+
+ const execute = runExec(tmpPath);
+
+ return {
+ cwd: tmpPath,
+ install: () => execute('yarn install'),
+ remove: tmpRemove,
+ run: (cmd: string) => execute(`yarn run ${cmd}`),
+ };
+};
+
+export { spawn };
diff --git a/tests/teardown.ts b/tests/teardown.ts
new file mode 100644
index 0000000..b3c4c52
--- /dev/null
+++ b/tests/teardown.ts
@@ -0,0 +1,5 @@
+import { cleanupWorkspaces } from './workspaces';
+
+export default async () => {
+ await cleanupWorkspaces();
+};
diff --git a/tests/workspaces.ts b/tests/workspaces.ts
new file mode 100644
index 0000000..99d2741
--- /dev/null
+++ b/tests/workspaces.ts
@@ -0,0 +1,28 @@
+import { randomUUID } from 'crypto';
+import { mkdir, rm } from 'fs/promises';
+import path from 'path';
+
+/**
+ * Remove all the tmp folder and everything in it.
+ * Great for when it all goes wrong.
+ */
+const cleanupWorkspaces = async () => {
+ const workspacePath = path.resolve(__dirname, '__tmp__');
+
+ return rm(workspacePath, { recursive: true, force: true });
+};
+
+const createWorkspace = async () => {
+ const key = randomUUID();
+
+ const workspacePath = path.resolve(__dirname, '__tmp__', key);
+
+ await mkdir(workspacePath, { recursive: true });
+
+ return {
+ path: workspacePath,
+ remove: () => rm(workspacePath, { recursive: true, force: true }),
+ };
+};
+
+export { cleanupWorkspaces, createWorkspace };
diff --git a/tsconfig.build.json b/tsconfig.build.json
new file mode 100644
index 0000000..3157725
--- /dev/null
+++ b/tsconfig.build.json
@@ -0,0 +1,9 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "rootDir": "./src",
+ "outDir": "./dist"
+ },
+ "include": ["src"],
+ "exclude": ["tests", "**/__tests__/**", "**/cli/**"]
+}
diff --git a/tsconfig.eslint.json b/tsconfig.eslint.json
new file mode 100644
index 0000000..9fac91c
--- /dev/null
+++ b/tsconfig.eslint.json
@@ -0,0 +1,8 @@
+{
+ "extends": "./tsconfig.json",
+ "compilerOptions": {
+ "noEmit": true
+ },
+ "include": ["examples", "src", "tests", "scripts", "*.config.ts", "*.config.mjs", ".eslintrc.js"],
+ "exclude": ["node_modules"]
+}
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..efe033e
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,20 @@
+{
+ "$schema": "http://json.schemastore.org/tsconfig",
+ "include": ["src"],
+ "exclude": ["node_modules"],
+ "compilerOptions": {
+ "esModuleInterop": true,
+ "skipLibCheck": true,
+ "target": "es2022",
+ "allowJs": true,
+ "resolveJsonModule": true,
+ "moduleDetection": "force",
+ "isolatedModules": true,
+ "strict": true,
+ "noUncheckedIndexedAccess": true,
+ "declaration": true,
+ "module": "preserve",
+ "noEmit": true,
+ "lib": ["es2022"]
+ }
+}