diff --git a/.editorconfig b/.editorconfig index 911850db8..ad097f86a 100644 --- a/.editorconfig +++ b/.editorconfig @@ -7,5 +7,5 @@ charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true -[*test.mts, *.md] +[*test.ts, *.md] trim_trailing_whitespace = false diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 6eb560bda..44e1a40e6 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,5 @@ # These are supported funding model platforms github: sboudrias +thanks_dev: u/gh/sboudrias +tidelift: npm/inquirer diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 55a4c638c..5946cb098 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -1,5 +1,10 @@ name: CI -on: [push, pull_request] + +on: + push: + branches: ['main'] + pull_request: + types: [opened, synchronize] env: TURBO_TOKEN: ${{ secrets.TURBO_TOKEN }} @@ -70,7 +75,7 @@ jobs: cache: 'yarn' - run: yarn install --immutable --immutable-cache - run: yarn vitest --run --coverage - - uses: codecov/codecov-action@v4 + - uses: codecov/codecov-action@v5 Integration: name: Integration Tests @@ -98,7 +103,53 @@ jobs: - run: yarn install --immutable --immutable-cache - run: yarn tsc - name: Integration tests - run: yarn node --test integration/ + run: yarn node --test integration/**/*.test.* + + e2e: + name: End to End build tests + runs-on: ubuntu-latest + needs: Compile + env: + YARN_ENABLE_IMMUTABLE_INSTALLS: false + steps: + - uses: actions/checkout@v4 + - name: Cache turbo build setup + uses: actions/cache@v4 + with: + path: .turbo + key: ${{ runner.os }}-turbo-${{ github.sha }} + restore-keys: ${{ runner.os }}-turbo- + - run: corepack enable + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: 'yarn' + - run: yarn install --immutable --immutable-cache + - run: yarn tsc + - run: yarn workspaces focus --all --production + - name: Pack the monorepo modules + run: | + mkdir -p /tmp/artifacts + yarn workspace @inquirer/core pack --out /tmp/artifacts/inquirer-core.tgz + yarn workspace @inquirer/prompts pack --out /tmp/artifacts/inquirer-prompts.tgz + yarn workspace @inquirer/figures pack --out /tmp/artifacts/inquirer-figures.tgz + yarn workspace @inquirer/type pack --out /tmp/artifacts/inquirer-type.tgz + yarn workspace @repo/tsconfig pack --out /tmp/artifacts/tsconfig.tgz + - name: Extract @inquirer/demo to an isolated project & build + run: | + cur_dir=$(pwd) + temp_dir=$(mktemp -d) + cp -r packages/demo $temp_dir + cp .yarnrc.yml $temp_dir/demo + cd $temp_dir/demo + yarn set version stable + yarn add --dev @repo/tsconfig@file:/tmp/artifacts/tsconfig.tgz + yarn add @inquirer/core@file:/tmp/artifacts/inquirer-core.tgz + yarn add @inquirer/prompts@file:/tmp/artifacts/inquirer-prompts.tgz + yarn add @inquirer/figures@file:/tmp/artifacts/inquirer-figures.tgz + yarn set resolution @inquirer/type@npm:* file:/tmp/artifacts/inquirer-type.tgz + yarn install + yarn tsc Package: name: Are the types wrong? diff --git a/.gitignore b/.gitignore index 290a226cc..3f1eb5ab5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ node_modules dist coverage +.tshy-build .idea .yarn/* !.yarn/cache @@ -10,3 +11,7 @@ coverage !.yarn/sdks !.yarn/versions .turbo +.DS_Store + +# tshy build temporary package.json files while building which end up throwing turbo watch in an infinite loop. +**/src/package.json diff --git a/.husky/pre-commit b/.husky/pre-commit index 372362317..2170cf285 100755 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -1 +1 @@ -yarn lint-staged +yarn nano-staged diff --git a/.prettierignore b/.prettierignore index a7cde37b2..3f7d83221 100644 --- a/.prettierignore +++ b/.prettierignore @@ -1,11 +1,4 @@ -.eslintignore -.gitattributes -.gitignore .husky -.prettierignore .yarn -*.gz -*.zip -*.png +.tshy coverage -yarn.lock diff --git a/.yarn/cache/@arethetypeswrong-cli-npm-0.15.4-2a3bca7b3c-3ae2a01e26.zip b/.yarn/cache/@arethetypeswrong-cli-npm-0.15.4-2a3bca7b3c-3ae2a01e26.zip deleted file mode 100644 index e40a53510..000000000 Binary files a/.yarn/cache/@arethetypeswrong-cli-npm-0.15.4-2a3bca7b3c-3ae2a01e26.zip and /dev/null differ diff --git a/.yarn/cache/@arethetypeswrong-cli-npm-0.17.4-7ea162bc5b-5309b7f0a3.zip b/.yarn/cache/@arethetypeswrong-cli-npm-0.17.4-7ea162bc5b-5309b7f0a3.zip new file mode 100644 index 000000000..c43f61e83 Binary files /dev/null and b/.yarn/cache/@arethetypeswrong-cli-npm-0.17.4-7ea162bc5b-5309b7f0a3.zip differ diff --git a/.yarn/cache/@arethetypeswrong-core-npm-0.15.1-f0ba094ecb-af07d7d0d9.zip b/.yarn/cache/@arethetypeswrong-core-npm-0.15.1-f0ba094ecb-af07d7d0d9.zip deleted file mode 100644 index a6fb4ef46..000000000 Binary files a/.yarn/cache/@arethetypeswrong-core-npm-0.15.1-f0ba094ecb-af07d7d0d9.zip and /dev/null differ diff --git a/.yarn/cache/@arethetypeswrong-core-npm-0.17.4-9659f08239-0aa5d8c21d.zip b/.yarn/cache/@arethetypeswrong-core-npm-0.17.4-9659f08239-0aa5d8c21d.zip new file mode 100644 index 000000000..291775ca0 Binary files /dev/null and b/.yarn/cache/@arethetypeswrong-core-npm-0.17.4-9659f08239-0aa5d8c21d.zip differ diff --git a/.yarn/cache/@babel-code-frame-npm-7.26.2-4902b56813-db2c2122af.zip b/.yarn/cache/@babel-code-frame-npm-7.26.2-4902b56813-db2c2122af.zip new file mode 100644 index 000000000..0c47a20c2 Binary files /dev/null and b/.yarn/cache/@babel-code-frame-npm-7.26.2-4902b56813-db2c2122af.zip differ diff --git a/.yarn/cache/@babel-helper-string-parser-npm-7.23.4-b1f0d030c3-c352082474.zip b/.yarn/cache/@babel-helper-string-parser-npm-7.23.4-b1f0d030c3-c352082474.zip deleted file mode 100644 index c4ea2b9e2..000000000 Binary files a/.yarn/cache/@babel-helper-string-parser-npm-7.23.4-b1f0d030c3-c352082474.zip and /dev/null differ diff --git a/.yarn/cache/@babel-helper-string-parser-npm-7.24.7-560b175e3f-603d8d962b.zip b/.yarn/cache/@babel-helper-string-parser-npm-7.24.7-560b175e3f-603d8d962b.zip deleted file mode 100644 index 6422f0418..000000000 Binary files a/.yarn/cache/@babel-helper-string-parser-npm-7.24.7-560b175e3f-603d8d962b.zip and /dev/null differ diff --git a/.yarn/cache/@babel-helper-string-parser-npm-7.25.9-eade578078-c28656c52b.zip b/.yarn/cache/@babel-helper-string-parser-npm-7.25.9-eade578078-c28656c52b.zip new file mode 100644 index 000000000..284b33641 Binary files /dev/null and b/.yarn/cache/@babel-helper-string-parser-npm-7.25.9-eade578078-c28656c52b.zip differ diff --git a/.yarn/cache/@babel-helper-validator-identifier-npm-7.24.5-d1938535fe-38aaf6a64a.zip b/.yarn/cache/@babel-helper-validator-identifier-npm-7.24.5-d1938535fe-38aaf6a64a.zip deleted file mode 100644 index dd561db1f..000000000 Binary files a/.yarn/cache/@babel-helper-validator-identifier-npm-7.24.5-d1938535fe-38aaf6a64a.zip and /dev/null differ diff --git a/.yarn/cache/@babel-helper-validator-identifier-npm-7.24.7-748889c8d2-86875063f5.zip b/.yarn/cache/@babel-helper-validator-identifier-npm-7.24.7-748889c8d2-86875063f5.zip deleted file mode 100644 index 021881058..000000000 Binary files a/.yarn/cache/@babel-helper-validator-identifier-npm-7.24.7-748889c8d2-86875063f5.zip and /dev/null differ diff --git a/.yarn/cache/@babel-helper-validator-identifier-npm-7.25.9-2634b947a4-3f9b649be0.zip b/.yarn/cache/@babel-helper-validator-identifier-npm-7.25.9-2634b947a4-3f9b649be0.zip new file mode 100644 index 000000000..dbd05a465 Binary files /dev/null and b/.yarn/cache/@babel-helper-validator-identifier-npm-7.25.9-2634b947a4-3f9b649be0.zip differ diff --git a/.yarn/cache/@babel-parser-npm-7.24.7-79d233f3d1-ef9ebce60e.zip b/.yarn/cache/@babel-parser-npm-7.24.7-79d233f3d1-ef9ebce60e.zip deleted file mode 100644 index 86d5369d1..000000000 Binary files a/.yarn/cache/@babel-parser-npm-7.24.7-79d233f3d1-ef9ebce60e.zip and /dev/null differ diff --git a/.yarn/cache/@babel-parser-npm-7.26.2-5b22b96c42-8baee43752.zip b/.yarn/cache/@babel-parser-npm-7.26.2-5b22b96c42-8baee43752.zip new file mode 100644 index 000000000..08edb32b2 Binary files /dev/null and b/.yarn/cache/@babel-parser-npm-7.26.2-5b22b96c42-8baee43752.zip differ diff --git a/.yarn/cache/@babel-types-npm-7.23.9-c32aeb5f36-bed9634e5f.zip b/.yarn/cache/@babel-types-npm-7.23.9-c32aeb5f36-bed9634e5f.zip deleted file mode 100644 index d5998ab0c..000000000 Binary files a/.yarn/cache/@babel-types-npm-7.23.9-c32aeb5f36-bed9634e5f.zip and /dev/null differ diff --git a/.yarn/cache/@babel-types-npm-7.24.7-43a9e43e29-ad3c8c0d6f.zip b/.yarn/cache/@babel-types-npm-7.24.7-43a9e43e29-ad3c8c0d6f.zip deleted file mode 100644 index be847ba0b..000000000 Binary files a/.yarn/cache/@babel-types-npm-7.24.7-43a9e43e29-ad3c8c0d6f.zip and /dev/null differ diff --git a/.yarn/cache/@babel-types-npm-7.26.0-ae81de0a93-40780741ec.zip b/.yarn/cache/@babel-types-npm-7.26.0-ae81de0a93-40780741ec.zip new file mode 100644 index 000000000..f1b0571f9 Binary files /dev/null and b/.yarn/cache/@babel-types-npm-7.26.0-ae81de0a93-40780741ec.zip differ diff --git a/.yarn/cache/@bcoe-v8-coverage-npm-0.2.3-9e27b3c57e-1a1f0e356a.zip b/.yarn/cache/@bcoe-v8-coverage-npm-0.2.3-9e27b3c57e-1a1f0e356a.zip deleted file mode 100644 index c1cb3f991..000000000 Binary files a/.yarn/cache/@bcoe-v8-coverage-npm-0.2.3-9e27b3c57e-1a1f0e356a.zip and /dev/null differ diff --git a/.yarn/cache/@bcoe-v8-coverage-npm-1.0.2-e80fdc21ac-46600b2dde.zip b/.yarn/cache/@bcoe-v8-coverage-npm-1.0.2-e80fdc21ac-46600b2dde.zip new file mode 100644 index 000000000..afe519819 Binary files /dev/null and b/.yarn/cache/@bcoe-v8-coverage-npm-1.0.2-e80fdc21ac-46600b2dde.zip differ diff --git a/.yarn/cache/@braidai-lang-npm-1.1.0-7502bb80bc-e6fde83701.zip b/.yarn/cache/@braidai-lang-npm-1.1.0-7502bb80bc-e6fde83701.zip new file mode 100644 index 000000000..0ab57fac0 Binary files /dev/null and b/.yarn/cache/@braidai-lang-npm-1.1.0-7502bb80bc-e6fde83701.zip differ diff --git a/.yarn/cache/@emnapi-core-npm-1.3.1-58f907a31d-00dbc2ae1b.zip b/.yarn/cache/@emnapi-core-npm-1.3.1-58f907a31d-00dbc2ae1b.zip new file mode 100644 index 000000000..47a4a79d0 Binary files /dev/null and b/.yarn/cache/@emnapi-core-npm-1.3.1-58f907a31d-00dbc2ae1b.zip differ diff --git a/.yarn/cache/@emnapi-runtime-npm-1.3.1-64fd359241-619915ee44.zip b/.yarn/cache/@emnapi-runtime-npm-1.3.1-64fd359241-619915ee44.zip new file mode 100644 index 000000000..5f74f126e Binary files /dev/null and b/.yarn/cache/@emnapi-runtime-npm-1.3.1-64fd359241-619915ee44.zip differ diff --git a/.yarn/cache/@emnapi-wasi-threads-npm-1.0.1-a3701691ed-949f8bdcb1.zip b/.yarn/cache/@emnapi-wasi-threads-npm-1.0.1-a3701691ed-949f8bdcb1.zip new file mode 100644 index 000000000..a59b3fea7 Binary files /dev/null and b/.yarn/cache/@emnapi-wasi-threads-npm-1.0.1-a3701691ed-949f8bdcb1.zip differ diff --git a/.yarn/cache/@esbuild-darwin-arm64-npm-0.20.2-e287d70c91-10.zip b/.yarn/cache/@esbuild-darwin-arm64-npm-0.20.2-e287d70c91-10.zip deleted file mode 100644 index 05240c0ae..000000000 Binary files a/.yarn/cache/@esbuild-darwin-arm64-npm-0.20.2-e287d70c91-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-darwin-arm64-npm-0.24.2-ab76e2ae8a-10.zip b/.yarn/cache/@esbuild-darwin-arm64-npm-0.24.2-ab76e2ae8a-10.zip new file mode 100644 index 000000000..24bdf9624 Binary files /dev/null and b/.yarn/cache/@esbuild-darwin-arm64-npm-0.24.2-ab76e2ae8a-10.zip differ diff --git a/.yarn/cache/@esbuild-darwin-x64-npm-0.20.2-f4f3a851d1-10.zip b/.yarn/cache/@esbuild-darwin-x64-npm-0.20.2-f4f3a851d1-10.zip deleted file mode 100644 index 69a15a399..000000000 Binary files a/.yarn/cache/@esbuild-darwin-x64-npm-0.20.2-f4f3a851d1-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-darwin-x64-npm-0.24.2-c22048f235-10.zip b/.yarn/cache/@esbuild-darwin-x64-npm-0.24.2-c22048f235-10.zip new file mode 100644 index 000000000..253ac90c6 Binary files /dev/null and b/.yarn/cache/@esbuild-darwin-x64-npm-0.24.2-c22048f235-10.zip differ diff --git a/.yarn/cache/@esbuild-linux-arm64-npm-0.20.2-3a02a82580-10.zip b/.yarn/cache/@esbuild-linux-arm64-npm-0.20.2-3a02a82580-10.zip deleted file mode 100644 index 991a7f5be..000000000 Binary files a/.yarn/cache/@esbuild-linux-arm64-npm-0.20.2-3a02a82580-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-linux-arm64-npm-0.24.2-7ea7f1e1a6-10.zip b/.yarn/cache/@esbuild-linux-arm64-npm-0.24.2-7ea7f1e1a6-10.zip new file mode 100644 index 000000000..ab3cfed03 Binary files /dev/null and b/.yarn/cache/@esbuild-linux-arm64-npm-0.24.2-7ea7f1e1a6-10.zip differ diff --git a/.yarn/cache/@esbuild-linux-x64-npm-0.20.2-54b0127370-10.zip b/.yarn/cache/@esbuild-linux-x64-npm-0.20.2-54b0127370-10.zip deleted file mode 100644 index 5f4cc3e05..000000000 Binary files a/.yarn/cache/@esbuild-linux-x64-npm-0.20.2-54b0127370-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-linux-x64-npm-0.24.2-eb2f35022c-10.zip b/.yarn/cache/@esbuild-linux-x64-npm-0.24.2-eb2f35022c-10.zip new file mode 100644 index 000000000..bb525560c Binary files /dev/null and b/.yarn/cache/@esbuild-linux-x64-npm-0.24.2-eb2f35022c-10.zip differ diff --git a/.yarn/cache/@esbuild-win32-arm64-npm-0.20.2-f2a0280705-10.zip b/.yarn/cache/@esbuild-win32-arm64-npm-0.20.2-f2a0280705-10.zip deleted file mode 100644 index bebe75026..000000000 Binary files a/.yarn/cache/@esbuild-win32-arm64-npm-0.20.2-f2a0280705-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-win32-arm64-npm-0.24.2-3632cc4693-10.zip b/.yarn/cache/@esbuild-win32-arm64-npm-0.24.2-3632cc4693-10.zip new file mode 100644 index 000000000..99e160a1e Binary files /dev/null and b/.yarn/cache/@esbuild-win32-arm64-npm-0.24.2-3632cc4693-10.zip differ diff --git a/.yarn/cache/@esbuild-win32-x64-npm-0.20.2-4f45bbb49b-10.zip b/.yarn/cache/@esbuild-win32-x64-npm-0.20.2-4f45bbb49b-10.zip deleted file mode 100644 index cd3ef9d81..000000000 Binary files a/.yarn/cache/@esbuild-win32-x64-npm-0.20.2-4f45bbb49b-10.zip and /dev/null differ diff --git a/.yarn/cache/@esbuild-win32-x64-npm-0.24.2-ebb554ef13-10.zip b/.yarn/cache/@esbuild-win32-x64-npm-0.24.2-ebb554ef13-10.zip new file mode 100644 index 000000000..43b3e7fe0 Binary files /dev/null and b/.yarn/cache/@esbuild-win32-x64-npm-0.24.2-ebb554ef13-10.zip differ diff --git a/.yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-8d70bcdcd8.zip b/.yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-8d70bcdcd8.zip deleted file mode 100644 index 667d59a90..000000000 Binary files a/.yarn/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-8d70bcdcd8.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-community-eslint-utils-npm-4.4.1-c83a271e90-ae92a11412.zip b/.yarn/cache/@eslint-community-eslint-utils-npm-4.4.1-c83a271e90-ae92a11412.zip new file mode 100644 index 000000000..e45cb68f3 Binary files /dev/null and b/.yarn/cache/@eslint-community-eslint-utils-npm-4.4.1-c83a271e90-ae92a11412.zip differ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-8c36169c81.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-8c36169c81.zip deleted file mode 100644 index 14fb460b5..000000000 Binary files a/.yarn/cache/@eslint-community-regexpp-npm-4.10.0-6bfb984c81-8c36169c81.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.11.0-dd7ae18a6d-f053f371c2.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.11.0-dd7ae18a6d-f053f371c2.zip deleted file mode 100644 index 39687a880..000000000 Binary files a/.yarn/cache/@eslint-community-regexpp-npm-4.11.0-dd7ae18a6d-f053f371c2.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-community-regexpp-npm-4.12.1-ef4ab5217e-c08f1dd7dd.zip b/.yarn/cache/@eslint-community-regexpp-npm-4.12.1-ef4ab5217e-c08f1dd7dd.zip new file mode 100644 index 000000000..b2fda8e02 Binary files /dev/null and b/.yarn/cache/@eslint-community-regexpp-npm-4.12.1-ef4ab5217e-c08f1dd7dd.zip differ diff --git a/.yarn/cache/@eslint-config-array-npm-0.18.0-bb4bc4e301-60ccad1eb4.zip b/.yarn/cache/@eslint-config-array-npm-0.18.0-bb4bc4e301-60ccad1eb4.zip deleted file mode 100644 index dd1505b74..000000000 Binary files a/.yarn/cache/@eslint-config-array-npm-0.18.0-bb4bc4e301-60ccad1eb4.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-config-array-npm-0.19.2-9310e910a9-a680972090.zip b/.yarn/cache/@eslint-config-array-npm-0.19.2-9310e910a9-a680972090.zip new file mode 100644 index 000000000..479f8b54c Binary files /dev/null and b/.yarn/cache/@eslint-config-array-npm-0.19.2-9310e910a9-a680972090.zip differ diff --git a/.yarn/cache/@eslint-config-helpers-npm-0.1.0-09250627f2-899b4783c2.zip b/.yarn/cache/@eslint-config-helpers-npm-0.1.0-09250627f2-899b4783c2.zip new file mode 100644 index 000000000..c90179139 Binary files /dev/null and b/.yarn/cache/@eslint-config-helpers-npm-0.1.0-09250627f2-899b4783c2.zip differ diff --git a/.yarn/cache/@eslint-core-npm-0.12.0-38bccca4dd-ee8a2c65ee.zip b/.yarn/cache/@eslint-core-npm-0.12.0-38bccca4dd-ee8a2c65ee.zip new file mode 100644 index 000000000..9b71849c1 Binary files /dev/null and b/.yarn/cache/@eslint-core-npm-0.12.0-38bccca4dd-ee8a2c65ee.zip differ diff --git a/.yarn/cache/@eslint-eslintrc-npm-3.1.0-3837a202e2-02bf892d13.zip b/.yarn/cache/@eslint-eslintrc-npm-3.1.0-3837a202e2-02bf892d13.zip deleted file mode 100644 index 6fd50d72d..000000000 Binary files a/.yarn/cache/@eslint-eslintrc-npm-3.1.0-3837a202e2-02bf892d13.zip and /dev/null differ diff --git a/.yarn/cache/@eslint-eslintrc-npm-3.3.0-72b2f21ce8-f17d232fc4.zip b/.yarn/cache/@eslint-eslintrc-npm-3.3.0-72b2f21ce8-f17d232fc4.zip new file mode 100644 index 000000000..54981f588 Binary files /dev/null and b/.yarn/cache/@eslint-eslintrc-npm-3.3.0-72b2f21ce8-f17d232fc4.zip differ diff --git a/.yarn/cache/@eslint-js-npm-9.9.1-8b7ff1cbc6-c3fac3389b.zip b/.yarn/cache/@eslint-js-npm-9.22.0-c06a0bdefc-2d7725f29e.zip similarity index 58% rename from .yarn/cache/@eslint-js-npm-9.9.1-8b7ff1cbc6-c3fac3389b.zip rename to .yarn/cache/@eslint-js-npm-9.22.0-c06a0bdefc-2d7725f29e.zip index f04c9f8c8..8c4c02209 100644 Binary files a/.yarn/cache/@eslint-js-npm-9.9.1-8b7ff1cbc6-c3fac3389b.zip and b/.yarn/cache/@eslint-js-npm-9.22.0-c06a0bdefc-2d7725f29e.zip differ diff --git a/.yarn/cache/@eslint-object-schema-npm-2.1.4-0546250476-221e8d9f28.zip b/.yarn/cache/@eslint-object-schema-npm-2.1.6-a777ee59e8-266085c8d3.zip similarity index 61% rename from .yarn/cache/@eslint-object-schema-npm-2.1.4-0546250476-221e8d9f28.zip rename to .yarn/cache/@eslint-object-schema-npm-2.1.6-a777ee59e8-266085c8d3.zip index 2000881f6..c5249f0ea 100644 Binary files a/.yarn/cache/@eslint-object-schema-npm-2.1.4-0546250476-221e8d9f28.zip and b/.yarn/cache/@eslint-object-schema-npm-2.1.6-a777ee59e8-266085c8d3.zip differ diff --git a/.yarn/cache/@eslint-plugin-kit-npm-0.2.7-c313bcf919-e932da4ff9.zip b/.yarn/cache/@eslint-plugin-kit-npm-0.2.7-c313bcf919-e932da4ff9.zip new file mode 100644 index 000000000..2f226b844 Binary files /dev/null and b/.yarn/cache/@eslint-plugin-kit-npm-0.2.7-c313bcf919-e932da4ff9.zip differ diff --git a/.yarn/cache/@humanfs-core-npm-0.19.1-e2e7aaeb6e-270d936be4.zip b/.yarn/cache/@humanfs-core-npm-0.19.1-e2e7aaeb6e-270d936be4.zip new file mode 100644 index 000000000..0d6b53899 Binary files /dev/null and b/.yarn/cache/@humanfs-core-npm-0.19.1-e2e7aaeb6e-270d936be4.zip differ diff --git a/.yarn/cache/@humanfs-node-npm-0.16.6-6ee2cad587-6d43c67274.zip b/.yarn/cache/@humanfs-node-npm-0.16.6-6ee2cad587-6d43c67274.zip new file mode 100644 index 000000000..a1296d513 Binary files /dev/null and b/.yarn/cache/@humanfs-node-npm-0.16.6-6ee2cad587-6d43c67274.zip differ diff --git a/.yarn/cache/@humanwhocodes-retry-npm-0.4.2-78a05c1b69-8910c4cdf8.zip b/.yarn/cache/@humanwhocodes-retry-npm-0.4.2-78a05c1b69-8910c4cdf8.zip new file mode 100644 index 000000000..cd48ae6bf Binary files /dev/null and b/.yarn/cache/@humanwhocodes-retry-npm-0.4.2-78a05c1b69-8910c4cdf8.zip differ diff --git a/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-89960ac087.zip b/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-89960ac087.zip deleted file mode 100644 index 201c95110..000000000 Binary files a/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.4.15-a055fb62cf-89960ac087.zip and /dev/null differ diff --git a/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.5.0-dfd9126d71-4ed6123217.zip b/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.5.0-dfd9126d71-4ed6123217.zip new file mode 100644 index 000000000..2190c972a Binary files /dev/null and b/.yarn/cache/@jridgewell-sourcemap-codec-npm-1.5.0-dfd9126d71-4ed6123217.zip differ diff --git a/.yarn/cache/@lerna-create-npm-8.1.8-b6dc6c6054-810df5d353.zip b/.yarn/cache/@lerna-create-npm-8.1.8-b6dc6c6054-810df5d353.zip deleted file mode 100644 index db6f4455b..000000000 Binary files a/.yarn/cache/@lerna-create-npm-8.1.8-b6dc6c6054-810df5d353.zip and /dev/null differ diff --git a/.yarn/cache/@lerna-create-npm-8.2.1-1fc7a8e094-802db88eda.zip b/.yarn/cache/@lerna-create-npm-8.2.1-1fc7a8e094-802db88eda.zip new file mode 100644 index 000000000..bd744b75c Binary files /dev/null and b/.yarn/cache/@lerna-create-npm-8.2.1-1fc7a8e094-802db88eda.zip differ diff --git a/.yarn/cache/@loaderkit-resolve-npm-1.0.3-757889f81e-58a79d1b34.zip b/.yarn/cache/@loaderkit-resolve-npm-1.0.3-757889f81e-58a79d1b34.zip new file mode 100644 index 000000000..9ba7ca8ff Binary files /dev/null and b/.yarn/cache/@loaderkit-resolve-npm-1.0.3-757889f81e-58a79d1b34.zip differ diff --git a/.yarn/cache/@napi-rs-wasm-runtime-npm-0.2.4-bc75480c68-af335867ec.zip b/.yarn/cache/@napi-rs-wasm-runtime-npm-0.2.4-bc75480c68-af335867ec.zip new file mode 100644 index 000000000..13749f70e Binary files /dev/null and b/.yarn/cache/@napi-rs-wasm-runtime-npm-0.2.4-bc75480c68-af335867ec.zip differ diff --git a/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip b/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip deleted file mode 100644 index 79245108f..000000000 Binary files a/.yarn/cache/@npmcli-fs-npm-3.1.0-0844a57978-f3a7ab3a31.zip and /dev/null differ diff --git a/.yarn/cache/@npmcli-installed-package-contents-npm-2.0.2-99564e3824-4598a97e3d.zip b/.yarn/cache/@npmcli-installed-package-contents-npm-2.0.2-99564e3824-4598a97e3d.zip deleted file mode 100644 index 8503e33f0..000000000 Binary files a/.yarn/cache/@npmcli-installed-package-contents-npm-2.0.2-99564e3824-4598a97e3d.zip and /dev/null differ diff --git a/.yarn/cache/@nrwl-devkit-npm-19.0.4-eb9b7a1872-bdf8e67100.zip b/.yarn/cache/@nrwl-devkit-npm-19.0.4-eb9b7a1872-bdf8e67100.zip deleted file mode 100644 index 1617e4e0c..000000000 Binary files a/.yarn/cache/@nrwl-devkit-npm-19.0.4-eb9b7a1872-bdf8e67100.zip and /dev/null differ diff --git a/.yarn/cache/@nrwl-tao-npm-19.0.4-d305ed56aa-1e5a40857a.zip b/.yarn/cache/@nrwl-tao-npm-19.0.4-d305ed56aa-1e5a40857a.zip deleted file mode 100644 index 82a67eba9..000000000 Binary files a/.yarn/cache/@nrwl-tao-npm-19.0.4-d305ed56aa-1e5a40857a.zip and /dev/null differ diff --git a/.yarn/cache/@nx-devkit-npm-19.0.4-5fbfbde442-98baaffce4.zip b/.yarn/cache/@nx-devkit-npm-19.0.4-5fbfbde442-98baaffce4.zip deleted file mode 100644 index 3dd03b99e..000000000 Binary files a/.yarn/cache/@nx-devkit-npm-19.0.4-5fbfbde442-98baaffce4.zip and /dev/null differ diff --git a/.yarn/cache/@nx-devkit-npm-20.0.8-f4779d84c4-f9bb3c3d8a.zip b/.yarn/cache/@nx-devkit-npm-20.0.8-f4779d84c4-f9bb3c3d8a.zip new file mode 100644 index 000000000..0ce85f92e Binary files /dev/null and b/.yarn/cache/@nx-devkit-npm-20.0.8-f4779d84c4-f9bb3c3d8a.zip differ diff --git a/.yarn/cache/@nx-nx-darwin-arm64-npm-19.0.4-8ee7557685-10.zip b/.yarn/cache/@nx-nx-darwin-arm64-npm-19.0.4-8ee7557685-10.zip deleted file mode 100644 index d0a6e8edc..000000000 Binary files a/.yarn/cache/@nx-nx-darwin-arm64-npm-19.0.4-8ee7557685-10.zip and /dev/null differ diff --git a/.yarn/cache/@nx-nx-darwin-arm64-npm-20.0.8-6c1dbe1be3-10.zip b/.yarn/cache/@nx-nx-darwin-arm64-npm-20.0.8-6c1dbe1be3-10.zip new file mode 100644 index 000000000..1fece5391 Binary files /dev/null and b/.yarn/cache/@nx-nx-darwin-arm64-npm-20.0.8-6c1dbe1be3-10.zip differ diff --git a/.yarn/cache/@nx-nx-darwin-x64-npm-19.0.4-1985731048-10.zip b/.yarn/cache/@nx-nx-darwin-x64-npm-19.0.4-1985731048-10.zip deleted file mode 100644 index 1aeafe169..000000000 Binary files a/.yarn/cache/@nx-nx-darwin-x64-npm-19.0.4-1985731048-10.zip and /dev/null differ diff --git a/.yarn/cache/@nx-nx-darwin-x64-npm-20.0.8-1b3a345236-10.zip b/.yarn/cache/@nx-nx-darwin-x64-npm-20.0.8-1b3a345236-10.zip new file mode 100644 index 000000000..d2a2bb22d Binary files /dev/null and b/.yarn/cache/@nx-nx-darwin-x64-npm-20.0.8-1b3a345236-10.zip differ diff --git a/.yarn/cache/@nx-nx-linux-arm64-gnu-npm-19.0.4-d34706a7b7-10.zip b/.yarn/cache/@nx-nx-linux-arm64-gnu-npm-19.0.4-d34706a7b7-10.zip deleted file mode 100644 index 197b5ccd2..000000000 Binary files a/.yarn/cache/@nx-nx-linux-arm64-gnu-npm-19.0.4-d34706a7b7-10.zip and /dev/null differ diff --git a/.yarn/cache/@nx-nx-linux-arm64-gnu-npm-20.0.8-5c1d9a5d5c-10.zip b/.yarn/cache/@nx-nx-linux-arm64-gnu-npm-20.0.8-5c1d9a5d5c-10.zip new file mode 100644 index 000000000..637237bb6 Binary files /dev/null and b/.yarn/cache/@nx-nx-linux-arm64-gnu-npm-20.0.8-5c1d9a5d5c-10.zip differ diff --git a/.yarn/cache/@nx-nx-linux-x64-gnu-npm-19.0.4-bf8eb8d432-10.zip b/.yarn/cache/@nx-nx-linux-x64-gnu-npm-19.0.4-bf8eb8d432-10.zip deleted file mode 100644 index f465f4011..000000000 Binary files a/.yarn/cache/@nx-nx-linux-x64-gnu-npm-19.0.4-bf8eb8d432-10.zip and /dev/null differ diff --git a/.yarn/cache/@nx-nx-linux-x64-gnu-npm-20.0.8-c85f313eea-10.zip b/.yarn/cache/@nx-nx-linux-x64-gnu-npm-20.0.8-c85f313eea-10.zip new file mode 100644 index 000000000..572fdb5ee Binary files /dev/null and b/.yarn/cache/@nx-nx-linux-x64-gnu-npm-20.0.8-c85f313eea-10.zip differ diff --git a/.yarn/cache/@nx-nx-win32-arm64-msvc-npm-19.0.4-53691cecf2-10.zip b/.yarn/cache/@nx-nx-win32-arm64-msvc-npm-19.0.4-53691cecf2-10.zip deleted file mode 100644 index d5ae5213c..000000000 Binary files a/.yarn/cache/@nx-nx-win32-arm64-msvc-npm-19.0.4-53691cecf2-10.zip and /dev/null differ diff --git a/.yarn/cache/@nx-nx-win32-arm64-msvc-npm-20.0.8-34e7df6e9e-10.zip b/.yarn/cache/@nx-nx-win32-arm64-msvc-npm-20.0.8-34e7df6e9e-10.zip new file mode 100644 index 000000000..70e699eb7 Binary files /dev/null and b/.yarn/cache/@nx-nx-win32-arm64-msvc-npm-20.0.8-34e7df6e9e-10.zip differ diff --git a/.yarn/cache/@nx-nx-win32-x64-msvc-npm-19.0.4-61be650a13-10.zip b/.yarn/cache/@nx-nx-win32-x64-msvc-npm-19.0.4-61be650a13-10.zip deleted file mode 100644 index ae60c9495..000000000 Binary files a/.yarn/cache/@nx-nx-win32-x64-msvc-npm-19.0.4-61be650a13-10.zip and /dev/null differ diff --git a/.yarn/cache/@nx-nx-win32-x64-msvc-npm-20.0.8-acebb6832d-10.zip b/.yarn/cache/@nx-nx-win32-x64-msvc-npm-20.0.8-acebb6832d-10.zip new file mode 100644 index 000000000..7fd607c68 Binary files /dev/null and b/.yarn/cache/@nx-nx-win32-x64-msvc-npm-20.0.8-acebb6832d-10.zip differ diff --git a/.yarn/cache/@octokit-auth-token-npm-3.0.4-2b669244cb-8e21e567e3.zip b/.yarn/cache/@octokit-auth-token-npm-4.0.0-9ad78a752f-60e42701e3.zip similarity index 86% rename from .yarn/cache/@octokit-auth-token-npm-3.0.4-2b669244cb-8e21e567e3.zip rename to .yarn/cache/@octokit-auth-token-npm-4.0.0-9ad78a752f-60e42701e3.zip index 95af6565a..08e9cd2ff 100644 Binary files a/.yarn/cache/@octokit-auth-token-npm-3.0.4-2b669244cb-8e21e567e3.zip and b/.yarn/cache/@octokit-auth-token-npm-4.0.0-9ad78a752f-60e42701e3.zip differ diff --git a/.yarn/cache/@octokit-core-npm-4.2.4-25aeed316b-53ba8f990c.zip b/.yarn/cache/@octokit-core-npm-4.2.4-25aeed316b-53ba8f990c.zip deleted file mode 100644 index e10e17dbf..000000000 Binary files a/.yarn/cache/@octokit-core-npm-4.2.4-25aeed316b-53ba8f990c.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-core-npm-5.2.0-d30dcc079c-2e40baf0b5.zip b/.yarn/cache/@octokit-core-npm-5.2.0-d30dcc079c-2e40baf0b5.zip new file mode 100644 index 000000000..d7083ca56 Binary files /dev/null and b/.yarn/cache/@octokit-core-npm-5.2.0-d30dcc079c-2e40baf0b5.zip differ diff --git a/.yarn/cache/@octokit-endpoint-npm-7.0.6-ff8dba936f-e8b9cc09aa.zip b/.yarn/cache/@octokit-endpoint-npm-7.0.6-ff8dba936f-e8b9cc09aa.zip deleted file mode 100644 index 6dea76ea3..000000000 Binary files a/.yarn/cache/@octokit-endpoint-npm-7.0.6-ff8dba936f-e8b9cc09aa.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-endpoint-npm-9.0.6-7fb8efbd70-2bf7764233.zip b/.yarn/cache/@octokit-endpoint-npm-9.0.6-7fb8efbd70-2bf7764233.zip new file mode 100644 index 000000000..51eda3375 Binary files /dev/null and b/.yarn/cache/@octokit-endpoint-npm-9.0.6-7fb8efbd70-2bf7764233.zip differ diff --git a/.yarn/cache/@octokit-graphql-npm-5.0.6-26fb5b6074-6014690d18.zip b/.yarn/cache/@octokit-graphql-npm-5.0.6-26fb5b6074-6014690d18.zip deleted file mode 100644 index 733513e1e..000000000 Binary files a/.yarn/cache/@octokit-graphql-npm-5.0.6-26fb5b6074-6014690d18.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-graphql-npm-7.1.1-04e1c9067d-9a7a65fa84.zip b/.yarn/cache/@octokit-graphql-npm-7.1.1-04e1c9067d-9a7a65fa84.zip new file mode 100644 index 000000000..6e5ad16f1 Binary files /dev/null and b/.yarn/cache/@octokit-graphql-npm-7.1.1-04e1c9067d-9a7a65fa84.zip differ diff --git a/.yarn/cache/@octokit-openapi-types-npm-18.0.0-1586e405d6-5d4aa6abab.zip b/.yarn/cache/@octokit-openapi-types-npm-18.0.0-1586e405d6-5d4aa6abab.zip deleted file mode 100644 index adf5bda9d..000000000 Binary files a/.yarn/cache/@octokit-openapi-types-npm-18.0.0-1586e405d6-5d4aa6abab.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-openapi-types-npm-23.0.1-9110a4ae43-2647ae16bc.zip b/.yarn/cache/@octokit-openapi-types-npm-23.0.1-9110a4ae43-2647ae16bc.zip new file mode 100644 index 000000000..a412d12e6 Binary files /dev/null and b/.yarn/cache/@octokit-openapi-types-npm-23.0.1-9110a4ae43-2647ae16bc.zip differ diff --git a/.yarn/cache/@octokit-plugin-paginate-rest-npm-11.4.4-cjs.2-749142e7e5-e0f696b3b6.zip b/.yarn/cache/@octokit-plugin-paginate-rest-npm-11.4.4-cjs.2-749142e7e5-e0f696b3b6.zip new file mode 100644 index 000000000..a9616d071 Binary files /dev/null and b/.yarn/cache/@octokit-plugin-paginate-rest-npm-11.4.4-cjs.2-749142e7e5-e0f696b3b6.zip differ diff --git a/.yarn/cache/@octokit-plugin-paginate-rest-npm-6.1.2-3b2443d1e8-6d5b97fb44.zip b/.yarn/cache/@octokit-plugin-paginate-rest-npm-6.1.2-3b2443d1e8-6d5b97fb44.zip deleted file mode 100644 index cc01c305b..000000000 Binary files a/.yarn/cache/@octokit-plugin-paginate-rest-npm-6.1.2-3b2443d1e8-6d5b97fb44.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-plugin-request-log-npm-1.0.4-9ab5a2f888-2086db0005.zip b/.yarn/cache/@octokit-plugin-request-log-npm-1.0.4-9ab5a2f888-2086db0005.zip deleted file mode 100644 index 93a503644..000000000 Binary files a/.yarn/cache/@octokit-plugin-request-log-npm-1.0.4-9ab5a2f888-2086db0005.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-plugin-request-log-npm-4.0.1-bc9d8da84b-fd8c0a2014.zip b/.yarn/cache/@octokit-plugin-request-log-npm-4.0.1-bc9d8da84b-fd8c0a2014.zip new file mode 100644 index 000000000..baca4a2ef Binary files /dev/null and b/.yarn/cache/@octokit-plugin-request-log-npm-4.0.1-bc9d8da84b-fd8c0a2014.zip differ diff --git a/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-13.3.2-cjs.1-0addfb2ebb-479827e624.zip b/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-13.3.2-cjs.1-0addfb2ebb-479827e624.zip new file mode 100644 index 000000000..c16583a6b Binary files /dev/null and b/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-13.3.2-cjs.1-0addfb2ebb-479827e624.zip differ diff --git a/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-7.2.3-c54ecf5d8d-59fb4e786a.zip b/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-7.2.3-c54ecf5d8d-59fb4e786a.zip deleted file mode 100644 index 9545ce756..000000000 Binary files a/.yarn/cache/@octokit-plugin-rest-endpoint-methods-npm-7.2.3-c54ecf5d8d-59fb4e786a.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-request-error-npm-3.0.3-cbba4d6220-5db0b51473.zip b/.yarn/cache/@octokit-request-error-npm-3.0.3-cbba4d6220-5db0b51473.zip deleted file mode 100644 index a8ffdc9c0..000000000 Binary files a/.yarn/cache/@octokit-request-error-npm-3.0.3-cbba4d6220-5db0b51473.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-request-error-npm-5.1.1-f22d0f5771-6ad9862640.zip b/.yarn/cache/@octokit-request-error-npm-5.1.1-f22d0f5771-6ad9862640.zip new file mode 100644 index 000000000..cd0a132ea Binary files /dev/null and b/.yarn/cache/@octokit-request-error-npm-5.1.1-f22d0f5771-6ad9862640.zip differ diff --git a/.yarn/cache/@octokit-request-npm-6.2.8-fbcbb43713-47188fa08d.zip b/.yarn/cache/@octokit-request-npm-6.2.8-fbcbb43713-47188fa08d.zip deleted file mode 100644 index 807d94b6d..000000000 Binary files a/.yarn/cache/@octokit-request-npm-6.2.8-fbcbb43713-47188fa08d.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-request-npm-8.4.1-674ea8d5da-2b2c9131cc.zip b/.yarn/cache/@octokit-request-npm-8.4.1-674ea8d5da-2b2c9131cc.zip new file mode 100644 index 000000000..c9f3d8d23 Binary files /dev/null and b/.yarn/cache/@octokit-request-npm-8.4.1-674ea8d5da-2b2c9131cc.zip differ diff --git a/.yarn/cache/@octokit-rest-npm-19.0.11-6a50f10c37-c9b15de6b5.zip b/.yarn/cache/@octokit-rest-npm-19.0.11-6a50f10c37-c9b15de6b5.zip deleted file mode 100644 index 7d2f77cd6..000000000 Binary files a/.yarn/cache/@octokit-rest-npm-19.0.11-6a50f10c37-c9b15de6b5.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-rest-npm-20.1.2-c7d56a5569-e0759fdbf1.zip b/.yarn/cache/@octokit-rest-npm-20.1.2-c7d56a5569-e0759fdbf1.zip new file mode 100644 index 000000000..eca97f06f Binary files /dev/null and b/.yarn/cache/@octokit-rest-npm-20.1.2-c7d56a5569-e0759fdbf1.zip differ diff --git a/.yarn/cache/@octokit-tsconfig-npm-1.0.2-abab4615e2-74d56f3e9f.zip b/.yarn/cache/@octokit-tsconfig-npm-1.0.2-abab4615e2-74d56f3e9f.zip deleted file mode 100644 index 412105bf0..000000000 Binary files a/.yarn/cache/@octokit-tsconfig-npm-1.0.2-abab4615e2-74d56f3e9f.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-types-npm-10.0.0-8ea850424d-6345e605d3.zip b/.yarn/cache/@octokit-types-npm-10.0.0-8ea850424d-6345e605d3.zip deleted file mode 100644 index 374cc3c9c..000000000 Binary files a/.yarn/cache/@octokit-types-npm-10.0.0-8ea850424d-6345e605d3.zip and /dev/null differ diff --git a/.yarn/cache/@octokit-types-npm-13.8.0-e28e37c196-7f260cd3f9.zip b/.yarn/cache/@octokit-types-npm-13.8.0-e28e37c196-7f260cd3f9.zip new file mode 100644 index 000000000..ebdec5767 Binary files /dev/null and b/.yarn/cache/@octokit-types-npm-13.8.0-e28e37c196-7f260cd3f9.zip differ diff --git a/.yarn/cache/@octokit-types-npm-9.3.2-0c1714b849-4bcd18850d.zip b/.yarn/cache/@octokit-types-npm-9.3.2-0c1714b849-4bcd18850d.zip deleted file mode 100644 index aec0d58dc..000000000 Binary files a/.yarn/cache/@octokit-types-npm-9.3.2-0c1714b849-4bcd18850d.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.14.0-c6fa5962b7-10.zip b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.14.0-c6fa5962b7-10.zip deleted file mode 100644 index f79a8cc30..000000000 Binary files a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.14.0-c6fa5962b7-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.31.0-ee75722306-10.zip b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.31.0-ee75722306-10.zip new file mode 100644 index 000000000..5876f3afe Binary files /dev/null and b/.yarn/cache/@rollup-rollup-darwin-arm64-npm-4.31.0-ee75722306-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.14.0-26e07850d9-10.zip b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.14.0-26e07850d9-10.zip deleted file mode 100644 index 0712cd5ad..000000000 Binary files a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.14.0-26e07850d9-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.31.0-477b2b244e-10.zip b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.31.0-477b2b244e-10.zip new file mode 100644 index 000000000..a78ab3858 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-darwin-x64-npm-4.31.0-477b2b244e-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.14.0-0bcd82f6ce-10.zip b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.14.0-0bcd82f6ce-10.zip deleted file mode 100644 index 2f6e48759..000000000 Binary files a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.14.0-0bcd82f6ce-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.31.0-8b777e4748-10.zip b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.31.0-8b777e4748-10.zip new file mode 100644 index 000000000..6ed69f925 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-linux-arm64-gnu-npm-4.31.0-8b777e4748-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.14.0-e0f86c20cc-10.zip b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.14.0-e0f86c20cc-10.zip deleted file mode 100644 index 0cbd026d0..000000000 Binary files a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.14.0-e0f86c20cc-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.31.0-be85a58c64-10.zip b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.31.0-be85a58c64-10.zip new file mode 100644 index 000000000..f7fdd6391 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-linux-x64-gnu-npm-4.31.0-be85a58c64-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-win32-arm64-msvc-npm-4.14.0-d374dae7b0-10.zip b/.yarn/cache/@rollup-rollup-win32-arm64-msvc-npm-4.14.0-d374dae7b0-10.zip deleted file mode 100644 index 790d8b745..000000000 Binary files a/.yarn/cache/@rollup-rollup-win32-arm64-msvc-npm-4.14.0-d374dae7b0-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-win32-arm64-msvc-npm-4.31.0-3e50bf5292-10.zip b/.yarn/cache/@rollup-rollup-win32-arm64-msvc-npm-4.31.0-3e50bf5292-10.zip new file mode 100644 index 000000000..87ec982cd Binary files /dev/null and b/.yarn/cache/@rollup-rollup-win32-arm64-msvc-npm-4.31.0-3e50bf5292-10.zip differ diff --git a/.yarn/cache/@rollup-rollup-win32-x64-msvc-npm-4.14.0-c56f206651-10.zip b/.yarn/cache/@rollup-rollup-win32-x64-msvc-npm-4.14.0-c56f206651-10.zip deleted file mode 100644 index fde451051..000000000 Binary files a/.yarn/cache/@rollup-rollup-win32-x64-msvc-npm-4.14.0-c56f206651-10.zip and /dev/null differ diff --git a/.yarn/cache/@rollup-rollup-win32-x64-msvc-npm-4.31.0-edbfbd7621-10.zip b/.yarn/cache/@rollup-rollup-win32-x64-msvc-npm-4.31.0-edbfbd7621-10.zip new file mode 100644 index 000000000..ae657f735 Binary files /dev/null and b/.yarn/cache/@rollup-rollup-win32-x64-msvc-npm-4.31.0-edbfbd7621-10.zip differ diff --git a/.yarn/cache/@sindresorhus-tsconfig-npm-6.0.0-35334268c7-6971cea362.zip b/.yarn/cache/@sindresorhus-tsconfig-npm-6.0.0-35334268c7-6971cea362.zip deleted file mode 100644 index 9e9f2b5c6..000000000 Binary files a/.yarn/cache/@sindresorhus-tsconfig-npm-6.0.0-35334268c7-6971cea362.zip and /dev/null differ diff --git a/.yarn/cache/@sindresorhus-tsconfig-npm-7.0.0-9dbb238291-ecd39a526c.zip b/.yarn/cache/@sindresorhus-tsconfig-npm-7.0.0-9dbb238291-ecd39a526c.zip new file mode 100644 index 000000000..e0b2c7fe0 Binary files /dev/null and b/.yarn/cache/@sindresorhus-tsconfig-npm-7.0.0-9dbb238291-ecd39a526c.zip differ diff --git a/.yarn/cache/@tybys-wasm-util-npm-0.9.0-5f9b6b37b1-aa58e64753.zip b/.yarn/cache/@tybys-wasm-util-npm-0.9.0-5f9b6b37b1-aa58e64753.zip new file mode 100644 index 000000000..60d4d6838 Binary files /dev/null and b/.yarn/cache/@tybys-wasm-util-npm-0.9.0-5f9b6b37b1-aa58e64753.zip differ diff --git a/.yarn/cache/@types-estree-npm-1.0.5-5b7faed3b4-7de6d928dd.zip b/.yarn/cache/@types-estree-npm-1.0.6-b5e23f2ea2-9d35d47509.zip similarity index 55% rename from .yarn/cache/@types-estree-npm-1.0.5-5b7faed3b4-7de6d928dd.zip rename to .yarn/cache/@types-estree-npm-1.0.6-b5e23f2ea2-9d35d47509.zip index 022b94a11..4eb7ed54c 100644 Binary files a/.yarn/cache/@types-estree-npm-1.0.5-5b7faed3b4-7de6d928dd.zip and b/.yarn/cache/@types-estree-npm-1.0.6-b5e23f2ea2-9d35d47509.zip differ diff --git a/.yarn/cache/@types-json-schema-npm-7.0.15-fd16381786-1a3c3e0623.zip b/.yarn/cache/@types-json-schema-npm-7.0.15-fd16381786-1a3c3e0623.zip new file mode 100644 index 000000000..681120149 Binary files /dev/null and b/.yarn/cache/@types-json-schema-npm-7.0.15-fd16381786-1a3c3e0623.zip differ diff --git a/.yarn/cache/@types-node-npm-22.13.10-af5336e62b-57dc6a5e01.zip b/.yarn/cache/@types-node-npm-22.13.10-af5336e62b-57dc6a5e01.zip new file mode 100644 index 000000000..e3a71fe9b Binary files /dev/null and b/.yarn/cache/@types-node-npm-22.13.10-af5336e62b-57dc6a5e01.zip differ diff --git a/.yarn/cache/@types-node-npm-22.13.5-4c5912eee2-a69ec8dba3.zip b/.yarn/cache/@types-node-npm-22.13.5-4c5912eee2-a69ec8dba3.zip new file mode 100644 index 000000000..2dae053b6 Binary files /dev/null and b/.yarn/cache/@types-node-npm-22.13.5-4c5912eee2-a69ec8dba3.zip differ diff --git a/.yarn/cache/@types-node-npm-22.5.0-1eb4d725ff-89af3bd217.zip b/.yarn/cache/@types-node-npm-22.5.0-1eb4d725ff-89af3bd217.zip deleted file mode 100644 index 7cd907c82..000000000 Binary files a/.yarn/cache/@types-node-npm-22.5.0-1eb4d725ff-89af3bd217.zip and /dev/null differ diff --git a/.yarn/cache/@types-node-npm-22.5.2-430cf418f9-c4634118ab.zip b/.yarn/cache/@types-node-npm-22.5.2-430cf418f9-c4634118ab.zip deleted file mode 100644 index 36e36f731..000000000 Binary files a/.yarn/cache/@types-node-npm-22.5.2-430cf418f9-c4634118ab.zip and /dev/null differ diff --git a/.yarn/cache/@types-normalize-package-data-npm-2.4.4-676a8ba353-65dff72b54.zip b/.yarn/cache/@types-normalize-package-data-npm-2.4.4-676a8ba353-65dff72b54.zip new file mode 100644 index 000000000..58fbb0048 Binary files /dev/null and b/.yarn/cache/@types-normalize-package-data-npm-2.4.4-676a8ba353-65dff72b54.zip differ diff --git a/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.26.0-64bda8e44c-5a3d244517.zip b/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.26.0-64bda8e44c-5a3d244517.zip new file mode 100644 index 000000000..ac8b41617 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.26.0-64bda8e44c-5a3d244517.zip differ diff --git a/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.3.0-0ae1076b80-00dc713450.zip b/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.3.0-0ae1076b80-00dc713450.zip deleted file mode 100644 index ed2414080..000000000 Binary files a/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.3.0-0ae1076b80-00dc713450.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-parser-npm-8.26.0-80aadd4d9c-86843d488b.zip b/.yarn/cache/@typescript-eslint-parser-npm-8.26.0-80aadd4d9c-86843d488b.zip new file mode 100644 index 000000000..a6f788cc9 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-parser-npm-8.26.0-80aadd4d9c-86843d488b.zip differ diff --git a/.yarn/cache/@typescript-eslint-parser-npm-8.3.0-7d3122e7ab-627e8d0b33.zip b/.yarn/cache/@typescript-eslint-parser-npm-8.3.0-7d3122e7ab-627e8d0b33.zip deleted file mode 100644 index 106ad7f30..000000000 Binary files a/.yarn/cache/@typescript-eslint-parser-npm-8.3.0-7d3122e7ab-627e8d0b33.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-scope-manager-npm-8.26.0-ef399f862d-beccc5c0a8.zip b/.yarn/cache/@typescript-eslint-scope-manager-npm-8.26.0-ef399f862d-beccc5c0a8.zip new file mode 100644 index 000000000..3348b005d Binary files /dev/null and b/.yarn/cache/@typescript-eslint-scope-manager-npm-8.26.0-ef399f862d-beccc5c0a8.zip differ diff --git a/.yarn/cache/@typescript-eslint-scope-manager-npm-8.3.0-3c8dd1afa1-ce56dbd826.zip b/.yarn/cache/@typescript-eslint-scope-manager-npm-8.3.0-3c8dd1afa1-ce56dbd826.zip deleted file mode 100644 index e7a0cb0d8..000000000 Binary files a/.yarn/cache/@typescript-eslint-scope-manager-npm-8.3.0-3c8dd1afa1-ce56dbd826.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-type-utils-npm-8.26.0-f34f57bfb3-cc383418bd.zip b/.yarn/cache/@typescript-eslint-type-utils-npm-8.26.0-f34f57bfb3-cc383418bd.zip new file mode 100644 index 000000000..0fa101d25 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-type-utils-npm-8.26.0-f34f57bfb3-cc383418bd.zip differ diff --git a/.yarn/cache/@typescript-eslint-type-utils-npm-8.3.0-1a0a160937-70dac55d8d.zip b/.yarn/cache/@typescript-eslint-type-utils-npm-8.3.0-1a0a160937-70dac55d8d.zip deleted file mode 100644 index e4761521a..000000000 Binary files a/.yarn/cache/@typescript-eslint-type-utils-npm-8.3.0-1a0a160937-70dac55d8d.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-types-npm-8.26.0-6090977dc6-2fcd2eed05.zip b/.yarn/cache/@typescript-eslint-types-npm-8.26.0-6090977dc6-2fcd2eed05.zip new file mode 100644 index 000000000..1c5efea52 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-types-npm-8.26.0-6090977dc6-2fcd2eed05.zip differ diff --git a/.yarn/cache/@typescript-eslint-types-npm-8.3.0-11406c6bf2-0265f6b699.zip b/.yarn/cache/@typescript-eslint-types-npm-8.3.0-11406c6bf2-0265f6b699.zip deleted file mode 100644 index e6be7fa30..000000000 Binary files a/.yarn/cache/@typescript-eslint-types-npm-8.3.0-11406c6bf2-0265f6b699.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.26.0-352c786ebb-f50101c138.zip b/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.26.0-352c786ebb-f50101c138.zip new file mode 100644 index 000000000..efe8215f6 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.26.0-352c786ebb-f50101c138.zip differ diff --git a/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.3.0-c590ea2cb7-61243c9251.zip b/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.3.0-c590ea2cb7-61243c9251.zip deleted file mode 100644 index 60372b3c1..000000000 Binary files a/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.3.0-c590ea2cb7-61243c9251.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-utils-npm-8.26.0-50b78242aa-69b5ace76c.zip b/.yarn/cache/@typescript-eslint-utils-npm-8.26.0-50b78242aa-69b5ace76c.zip new file mode 100644 index 000000000..4feaa0e2e Binary files /dev/null and b/.yarn/cache/@typescript-eslint-utils-npm-8.26.0-50b78242aa-69b5ace76c.zip differ diff --git a/.yarn/cache/@typescript-eslint-utils-npm-8.3.0-76b00c816e-9d3494c15f.zip b/.yarn/cache/@typescript-eslint-utils-npm-8.3.0-76b00c816e-9d3494c15f.zip deleted file mode 100644 index f7b44b6db..000000000 Binary files a/.yarn/cache/@typescript-eslint-utils-npm-8.3.0-76b00c816e-9d3494c15f.zip and /dev/null differ diff --git a/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.26.0-ff1c3f4568-8800c84d71.zip b/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.26.0-ff1c3f4568-8800c84d71.zip new file mode 100644 index 000000000..8c8c63242 Binary files /dev/null and b/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.26.0-ff1c3f4568-8800c84d71.zip differ diff --git a/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.3.0-324a7124f6-4ee45dd258.zip b/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.3.0-324a7124f6-4ee45dd258.zip deleted file mode 100644 index 43bd9a4f7..000000000 Binary files a/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.3.0-324a7124f6-4ee45dd258.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-coverage-v8-npm-2.0.5-76bd279454-bb774d1a52.zip b/.yarn/cache/@vitest-coverage-v8-npm-2.0.5-76bd279454-bb774d1a52.zip deleted file mode 100644 index a14a7fc20..000000000 Binary files a/.yarn/cache/@vitest-coverage-v8-npm-2.0.5-76bd279454-bb774d1a52.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-coverage-v8-npm-3.0.8-bc508afd36-78d2349a9a.zip b/.yarn/cache/@vitest-coverage-v8-npm-3.0.8-bc508afd36-78d2349a9a.zip new file mode 100644 index 000000000..3cc964e85 Binary files /dev/null and b/.yarn/cache/@vitest-coverage-v8-npm-3.0.8-bc508afd36-78d2349a9a.zip differ diff --git a/.yarn/cache/@vitest-expect-npm-2.0.5-8933466cce-ca9a218f50.zip b/.yarn/cache/@vitest-expect-npm-2.0.5-8933466cce-ca9a218f50.zip deleted file mode 100644 index 15ce7ec0b..000000000 Binary files a/.yarn/cache/@vitest-expect-npm-2.0.5-8933466cce-ca9a218f50.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-expect-npm-3.0.8-32123e91d4-6cb8a707ff.zip b/.yarn/cache/@vitest-expect-npm-3.0.8-32123e91d4-6cb8a707ff.zip new file mode 100644 index 000000000..a72b53d59 Binary files /dev/null and b/.yarn/cache/@vitest-expect-npm-3.0.8-32123e91d4-6cb8a707ff.zip differ diff --git a/.yarn/cache/@vitest-mocker-npm-3.0.8-ea33f17571-456cafc5c2.zip b/.yarn/cache/@vitest-mocker-npm-3.0.8-ea33f17571-456cafc5c2.zip new file mode 100644 index 000000000..485f5e7ec Binary files /dev/null and b/.yarn/cache/@vitest-mocker-npm-3.0.8-ea33f17571-456cafc5c2.zip differ diff --git a/.yarn/cache/@vitest-pretty-format-npm-2.0.5-73dd679ebd-70bf452dd0.zip b/.yarn/cache/@vitest-pretty-format-npm-2.0.5-73dd679ebd-70bf452dd0.zip deleted file mode 100644 index 2c6186ea6..000000000 Binary files a/.yarn/cache/@vitest-pretty-format-npm-2.0.5-73dd679ebd-70bf452dd0.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-pretty-format-npm-3.0.8-0de8454daf-255a7929e8.zip b/.yarn/cache/@vitest-pretty-format-npm-3.0.8-0de8454daf-255a7929e8.zip new file mode 100644 index 000000000..7b93ab281 Binary files /dev/null and b/.yarn/cache/@vitest-pretty-format-npm-3.0.8-0de8454daf-255a7929e8.zip differ diff --git a/.yarn/cache/@vitest-runner-npm-2.0.5-1cea49b66e-464449abb8.zip b/.yarn/cache/@vitest-runner-npm-2.0.5-1cea49b66e-464449abb8.zip deleted file mode 100644 index 3a18ce1ac..000000000 Binary files a/.yarn/cache/@vitest-runner-npm-2.0.5-1cea49b66e-464449abb8.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-runner-npm-3.0.8-4875bb436d-d1c3661ed1.zip b/.yarn/cache/@vitest-runner-npm-3.0.8-4875bb436d-d1c3661ed1.zip new file mode 100644 index 000000000..71f1c5d0f Binary files /dev/null and b/.yarn/cache/@vitest-runner-npm-3.0.8-4875bb436d-d1c3661ed1.zip differ diff --git a/.yarn/cache/@vitest-snapshot-npm-2.0.5-c39dddeaac-fb46bc6585.zip b/.yarn/cache/@vitest-snapshot-npm-2.0.5-c39dddeaac-fb46bc6585.zip deleted file mode 100644 index 1d2ba68ca..000000000 Binary files a/.yarn/cache/@vitest-snapshot-npm-2.0.5-c39dddeaac-fb46bc6585.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-snapshot-npm-3.0.8-5d7987dd3a-61b66ca6a3.zip b/.yarn/cache/@vitest-snapshot-npm-3.0.8-5d7987dd3a-61b66ca6a3.zip new file mode 100644 index 000000000..4f237bfd0 Binary files /dev/null and b/.yarn/cache/@vitest-snapshot-npm-3.0.8-5d7987dd3a-61b66ca6a3.zip differ diff --git a/.yarn/cache/@vitest-spy-npm-2.0.5-4a3ebb3c4b-ed19f4c3bb.zip b/.yarn/cache/@vitest-spy-npm-2.0.5-4a3ebb3c4b-ed19f4c3bb.zip deleted file mode 100644 index b4c833f18..000000000 Binary files a/.yarn/cache/@vitest-spy-npm-2.0.5-4a3ebb3c4b-ed19f4c3bb.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-spy-npm-3.0.8-2afe63812e-a6be428ced.zip b/.yarn/cache/@vitest-spy-npm-3.0.8-2afe63812e-a6be428ced.zip new file mode 100644 index 000000000..42e593ff4 Binary files /dev/null and b/.yarn/cache/@vitest-spy-npm-3.0.8-2afe63812e-a6be428ced.zip differ diff --git a/.yarn/cache/@vitest-ui-npm-2.0.5-69de04f301-ef07017386.zip b/.yarn/cache/@vitest-ui-npm-2.0.5-69de04f301-ef07017386.zip deleted file mode 100644 index 895f4e07c..000000000 Binary files a/.yarn/cache/@vitest-ui-npm-2.0.5-69de04f301-ef07017386.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-ui-npm-3.0.8-aee3a789ee-d38c3ebf31.zip b/.yarn/cache/@vitest-ui-npm-3.0.8-aee3a789ee-d38c3ebf31.zip new file mode 100644 index 000000000..98965baf9 Binary files /dev/null and b/.yarn/cache/@vitest-ui-npm-3.0.8-aee3a789ee-d38c3ebf31.zip differ diff --git a/.yarn/cache/@vitest-utils-npm-2.0.5-51ae52c47c-d631d56d29.zip b/.yarn/cache/@vitest-utils-npm-2.0.5-51ae52c47c-d631d56d29.zip deleted file mode 100644 index 5bbef8370..000000000 Binary files a/.yarn/cache/@vitest-utils-npm-2.0.5-51ae52c47c-d631d56d29.zip and /dev/null differ diff --git a/.yarn/cache/@vitest-utils-npm-3.0.8-354f16b8cb-207281dc59.zip b/.yarn/cache/@vitest-utils-npm-3.0.8-354f16b8cb-207281dc59.zip new file mode 100644 index 000000000..936284afd Binary files /dev/null and b/.yarn/cache/@vitest-utils-npm-3.0.8-354f16b8cb-207281dc59.zip differ diff --git a/.yarn/cache/@zkochan-js-yaml-npm-0.0.6-3eced3a388-1a079db8bc.zip b/.yarn/cache/@zkochan-js-yaml-npm-0.0.7-931c761308-83642debff.zip similarity index 88% rename from .yarn/cache/@zkochan-js-yaml-npm-0.0.6-3eced3a388-1a079db8bc.zip rename to .yarn/cache/@zkochan-js-yaml-npm-0.0.7-931c761308-83642debff.zip index bc8714e66..51a832677 100644 Binary files a/.yarn/cache/@zkochan-js-yaml-npm-0.0.6-3eced3a388-1a079db8bc.zip and b/.yarn/cache/@zkochan-js-yaml-npm-0.0.7-931c761308-83642debff.zip differ diff --git a/.yarn/cache/acorn-npm-8.11.3-0d7ab48b38-b688e7e3c6.zip b/.yarn/cache/acorn-npm-8.11.3-0d7ab48b38-b688e7e3c6.zip deleted file mode 100644 index 7cca3a275..000000000 Binary files a/.yarn/cache/acorn-npm-8.11.3-0d7ab48b38-b688e7e3c6.zip and /dev/null differ diff --git a/.yarn/cache/acorn-npm-8.12.0-10680c055b-550cc50331.zip b/.yarn/cache/acorn-npm-8.12.0-10680c055b-550cc50331.zip deleted file mode 100644 index e466b5ec2..000000000 Binary files a/.yarn/cache/acorn-npm-8.12.0-10680c055b-550cc50331.zip and /dev/null differ diff --git a/.yarn/cache/acorn-npm-8.14.0-dc46f61424-6df29c3555.zip b/.yarn/cache/acorn-npm-8.14.0-dc46f61424-6df29c3555.zip new file mode 100644 index 000000000..a32f020e1 Binary files /dev/null and b/.yarn/cache/acorn-npm-8.14.0-dc46f61424-6df29c3555.zip differ diff --git a/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip b/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip new file mode 100644 index 000000000..095ff2093 Binary files /dev/null and b/.yarn/cache/anymatch-npm-3.1.3-bc81d103b1-3e044fd6d1.zip differ diff --git a/.yarn/cache/axios-npm-1.7.4-cc1c89ddba-7a1429be1e.zip b/.yarn/cache/axios-npm-1.7.4-cc1c89ddba-7a1429be1e.zip deleted file mode 100644 index f9b072d12..000000000 Binary files a/.yarn/cache/axios-npm-1.7.4-cc1c89ddba-7a1429be1e.zip and /dev/null differ diff --git a/.yarn/cache/axios-npm-1.8.2-55671cda10-d432875812.zip b/.yarn/cache/axios-npm-1.8.2-55671cda10-d432875812.zip new file mode 100644 index 000000000..02017337a Binary files /dev/null and b/.yarn/cache/axios-npm-1.8.2-55671cda10-d432875812.zip differ diff --git a/.yarn/cache/binary-extensions-npm-2.3.0-bd3f20d865-bcad01494e.zip b/.yarn/cache/binary-extensions-npm-2.3.0-bd3f20d865-bcad01494e.zip new file mode 100644 index 000000000..94214c4b8 Binary files /dev/null and b/.yarn/cache/binary-extensions-npm-2.3.0-bd3f20d865-bcad01494e.zip differ diff --git a/.yarn/cache/browserslist-npm-4.23.0-8126a959d4-496c3862df.zip b/.yarn/cache/browserslist-npm-4.23.0-8126a959d4-496c3862df.zip deleted file mode 100644 index 01afb2452..000000000 Binary files a/.yarn/cache/browserslist-npm-4.23.0-8126a959d4-496c3862df.zip and /dev/null differ diff --git a/.yarn/cache/browserslist-npm-4.24.4-2fdeb5face-11fda105e8.zip b/.yarn/cache/browserslist-npm-4.24.4-2fdeb5face-11fda105e8.zip new file mode 100644 index 000000000..a4906b7b2 Binary files /dev/null and b/.yarn/cache/browserslist-npm-4.24.4-2fdeb5face-11fda105e8.zip differ diff --git a/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-62e063ab40.zip b/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-62e063ab40.zip deleted file mode 100644 index 103f85ded..000000000 Binary files a/.yarn/cache/builtin-modules-npm-3.3.0-db4f3d32de-62e063ab40.zip and /dev/null differ diff --git a/.yarn/cache/builtin-modules-npm-4.0.0-3b89bc8c8d-cea28dd8fa.zip b/.yarn/cache/builtin-modules-npm-4.0.0-3b89bc8c8d-cea28dd8fa.zip new file mode 100644 index 000000000..9bafa8314 Binary files /dev/null and b/.yarn/cache/builtin-modules-npm-4.0.0-3b89bc8c8d-cea28dd8fa.zip differ diff --git a/.yarn/cache/builtins-npm-5.0.1-6d4820dd76-90136fa0ba.zip b/.yarn/cache/builtins-npm-5.0.1-6d4820dd76-90136fa0ba.zip deleted file mode 100644 index 48aec5e1e..000000000 Binary files a/.yarn/cache/builtins-npm-5.0.1-6d4820dd76-90136fa0ba.zip and /dev/null differ diff --git a/.yarn/cache/cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip b/.yarn/cache/cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip deleted file mode 100644 index 10ac03740..000000000 Binary files a/.yarn/cache/cacache-npm-18.0.2-d6329a1b9d-5ca58464f7.zip and /dev/null differ diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001617-5cf8ee8c51-eac442b9ad.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001617-5cf8ee8c51-eac442b9ad.zip deleted file mode 100644 index f5ff955bc..000000000 Binary files a/.yarn/cache/caniuse-lite-npm-1.0.30001617-5cf8ee8c51-eac442b9ad.zip and /dev/null differ diff --git a/.yarn/cache/caniuse-lite-npm-1.0.30001701-136a9c0306-d121607a96.zip b/.yarn/cache/caniuse-lite-npm-1.0.30001701-136a9c0306-d121607a96.zip new file mode 100644 index 000000000..34e8ab122 Binary files /dev/null and b/.yarn/cache/caniuse-lite-npm-1.0.30001701-136a9c0306-d121607a96.zip differ diff --git a/.yarn/cache/chai-npm-5.1.1-2e09e40819-ee67279a56.zip b/.yarn/cache/chai-npm-5.1.1-2e09e40819-ee67279a56.zip deleted file mode 100644 index 378bf87b3..000000000 Binary files a/.yarn/cache/chai-npm-5.1.1-2e09e40819-ee67279a56.zip and /dev/null differ diff --git a/.yarn/cache/chai-npm-5.2.0-373e52d821-2ce03671c1.zip b/.yarn/cache/chai-npm-5.2.0-373e52d821-2ce03671c1.zip new file mode 100644 index 000000000..6802bae46 Binary files /dev/null and b/.yarn/cache/chai-npm-5.2.0-373e52d821-2ce03671c1.zip differ diff --git a/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip b/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip new file mode 100644 index 000000000..b21d3e799 Binary files /dev/null and b/.yarn/cache/chokidar-npm-3.6.0-3c413a828f-c327fb0770.zip differ diff --git a/.yarn/cache/ci-info-npm-4.1.0-f0fb92b1e5-546628efd0.zip b/.yarn/cache/ci-info-npm-4.1.0-f0fb92b1e5-546628efd0.zip new file mode 100644 index 000000000..db6b7cf5a Binary files /dev/null and b/.yarn/cache/ci-info-npm-4.1.0-f0fb92b1e5-546628efd0.zip differ diff --git a/.yarn/cache/cjs-module-lexer-npm-1.4.1-4a824480ac-6e830a1e00.zip b/.yarn/cache/cjs-module-lexer-npm-1.4.1-4a824480ac-6e830a1e00.zip new file mode 100644 index 000000000..82d580de9 Binary files /dev/null and b/.yarn/cache/cjs-module-lexer-npm-1.4.1-4a824480ac-6e830a1e00.zip differ diff --git a/.yarn/cache/cli-cursor-npm-5.0.0-444bec1bef-1eb9a3f878.zip b/.yarn/cache/cli-cursor-npm-5.0.0-444bec1bef-1eb9a3f878.zip deleted file mode 100644 index e79adf695..000000000 Binary files a/.yarn/cache/cli-cursor-npm-5.0.0-444bec1bef-1eb9a3f878.zip and /dev/null differ diff --git a/.yarn/cache/cli-table3-npm-0.6.3-1dca7f9152-8d82b75be7.zip b/.yarn/cache/cli-table3-npm-0.6.3-1dca7f9152-8d82b75be7.zip deleted file mode 100644 index 9aff15b10..000000000 Binary files a/.yarn/cache/cli-table3-npm-0.6.3-1dca7f9152-8d82b75be7.zip and /dev/null differ diff --git a/.yarn/cache/cli-truncate-npm-4.0.0-3113917cdb-d5149175fd.zip b/.yarn/cache/cli-truncate-npm-4.0.0-3113917cdb-d5149175fd.zip deleted file mode 100644 index 88229c815..000000000 Binary files a/.yarn/cache/cli-truncate-npm-4.0.0-3113917cdb-d5149175fd.zip and /dev/null differ diff --git a/.yarn/cache/colorette-npm-2.0.20-692d428726-0b8de48bfa.zip b/.yarn/cache/colorette-npm-2.0.20-692d428726-0b8de48bfa.zip deleted file mode 100644 index bf9dd71b4..000000000 Binary files a/.yarn/cache/colorette-npm-2.0.20-692d428726-0b8de48bfa.zip and /dev/null differ diff --git a/.yarn/cache/commander-npm-12.1.0-65c868e907-cdaeb672d9.zip b/.yarn/cache/commander-npm-12.1.0-65c868e907-cdaeb672d9.zip deleted file mode 100644 index 3299aa9bd..000000000 Binary files a/.yarn/cache/commander-npm-12.1.0-65c868e907-cdaeb672d9.zip and /dev/null differ diff --git a/.yarn/cache/core-js-compat-npm-3.37.0-9323d119db-5f33d7ba45.zip b/.yarn/cache/core-js-compat-npm-3.37.0-9323d119db-5f33d7ba45.zip deleted file mode 100644 index 2f6740057..000000000 Binary files a/.yarn/cache/core-js-compat-npm-3.37.0-9323d119db-5f33d7ba45.zip and /dev/null differ diff --git a/.yarn/cache/core-js-compat-npm-3.41.0-3a60c76839-a59da111fc.zip b/.yarn/cache/core-js-compat-npm-3.41.0-3a60c76839-a59da111fc.zip new file mode 100644 index 000000000..87bc2f8b0 Binary files /dev/null and b/.yarn/cache/core-js-compat-npm-3.41.0-3a60c76839-a59da111fc.zip differ diff --git a/.yarn/cache/cosmiconfig-npm-8.2.0-9b42f8a44e-e0b188f9a6.zip b/.yarn/cache/cosmiconfig-npm-8.2.0-9b42f8a44e-e0b188f9a6.zip deleted file mode 100644 index cff993a7a..000000000 Binary files a/.yarn/cache/cosmiconfig-npm-8.2.0-9b42f8a44e-e0b188f9a6.zip and /dev/null differ diff --git a/.yarn/cache/cosmiconfig-npm-9.0.0-47d78cf275-8bdf1dfbb6.zip b/.yarn/cache/cosmiconfig-npm-9.0.0-47d78cf275-8bdf1dfbb6.zip new file mode 100644 index 000000000..42026d71d Binary files /dev/null and b/.yarn/cache/cosmiconfig-npm-9.0.0-47d78cf275-8bdf1dfbb6.zip differ diff --git a/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-e1a13869d2.zip b/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-e1a13869d2.zip deleted file mode 100644 index 9aa6dc0d8..000000000 Binary files a/.yarn/cache/cross-spawn-npm-7.0.3-e4ff3e65b3-e1a13869d2.zip and /dev/null differ diff --git a/.yarn/cache/cross-spawn-npm-7.0.6-264bddf921-0d52657d7a.zip b/.yarn/cache/cross-spawn-npm-7.0.6-264bddf921-0d52657d7a.zip new file mode 100644 index 000000000..7553dce11 Binary files /dev/null and b/.yarn/cache/cross-spawn-npm-7.0.6-264bddf921-0d52657d7a.zip differ diff --git a/.yarn/cache/debug-npm-4.3.5-b5001f59b7-cb6eab424c.zip b/.yarn/cache/debug-npm-4.3.5-b5001f59b7-cb6eab424c.zip deleted file mode 100644 index c621a4c78..000000000 Binary files a/.yarn/cache/debug-npm-4.3.5-b5001f59b7-cb6eab424c.zip and /dev/null differ diff --git a/.yarn/cache/debug-npm-4.3.6-ecb233d831-d3adb9af7d.zip b/.yarn/cache/debug-npm-4.3.6-ecb233d831-d3adb9af7d.zip deleted file mode 100644 index 0cf40a116..000000000 Binary files a/.yarn/cache/debug-npm-4.3.6-ecb233d831-d3adb9af7d.zip and /dev/null differ diff --git a/.yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip b/.yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip new file mode 100644 index 000000000..5bce5f628 Binary files /dev/null and b/.yarn/cache/debug-npm-4.4.0-f6efe76023-1847944c2e.zip differ diff --git a/.yarn/cache/dotenv-expand-npm-10.0.0-fa5b032ad9-b41eb278bc.zip b/.yarn/cache/dotenv-expand-npm-10.0.0-fa5b032ad9-b41eb278bc.zip deleted file mode 100644 index 4da26c95d..000000000 Binary files a/.yarn/cache/dotenv-expand-npm-10.0.0-fa5b032ad9-b41eb278bc.zip and /dev/null differ diff --git a/.yarn/cache/dotenv-expand-npm-11.0.6-bb141097d1-8912aba44c.zip b/.yarn/cache/dotenv-expand-npm-11.0.6-bb141097d1-8912aba44c.zip new file mode 100644 index 000000000..f5ff612a8 Binary files /dev/null and b/.yarn/cache/dotenv-expand-npm-11.0.6-bb141097d1-8912aba44c.zip differ diff --git a/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-dbb778237e.zip b/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-dbb778237e.zip deleted file mode 100644 index 592331adb..000000000 Binary files a/.yarn/cache/dotenv-npm-16.3.1-e6d380a398-dbb778237e.zip and /dev/null differ diff --git a/.yarn/cache/dotenv-npm-16.4.5-bcb20eb95d-55a3134601.zip b/.yarn/cache/dotenv-npm-16.4.5-bcb20eb95d-55a3134601.zip new file mode 100644 index 000000000..37a9baf4b Binary files /dev/null and b/.yarn/cache/dotenv-npm-16.4.5-bcb20eb95d-55a3134601.zip differ diff --git a/.yarn/cache/electron-to-chromium-npm-1.4.763-ee873a602e-088c53acfe.zip b/.yarn/cache/electron-to-chromium-npm-1.4.763-ee873a602e-088c53acfe.zip deleted file mode 100644 index a902d262d..000000000 Binary files a/.yarn/cache/electron-to-chromium-npm-1.4.763-ee873a602e-088c53acfe.zip and /dev/null differ diff --git a/.yarn/cache/electron-to-chromium-npm-1.5.109-ea70b3cfa1-4f6bd5963a.zip b/.yarn/cache/electron-to-chromium-npm-1.5.109-ea70b3cfa1-4f6bd5963a.zip new file mode 100644 index 000000000..2b3cc81a1 Binary files /dev/null and b/.yarn/cache/electron-to-chromium-npm-1.5.109-ea70b3cfa1-4f6bd5963a.zip differ diff --git a/.yarn/cache/emoji-regex-npm-10.3.0-0c9fc2ef7f-b9b084ebe9.zip b/.yarn/cache/emoji-regex-npm-10.3.0-0c9fc2ef7f-b9b084ebe9.zip deleted file mode 100644 index 3a3a8b9c0..000000000 Binary files a/.yarn/cache/emoji-regex-npm-10.3.0-0c9fc2ef7f-b9b084ebe9.zip and /dev/null differ diff --git a/.yarn/cache/enhanced-resolve-npm-5.17.0-60a1d3bc46-8f7bf71537.zip b/.yarn/cache/enhanced-resolve-npm-5.17.1-296305b69f-e8e03cb7a4.zip similarity index 67% rename from .yarn/cache/enhanced-resolve-npm-5.17.0-60a1d3bc46-8f7bf71537.zip rename to .yarn/cache/enhanced-resolve-npm-5.17.1-296305b69f-e8e03cb7a4.zip index 7c44fbfd5..0f2dcc5c2 100644 Binary files a/.yarn/cache/enhanced-resolve-npm-5.17.0-60a1d3bc46-8f7bf71537.zip and b/.yarn/cache/enhanced-resolve-npm-5.17.1-296305b69f-e8e03cb7a4.zip differ diff --git a/.yarn/cache/es-module-lexer-npm-1.6.0-20500c26f6-807ee7020c.zip b/.yarn/cache/es-module-lexer-npm-1.6.0-20500c26f6-807ee7020c.zip new file mode 100644 index 000000000..52ece1bee Binary files /dev/null and b/.yarn/cache/es-module-lexer-npm-1.6.0-20500c26f6-807ee7020c.zip differ diff --git a/.yarn/cache/esbuild-npm-0.20.2-1923187a7f-663215ab7e.zip b/.yarn/cache/esbuild-npm-0.20.2-1923187a7f-663215ab7e.zip deleted file mode 100644 index b12369ad5..000000000 Binary files a/.yarn/cache/esbuild-npm-0.20.2-1923187a7f-663215ab7e.zip and /dev/null differ diff --git a/.yarn/cache/esbuild-npm-0.24.2-0dcfc14be5-95425071c9.zip b/.yarn/cache/esbuild-npm-0.24.2-0dcfc14be5-95425071c9.zip new file mode 100644 index 000000000..467f49bbc Binary files /dev/null and b/.yarn/cache/esbuild-npm-0.24.2-0dcfc14be5-95425071c9.zip differ diff --git a/.yarn/cache/escalade-npm-3.1.1-e02da076aa-afa618e733.zip b/.yarn/cache/escalade-npm-3.1.1-e02da076aa-afa618e733.zip deleted file mode 100644 index 54a29c543..000000000 Binary files a/.yarn/cache/escalade-npm-3.1.1-e02da076aa-afa618e733.zip and /dev/null differ diff --git a/.yarn/cache/escalade-npm-3.2.0-19b50dd48f-9d7169e396.zip b/.yarn/cache/escalade-npm-3.2.0-19b50dd48f-9d7169e396.zip new file mode 100644 index 000000000..a8ea564b2 Binary files /dev/null and b/.yarn/cache/escalade-npm-3.2.0-19b50dd48f-9d7169e396.zip differ diff --git a/.yarn/cache/eslint-compat-utils-npm-0.1.2-361c6992b1-8c27388948.zip b/.yarn/cache/eslint-compat-utils-npm-0.1.2-361c6992b1-8c27388948.zip deleted file mode 100644 index 8bb9bd44e..000000000 Binary files a/.yarn/cache/eslint-compat-utils-npm-0.1.2-361c6992b1-8c27388948.zip and /dev/null differ diff --git a/.yarn/cache/eslint-compat-utils-npm-0.5.1-f1f8ade49a-ac65ac1c61.zip b/.yarn/cache/eslint-compat-utils-npm-0.5.1-f1f8ade49a-ac65ac1c61.zip new file mode 100644 index 000000000..5fb652c74 Binary files /dev/null and b/.yarn/cache/eslint-compat-utils-npm-0.5.1-f1f8ade49a-ac65ac1c61.zip differ diff --git a/.yarn/cache/eslint-config-prettier-npm-10.1.1-e0da862702-e78e195a4f.zip b/.yarn/cache/eslint-config-prettier-npm-10.1.1-e0da862702-e78e195a4f.zip new file mode 100644 index 000000000..aca5fbe17 Binary files /dev/null and b/.yarn/cache/eslint-config-prettier-npm-10.1.1-e0da862702-e78e195a4f.zip differ diff --git a/.yarn/cache/eslint-config-prettier-npm-9.1.0-0e1fd42d7d-411e3b3b1c.zip b/.yarn/cache/eslint-config-prettier-npm-9.1.0-0e1fd42d7d-411e3b3b1c.zip deleted file mode 100644 index 6e471758b..000000000 Binary files a/.yarn/cache/eslint-config-prettier-npm-9.1.0-0e1fd42d7d-411e3b3b1c.zip and /dev/null differ diff --git a/.yarn/cache/eslint-npm-9.22.0-dd7abea6c7-0a21a46fb4.zip b/.yarn/cache/eslint-npm-9.22.0-dd7abea6c7-0a21a46fb4.zip new file mode 100644 index 000000000..9e1897709 Binary files /dev/null and b/.yarn/cache/eslint-npm-9.22.0-dd7abea6c7-0a21a46fb4.zip differ diff --git a/.yarn/cache/eslint-npm-9.9.1-3e7801f02c-d53dcfff39.zip b/.yarn/cache/eslint-npm-9.9.1-3e7801f02c-d53dcfff39.zip deleted file mode 100644 index def8b2c0b..000000000 Binary files a/.yarn/cache/eslint-npm-9.9.1-3e7801f02c-d53dcfff39.zip and /dev/null differ diff --git a/.yarn/cache/eslint-plugin-es-x-npm-7.5.0-77e84d6e5d-b0aa59e5a9.zip b/.yarn/cache/eslint-plugin-es-x-npm-7.8.0-8237bd972e-1df8d52c4f.zip similarity index 66% rename from .yarn/cache/eslint-plugin-es-x-npm-7.5.0-77e84d6e5d-b0aa59e5a9.zip rename to .yarn/cache/eslint-plugin-es-x-npm-7.8.0-8237bd972e-1df8d52c4f.zip index 69b151015..248740b37 100644 Binary files a/.yarn/cache/eslint-plugin-es-x-npm-7.5.0-77e84d6e5d-b0aa59e5a9.zip and b/.yarn/cache/eslint-plugin-es-x-npm-7.8.0-8237bd972e-1df8d52c4f.zip differ diff --git a/.yarn/cache/eslint-plugin-n-npm-17.10.2-43bc1ad7b1-c360e745b6.zip b/.yarn/cache/eslint-plugin-n-npm-17.10.2-43bc1ad7b1-c360e745b6.zip deleted file mode 100644 index 1a2a7d678..000000000 Binary files a/.yarn/cache/eslint-plugin-n-npm-17.10.2-43bc1ad7b1-c360e745b6.zip and /dev/null differ diff --git a/.yarn/cache/eslint-plugin-n-npm-17.16.2-9df74b3f8a-84bc5957f5.zip b/.yarn/cache/eslint-plugin-n-npm-17.16.2-9df74b3f8a-84bc5957f5.zip new file mode 100644 index 000000000..9e866662d Binary files /dev/null and b/.yarn/cache/eslint-plugin-n-npm-17.16.2-9df74b3f8a-84bc5957f5.zip differ diff --git a/.yarn/cache/eslint-plugin-prettier-npm-5.2.1-7057756a8d-10ddf68215.zip b/.yarn/cache/eslint-plugin-prettier-npm-5.2.1-7057756a8d-10ddf68215.zip deleted file mode 100644 index 872bc240f..000000000 Binary files a/.yarn/cache/eslint-plugin-prettier-npm-5.2.1-7057756a8d-10ddf68215.zip and /dev/null differ diff --git a/.yarn/cache/eslint-plugin-prettier-npm-5.2.3-b375609ede-6444a0b89f.zip b/.yarn/cache/eslint-plugin-prettier-npm-5.2.3-b375609ede-6444a0b89f.zip new file mode 100644 index 000000000..cce62fdf9 Binary files /dev/null and b/.yarn/cache/eslint-plugin-prettier-npm-5.2.3-b375609ede-6444a0b89f.zip differ diff --git a/.yarn/cache/eslint-plugin-unicorn-npm-55.0.0-3a26442294-ea2fe55c51.zip b/.yarn/cache/eslint-plugin-unicorn-npm-55.0.0-3a26442294-ea2fe55c51.zip deleted file mode 100644 index 99a15027c..000000000 Binary files a/.yarn/cache/eslint-plugin-unicorn-npm-55.0.0-3a26442294-ea2fe55c51.zip and /dev/null differ diff --git a/.yarn/cache/eslint-plugin-unicorn-npm-57.0.0-941475bf44-056dcca3ce.zip b/.yarn/cache/eslint-plugin-unicorn-npm-57.0.0-941475bf44-056dcca3ce.zip new file mode 100644 index 000000000..515e4fc63 Binary files /dev/null and b/.yarn/cache/eslint-plugin-unicorn-npm-57.0.0-941475bf44-056dcca3ce.zip differ diff --git a/.yarn/cache/eslint-scope-npm-8.0.2-984149bd64-d17c2e1ff4.zip b/.yarn/cache/eslint-scope-npm-8.0.2-984149bd64-d17c2e1ff4.zip deleted file mode 100644 index 802520257..000000000 Binary files a/.yarn/cache/eslint-scope-npm-8.0.2-984149bd64-d17c2e1ff4.zip and /dev/null differ diff --git a/.yarn/cache/eslint-scope-npm-8.3.0-2f4303c4f9-ee1ff009e9.zip b/.yarn/cache/eslint-scope-npm-8.3.0-2f4303c4f9-ee1ff009e9.zip new file mode 100644 index 000000000..81d8a5123 Binary files /dev/null and b/.yarn/cache/eslint-scope-npm-8.3.0-2f4303c4f9-ee1ff009e9.zip differ diff --git a/.yarn/cache/eslint-visitor-keys-npm-4.0.0-9098eefd77-c7617166e6.zip b/.yarn/cache/eslint-visitor-keys-npm-4.0.0-9098eefd77-c7617166e6.zip deleted file mode 100644 index 9d4d45b05..000000000 Binary files a/.yarn/cache/eslint-visitor-keys-npm-4.0.0-9098eefd77-c7617166e6.zip and /dev/null differ diff --git a/.yarn/cache/eslint-visitor-keys-npm-4.2.0-a591434af3-9651b3356b.zip b/.yarn/cache/eslint-visitor-keys-npm-4.2.0-a591434af3-9651b3356b.zip new file mode 100644 index 000000000..405b3e85d Binary files /dev/null and b/.yarn/cache/eslint-visitor-keys-npm-4.2.0-a591434af3-9651b3356b.zip differ diff --git a/.yarn/cache/espree-npm-10.0.1-1d04a36678-557d6cfb48.zip b/.yarn/cache/espree-npm-10.0.1-1d04a36678-557d6cfb48.zip deleted file mode 100644 index be94427b9..000000000 Binary files a/.yarn/cache/espree-npm-10.0.1-1d04a36678-557d6cfb48.zip and /dev/null differ diff --git a/.yarn/cache/espree-npm-10.1.0-6847541ce4-a673aa39a1.zip b/.yarn/cache/espree-npm-10.3.0-e5b10052f5-3412d44d42.zip similarity index 62% rename from .yarn/cache/espree-npm-10.1.0-6847541ce4-a673aa39a1.zip rename to .yarn/cache/espree-npm-10.3.0-e5b10052f5-3412d44d42.zip index 185efea66..e03ee2849 100644 Binary files a/.yarn/cache/espree-npm-10.1.0-6847541ce4-a673aa39a1.zip and b/.yarn/cache/espree-npm-10.3.0-e5b10052f5-3412d44d42.zip differ diff --git a/.yarn/cache/esquery-npm-1.5.0-d8f8a06879-e65fcdfc1e.zip b/.yarn/cache/esquery-npm-1.5.0-d8f8a06879-e65fcdfc1e.zip deleted file mode 100644 index eda9be956..000000000 Binary files a/.yarn/cache/esquery-npm-1.5.0-d8f8a06879-e65fcdfc1e.zip and /dev/null differ diff --git a/.yarn/cache/esquery-npm-1.6.0-16fee31531-c587fb8ec9.zip b/.yarn/cache/esquery-npm-1.6.0-16fee31531-c587fb8ec9.zip new file mode 100644 index 000000000..28f23bc15 Binary files /dev/null and b/.yarn/cache/esquery-npm-1.6.0-16fee31531-c587fb8ec9.zip differ diff --git a/.yarn/cache/eventemitter3-npm-5.0.1-5e423b7df3-ac6423ec31.zip b/.yarn/cache/eventemitter3-npm-5.0.1-5e423b7df3-ac6423ec31.zip deleted file mode 100644 index 78f820c7c..000000000 Binary files a/.yarn/cache/eventemitter3-npm-5.0.1-5e423b7df3-ac6423ec31.zip and /dev/null differ diff --git a/.yarn/cache/execa-npm-8.0.1-0211bd404c-d2ab5fe1e2.zip b/.yarn/cache/execa-npm-8.0.1-0211bd404c-d2ab5fe1e2.zip deleted file mode 100644 index 8f05a61e5..000000000 Binary files a/.yarn/cache/execa-npm-8.0.1-0211bd404c-d2ab5fe1e2.zip and /dev/null differ diff --git a/.yarn/cache/expect-type-npm-1.1.0-741d55500b-05fca80ddc.zip b/.yarn/cache/expect-type-npm-1.1.0-741d55500b-05fca80ddc.zip new file mode 100644 index 000000000..fd0f20506 Binary files /dev/null and b/.yarn/cache/expect-type-npm-1.1.0-741d55500b-05fca80ddc.zip differ diff --git a/.yarn/cache/fast-glob-npm-3.3.2-0a8cb4f2ca-222512e931.zip b/.yarn/cache/fast-glob-npm-3.3.3-2a653be532-dcc6432b26.zip similarity index 57% rename from .yarn/cache/fast-glob-npm-3.3.2-0a8cb4f2ca-222512e931.zip rename to .yarn/cache/fast-glob-npm-3.3.3-2a653be532-dcc6432b26.zip index 45463c136..877464c03 100644 Binary files a/.yarn/cache/fast-glob-npm-3.3.2-0a8cb4f2ca-222512e931.zip and b/.yarn/cache/fast-glob-npm-3.3.3-2a653be532-dcc6432b26.zip differ diff --git a/.yarn/cache/fdir-npm-6.4.3-938f734d57-8e6d20f459.zip b/.yarn/cache/fdir-npm-6.4.3-938f734d57-8e6d20f459.zip new file mode 100644 index 000000000..f69d56818 Binary files /dev/null and b/.yarn/cache/fdir-npm-6.4.3-938f734d57-8e6d20f459.zip differ diff --git a/.yarn/cache/find-up-simple-npm-1.0.1-84aa3c9703-6e374bffda.zip b/.yarn/cache/find-up-simple-npm-1.0.1-84aa3c9703-6e374bffda.zip new file mode 100644 index 000000000..fec6e4366 Binary files /dev/null and b/.yarn/cache/find-up-simple-npm-1.0.1-84aa3c9703-6e374bffda.zip differ diff --git a/.yarn/cache/flatted-npm-3.2.9-0462256d3c-dc2b89e46a.zip b/.yarn/cache/flatted-npm-3.2.9-0462256d3c-dc2b89e46a.zip deleted file mode 100644 index 4fd521e4e..000000000 Binary files a/.yarn/cache/flatted-npm-3.2.9-0462256d3c-dc2b89e46a.zip and /dev/null differ diff --git a/.yarn/cache/flatted-npm-3.3.1-458870f59b-7b8376061d.zip b/.yarn/cache/flatted-npm-3.3.1-458870f59b-7b8376061d.zip deleted file mode 100644 index 0dc832903..000000000 Binary files a/.yarn/cache/flatted-npm-3.3.1-458870f59b-7b8376061d.zip and /dev/null differ diff --git a/.yarn/cache/flatted-npm-3.3.2-6bf77e6e67-ac3c159742.zip b/.yarn/cache/flatted-npm-3.3.2-6bf77e6e67-ac3c159742.zip new file mode 100644 index 000000000..bf17b2160 Binary files /dev/null and b/.yarn/cache/flatted-npm-3.3.2-6bf77e6e67-ac3c159742.zip differ diff --git a/.yarn/cache/flatted-npm-3.3.3-ca455563b2-8c96c02fbe.zip b/.yarn/cache/flatted-npm-3.3.3-ca455563b2-8c96c02fbe.zip new file mode 100644 index 000000000..1c4a006ad Binary files /dev/null and b/.yarn/cache/flatted-npm-3.3.3-ca455563b2-8c96c02fbe.zip differ diff --git a/.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-087edd4485.zip b/.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-087edd4485.zip deleted file mode 100644 index 748261a70..000000000 Binary files a/.yarn/cache/foreground-child-npm-3.1.1-77e78ed774-087edd4485.zip and /dev/null differ diff --git a/.yarn/cache/foreground-child-npm-3.3.0-b8be745271-e3a60480f3.zip b/.yarn/cache/foreground-child-npm-3.3.0-b8be745271-e3a60480f3.zip new file mode 100644 index 000000000..665941be7 Binary files /dev/null and b/.yarn/cache/foreground-child-npm-3.3.0-b8be745271-e3a60480f3.zip differ diff --git a/.yarn/cache/front-matter-npm-4.0.2-e1cc0efa69-8897a831a8.zip b/.yarn/cache/front-matter-npm-4.0.2-e1cc0efa69-8897a831a8.zip new file mode 100644 index 000000000..28b673c74 Binary files /dev/null and b/.yarn/cache/front-matter-npm-4.0.2-e1cc0efa69-8897a831a8.zip differ diff --git a/.yarn/cache/fs-extra-npm-11.1.1-ca44602180-c4e9fabf97.zip b/.yarn/cache/fs-extra-npm-11.1.1-ca44602180-c4e9fabf97.zip deleted file mode 100644 index dd7510278..000000000 Binary files a/.yarn/cache/fs-extra-npm-11.1.1-ca44602180-c4e9fabf97.zip and /dev/null differ diff --git a/.yarn/cache/get-east-asian-width-npm-1.2.0-6cd8491dbe-c9b280e7c7.zip b/.yarn/cache/get-east-asian-width-npm-1.2.0-6cd8491dbe-c9b280e7c7.zip deleted file mode 100644 index 6a4d35c24..000000000 Binary files a/.yarn/cache/get-east-asian-width-npm-1.2.0-6cd8491dbe-c9b280e7c7.zip and /dev/null differ diff --git a/.yarn/cache/get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip b/.yarn/cache/get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip deleted file mode 100644 index d80affc5a..000000000 Binary files a/.yarn/cache/get-func-name-npm-2.0.2-409dbe3703-3f62f4c236.zip and /dev/null differ diff --git a/.yarn/cache/get-stream-npm-8.0.1-c921b4840e-dde5511e2e.zip b/.yarn/cache/get-stream-npm-8.0.1-c921b4840e-dde5511e2e.zip deleted file mode 100644 index ebe7123f2..000000000 Binary files a/.yarn/cache/get-stream-npm-8.0.1-c921b4840e-dde5511e2e.zip and /dev/null differ diff --git a/.yarn/cache/get-tsconfig-npm-4.7.2-8fbccd9fcf-f21135848f.zip b/.yarn/cache/get-tsconfig-npm-4.7.2-8fbccd9fcf-f21135848f.zip deleted file mode 100644 index 8343d76ba..000000000 Binary files a/.yarn/cache/get-tsconfig-npm-4.7.2-8fbccd9fcf-f21135848f.zip and /dev/null differ diff --git a/.yarn/cache/get-tsconfig-npm-4.8.1-adab2fc965-3fb5a8ad57.zip b/.yarn/cache/get-tsconfig-npm-4.8.1-adab2fc965-3fb5a8ad57.zip new file mode 100644 index 000000000..2ca847bb2 Binary files /dev/null and b/.yarn/cache/get-tsconfig-npm-4.8.1-adab2fc965-3fb5a8ad57.zip differ diff --git a/.yarn/cache/glob-npm-10.3.10-da1ef8b112-38bdb2c9ce.zip b/.yarn/cache/glob-npm-10.3.10-da1ef8b112-38bdb2c9ce.zip deleted file mode 100644 index 5c0f342c1..000000000 Binary files a/.yarn/cache/glob-npm-10.3.10-da1ef8b112-38bdb2c9ce.zip and /dev/null differ diff --git a/.yarn/cache/glob-npm-11.0.0-3be4126bf5-e66939201d.zip b/.yarn/cache/glob-npm-11.0.0-3be4126bf5-e66939201d.zip new file mode 100644 index 000000000..efd2f0302 Binary files /dev/null and b/.yarn/cache/glob-npm-11.0.0-3be4126bf5-e66939201d.zip differ diff --git a/.yarn/cache/globals-npm-15.15.0-5ddcb6c553-7f561c87b2.zip b/.yarn/cache/globals-npm-15.15.0-5ddcb6c553-7f561c87b2.zip new file mode 100644 index 000000000..4b368e55a Binary files /dev/null and b/.yarn/cache/globals-npm-15.15.0-5ddcb6c553-7f561c87b2.zip differ diff --git a/.yarn/cache/globals-npm-15.8.0-170a64f008-fbca69cc10.zip b/.yarn/cache/globals-npm-15.8.0-170a64f008-fbca69cc10.zip deleted file mode 100644 index 342b68b61..000000000 Binary files a/.yarn/cache/globals-npm-15.8.0-170a64f008-fbca69cc10.zip and /dev/null differ diff --git a/.yarn/cache/globals-npm-15.9.0-52af85f5e6-19bca70131.zip b/.yarn/cache/globals-npm-15.9.0-52af85f5e6-19bca70131.zip deleted file mode 100644 index 00bfca5ac..000000000 Binary files a/.yarn/cache/globals-npm-15.9.0-52af85f5e6-19bca70131.zip and /dev/null differ diff --git a/.yarn/cache/globals-npm-16.0.0-7f7c56ae12-aa05d569af.zip b/.yarn/cache/globals-npm-16.0.0-7f7c56ae12-aa05d569af.zip new file mode 100644 index 000000000..1213f191d Binary files /dev/null and b/.yarn/cache/globals-npm-16.0.0-7f7c56ae12-aa05d569af.zip differ diff --git a/.yarn/cache/globby-npm-14.0.2-28ff4422ff-67660da70f.zip b/.yarn/cache/globby-npm-14.0.2-28ff4422ff-67660da70f.zip deleted file mode 100644 index d43529bf9..000000000 Binary files a/.yarn/cache/globby-npm-14.0.2-28ff4422ff-67660da70f.zip and /dev/null differ diff --git a/.yarn/cache/globby-npm-14.1.0-b117053b71-e527ff54f0.zip b/.yarn/cache/globby-npm-14.1.0-b117053b71-e527ff54f0.zip new file mode 100644 index 000000000..b472934da Binary files /dev/null and b/.yarn/cache/globby-npm-14.1.0-b117053b71-e527ff54f0.zip differ diff --git a/.yarn/cache/hosted-git-info-npm-7.0.1-88a3bd32d2-5f740ecf3c.zip b/.yarn/cache/hosted-git-info-npm-7.0.1-88a3bd32d2-5f740ecf3c.zip deleted file mode 100644 index cd8a4f52c..000000000 Binary files a/.yarn/cache/hosted-git-info-npm-7.0.1-88a3bd32d2-5f740ecf3c.zip and /dev/null differ diff --git a/.yarn/cache/human-signals-npm-5.0.0-ed25a9f58c-30f8870d83.zip b/.yarn/cache/human-signals-npm-5.0.0-ed25a9f58c-30f8870d83.zip deleted file mode 100644 index 19a499e49..000000000 Binary files a/.yarn/cache/human-signals-npm-5.0.0-ed25a9f58c-30f8870d83.zip and /dev/null differ diff --git a/.yarn/cache/husky-npm-9.1.5-691154a935-21a3036dd0.zip b/.yarn/cache/husky-npm-9.1.7-5b02eaabc4-c2412753f1.zip similarity index 62% rename from .yarn/cache/husky-npm-9.1.5-691154a935-21a3036dd0.zip rename to .yarn/cache/husky-npm-9.1.7-5b02eaabc4-c2412753f1.zip index 988210f99..d30a3d30c 100644 Binary files a/.yarn/cache/husky-npm-9.1.5-691154a935-21a3036dd0.zip and b/.yarn/cache/husky-npm-9.1.7-5b02eaabc4-c2412753f1.zip differ diff --git a/.yarn/cache/ignore-npm-5.3.1-f6947c5df7-0a884c2fbc.zip b/.yarn/cache/ignore-npm-5.3.1-f6947c5df7-0a884c2fbc.zip deleted file mode 100644 index bc84df91d..000000000 Binary files a/.yarn/cache/ignore-npm-5.3.1-f6947c5df7-0a884c2fbc.zip and /dev/null differ diff --git a/.yarn/cache/ignore-npm-5.3.2-346d3ba017-cceb6a4570.zip b/.yarn/cache/ignore-npm-5.3.2-346d3ba017-cceb6a4570.zip new file mode 100644 index 000000000..e7580729a Binary files /dev/null and b/.yarn/cache/ignore-npm-5.3.2-346d3ba017-cceb6a4570.zip differ diff --git a/.yarn/cache/ignore-npm-7.0.3-6ded2ddf1c-ce5e812af3.zip b/.yarn/cache/ignore-npm-7.0.3-6ded2ddf1c-ce5e812af3.zip new file mode 100644 index 000000000..510c7cff4 Binary files /dev/null and b/.yarn/cache/ignore-npm-7.0.3-6ded2ddf1c-ce5e812af3.zip differ diff --git a/.yarn/cache/indent-string-npm-5.0.0-35eaa3b052-e466c27b63.zip b/.yarn/cache/indent-string-npm-5.0.0-35eaa3b052-e466c27b63.zip new file mode 100644 index 000000000..0510f8b66 Binary files /dev/null and b/.yarn/cache/indent-string-npm-5.0.0-35eaa3b052-e466c27b63.zip differ diff --git a/.yarn/cache/index-to-position-npm-0.1.2-0706eaf734-ae8e2304ed.zip b/.yarn/cache/index-to-position-npm-0.1.2-0706eaf734-ae8e2304ed.zip new file mode 100644 index 000000000..00756a75e Binary files /dev/null and b/.yarn/cache/index-to-position-npm-0.1.2-0706eaf734-ae8e2304ed.zip differ diff --git a/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-078e51b4f9.zip b/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-078e51b4f9.zip new file mode 100644 index 000000000..4b78c1aed Binary files /dev/null and b/.yarn/cache/is-binary-path-npm-2.1.0-e61d46f557-078e51b4f9.zip differ diff --git a/.yarn/cache/is-builtin-module-npm-3.2.1-2f92a5d353-e8f0ffc19a.zip b/.yarn/cache/is-builtin-module-npm-3.2.1-2f92a5d353-e8f0ffc19a.zip deleted file mode 100644 index be908976b..000000000 Binary files a/.yarn/cache/is-builtin-module-npm-3.2.1-2f92a5d353-e8f0ffc19a.zip and /dev/null differ diff --git a/.yarn/cache/is-builtin-module-npm-4.0.0-95c1cd49fe-61e31a8730.zip b/.yarn/cache/is-builtin-module-npm-4.0.0-95c1cd49fe-61e31a8730.zip new file mode 100644 index 000000000..49f156777 Binary files /dev/null and b/.yarn/cache/is-builtin-module-npm-4.0.0-95c1cd49fe-61e31a8730.zip differ diff --git a/.yarn/cache/is-fullwidth-code-point-npm-4.0.0-848488b60d-8ae89bf505.zip b/.yarn/cache/is-fullwidth-code-point-npm-4.0.0-848488b60d-8ae89bf505.zip deleted file mode 100644 index dbeb234d2..000000000 Binary files a/.yarn/cache/is-fullwidth-code-point-npm-4.0.0-848488b60d-8ae89bf505.zip and /dev/null differ diff --git a/.yarn/cache/is-fullwidth-code-point-npm-5.0.0-5eb90c2a6e-8dfb2d2831.zip b/.yarn/cache/is-fullwidth-code-point-npm-5.0.0-5eb90c2a6e-8dfb2d2831.zip deleted file mode 100644 index 5e0e355d3..000000000 Binary files a/.yarn/cache/is-fullwidth-code-point-npm-5.0.0-5eb90c2a6e-8dfb2d2831.zip and /dev/null differ diff --git a/.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip b/.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip deleted file mode 100644 index 27f29d70b..000000000 Binary files a/.yarn/cache/is-path-inside-npm-3.0.3-2ea0ef44fd-abd50f0618.zip and /dev/null differ diff --git a/.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip b/.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip deleted file mode 100644 index fd9d03a75..000000000 Binary files a/.yarn/cache/is-plain-object-npm-5.0.0-285b70faa3-e32d27061e.zip and /dev/null differ diff --git a/.yarn/cache/is-stream-npm-3.0.0-a77ac9a62e-172093fe99.zip b/.yarn/cache/is-stream-npm-3.0.0-a77ac9a62e-172093fe99.zip deleted file mode 100644 index 71e7d6518..000000000 Binary files a/.yarn/cache/is-stream-npm-3.0.0-a77ac9a62e-172093fe99.zip and /dev/null differ diff --git a/.yarn/cache/jackspeak-npm-2.3.6-42e1233172-6e6490d676.zip b/.yarn/cache/jackspeak-npm-2.3.6-42e1233172-6e6490d676.zip deleted file mode 100644 index 91909eb58..000000000 Binary files a/.yarn/cache/jackspeak-npm-2.3.6-42e1233172-6e6490d676.zip and /dev/null differ diff --git a/.yarn/cache/jackspeak-npm-4.0.2-95b4b8a1aa-d9722f0e55.zip b/.yarn/cache/jackspeak-npm-4.0.2-95b4b8a1aa-d9722f0e55.zip new file mode 100644 index 000000000..5e8b21d19 Binary files /dev/null and b/.yarn/cache/jackspeak-npm-4.0.2-95b4b8a1aa-d9722f0e55.zip differ diff --git a/.yarn/cache/jsesc-npm-0.5.0-6827074492-fab949f585.zip b/.yarn/cache/jsesc-npm-0.5.0-6827074492-fab949f585.zip deleted file mode 100644 index 881ccbe8e..000000000 Binary files a/.yarn/cache/jsesc-npm-0.5.0-6827074492-fab949f585.zip and /dev/null differ diff --git a/.yarn/cache/jsesc-npm-3.1.0-2f4f998cd7-20bd37a142.zip b/.yarn/cache/jsesc-npm-3.1.0-2f4f998cd7-20bd37a142.zip new file mode 100644 index 000000000..0701df326 Binary files /dev/null and b/.yarn/cache/jsesc-npm-3.1.0-2f4f998cd7-20bd37a142.zip differ diff --git a/.yarn/cache/json-parse-even-better-errors-npm-3.0.0-3675833c0a-f1970b5220.zip b/.yarn/cache/json-parse-even-better-errors-npm-3.0.0-3675833c0a-f1970b5220.zip deleted file mode 100644 index 8aa941bdb..000000000 Binary files a/.yarn/cache/json-parse-even-better-errors-npm-3.0.0-3675833c0a-f1970b5220.zip and /dev/null differ diff --git a/.yarn/cache/lerna-npm-8.1.8-9433a50d2d-c058064f07.zip b/.yarn/cache/lerna-npm-8.1.8-9433a50d2d-c058064f07.zip deleted file mode 100644 index 988376c1b..000000000 Binary files a/.yarn/cache/lerna-npm-8.1.8-9433a50d2d-c058064f07.zip and /dev/null differ diff --git a/.yarn/cache/lerna-npm-8.2.1-537dd44a0a-ebf9fd1af1.zip b/.yarn/cache/lerna-npm-8.2.1-537dd44a0a-ebf9fd1af1.zip new file mode 100644 index 000000000..26dd347c0 Binary files /dev/null and b/.yarn/cache/lerna-npm-8.2.1-537dd44a0a-ebf9fd1af1.zip differ diff --git a/.yarn/cache/lilconfig-npm-3.1.2-e5b7292949-8058403850.zip b/.yarn/cache/lilconfig-npm-3.1.2-e5b7292949-8058403850.zip deleted file mode 100644 index 6e6a74f62..000000000 Binary files a/.yarn/cache/lilconfig-npm-3.1.2-e5b7292949-8058403850.zip and /dev/null differ diff --git a/.yarn/cache/lint-staged-npm-15.2.10-3374e8211c-ab6930cd63.zip b/.yarn/cache/lint-staged-npm-15.2.10-3374e8211c-ab6930cd63.zip deleted file mode 100644 index a98d046a8..000000000 Binary files a/.yarn/cache/lint-staged-npm-15.2.10-3374e8211c-ab6930cd63.zip and /dev/null differ diff --git a/.yarn/cache/listr2-npm-8.2.4-d0c10a89e0-344d2397e1.zip b/.yarn/cache/listr2-npm-8.2.4-d0c10a89e0-344d2397e1.zip deleted file mode 100644 index 5067cd6c3..000000000 Binary files a/.yarn/cache/listr2-npm-8.2.4-d0c10a89e0-344d2397e1.zip and /dev/null differ diff --git a/.yarn/cache/log-update-npm-6.1.0-2ca9435417-5abb4131e3.zip b/.yarn/cache/log-update-npm-6.1.0-2ca9435417-5abb4131e3.zip deleted file mode 100644 index 5576a6b53..000000000 Binary files a/.yarn/cache/log-update-npm-6.1.0-2ca9435417-5abb4131e3.zip and /dev/null differ diff --git a/.yarn/cache/loupe-npm-3.1.1-78e77452a4-56d71d64c5.zip b/.yarn/cache/loupe-npm-3.1.2-58c9dbcc10-8f5734e53f.zip similarity index 61% rename from .yarn/cache/loupe-npm-3.1.1-78e77452a4-56d71d64c5.zip rename to .yarn/cache/loupe-npm-3.1.2-58c9dbcc10-8f5734e53f.zip index 7ff69b664..340bd0c2c 100644 Binary files a/.yarn/cache/loupe-npm-3.1.1-78e77452a4-56d71d64c5.zip and b/.yarn/cache/loupe-npm-3.1.2-58c9dbcc10-8f5734e53f.zip differ diff --git a/.yarn/cache/loupe-npm-3.1.3-81625c6ef8-9e98c34daf.zip b/.yarn/cache/loupe-npm-3.1.3-81625c6ef8-9e98c34daf.zip new file mode 100644 index 000000000..98454d431 Binary files /dev/null and b/.yarn/cache/loupe-npm-3.1.3-81625c6ef8-9e98c34daf.zip differ diff --git a/.yarn/cache/lru-cache-npm-10.1.0-f3d3a0f0ab-207278d6fa.zip b/.yarn/cache/lru-cache-npm-10.1.0-f3d3a0f0ab-207278d6fa.zip deleted file mode 100644 index 97d301faf..000000000 Binary files a/.yarn/cache/lru-cache-npm-10.1.0-f3d3a0f0ab-207278d6fa.zip and /dev/null differ diff --git a/.yarn/cache/lru-cache-npm-10.2.2-c54b721fc3-ff1a496d30.zip b/.yarn/cache/lru-cache-npm-10.2.2-c54b721fc3-ff1a496d30.zip deleted file mode 100644 index 7e71190c3..000000000 Binary files a/.yarn/cache/lru-cache-npm-10.2.2-c54b721fc3-ff1a496d30.zip and /dev/null differ diff --git a/.yarn/cache/lru-cache-npm-11.0.1-636ae10c75-26688a1b2a.zip b/.yarn/cache/lru-cache-npm-11.0.1-636ae10c75-26688a1b2a.zip new file mode 100644 index 000000000..12ef22187 Binary files /dev/null and b/.yarn/cache/lru-cache-npm-11.0.1-636ae10c75-26688a1b2a.zip differ diff --git a/.yarn/cache/magic-string-npm-0.30.10-f4e92e6784-9f8bf6363a.zip b/.yarn/cache/magic-string-npm-0.30.10-f4e92e6784-9f8bf6363a.zip deleted file mode 100644 index e265883f5..000000000 Binary files a/.yarn/cache/magic-string-npm-0.30.10-f4e92e6784-9f8bf6363a.zip and /dev/null differ diff --git a/.yarn/cache/magic-string-npm-0.30.17-da1b7593b1-2f71af2b0a.zip b/.yarn/cache/magic-string-npm-0.30.17-da1b7593b1-2f71af2b0a.zip new file mode 100644 index 000000000..136540630 Binary files /dev/null and b/.yarn/cache/magic-string-npm-0.30.17-da1b7593b1-2f71af2b0a.zip differ diff --git a/.yarn/cache/magicast-npm-0.3.4-c589d6a741-704f86639b.zip b/.yarn/cache/magicast-npm-0.3.4-c589d6a741-704f86639b.zip deleted file mode 100644 index 6f845c32d..000000000 Binary files a/.yarn/cache/magicast-npm-0.3.4-c589d6a741-704f86639b.zip and /dev/null differ diff --git a/.yarn/cache/magicast-npm-0.3.5-75436eaa69-3a2dba6b0b.zip b/.yarn/cache/magicast-npm-0.3.5-75436eaa69-3a2dba6b0b.zip new file mode 100644 index 000000000..2495c7b27 Binary files /dev/null and b/.yarn/cache/magicast-npm-0.3.5-75436eaa69-3a2dba6b0b.zip differ diff --git a/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip b/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip deleted file mode 100644 index 5b6ec16f1..000000000 Binary files a/.yarn/cache/make-fetch-happen-npm-13.0.0-f87a92bb87-ded5a91a02.zip and /dev/null differ diff --git a/.yarn/cache/mimic-fn-npm-4.0.0-feaeda79f7-995dcece15.zip b/.yarn/cache/mimic-fn-npm-4.0.0-feaeda79f7-995dcece15.zip deleted file mode 100644 index f990f1de1..000000000 Binary files a/.yarn/cache/mimic-fn-npm-4.0.0-feaeda79f7-995dcece15.zip and /dev/null differ diff --git a/.yarn/cache/mimic-function-npm-5.0.1-5078456e31-eb5893c99e.zip b/.yarn/cache/mimic-function-npm-5.0.1-5078456e31-eb5893c99e.zip deleted file mode 100644 index 034d272ae..000000000 Binary files a/.yarn/cache/mimic-function-npm-5.0.1-5078456e31-eb5893c99e.zip and /dev/null differ diff --git a/.yarn/cache/minimatch-npm-10.0.1-eabcc0d3a0-082e7ccbc0.zip b/.yarn/cache/minimatch-npm-10.0.1-eabcc0d3a0-082e7ccbc0.zip new file mode 100644 index 000000000..e5967608c Binary files /dev/null and b/.yarn/cache/minimatch-npm-10.0.1-eabcc0d3a0-082e7ccbc0.zip differ diff --git a/.yarn/cache/minimatch-npm-9.0.4-7be5a33efc-4cdc18d112.zip b/.yarn/cache/minimatch-npm-9.0.4-7be5a33efc-4cdc18d112.zip deleted file mode 100644 index 61a88c7c6..000000000 Binary files a/.yarn/cache/minimatch-npm-9.0.4-7be5a33efc-4cdc18d112.zip and /dev/null differ diff --git a/.yarn/cache/minipass-npm-7.0.4-eacb4e042e-e864bd02ce.zip b/.yarn/cache/minipass-npm-7.0.4-eacb4e042e-e864bd02ce.zip deleted file mode 100644 index 82e7fb219..000000000 Binary files a/.yarn/cache/minipass-npm-7.0.4-eacb4e042e-e864bd02ce.zip and /dev/null differ diff --git a/.yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-16fd79c286.zip b/.yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-16fd79c286.zip new file mode 100644 index 000000000..027c6d5fa Binary files /dev/null and b/.yarn/cache/mkdirp-npm-3.0.1-f94bfa769e-16fd79c286.zip differ diff --git a/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip b/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip deleted file mode 100644 index 725e9b8c1..000000000 Binary files a/.yarn/cache/ms-npm-2.1.2-ec0c1512ff-673cdb2c31.zip and /dev/null differ diff --git a/.yarn/cache/mute-stream-npm-2.0.0-45d3c1ef83-d2e4fd2f5a.zip b/.yarn/cache/mute-stream-npm-2.0.0-45d3c1ef83-d2e4fd2f5a.zip new file mode 100644 index 000000000..0edb0c149 Binary files /dev/null and b/.yarn/cache/mute-stream-npm-2.0.0-45d3c1ef83-d2e4fd2f5a.zip differ diff --git a/.yarn/cache/nano-staged-npm-0.8.0-ba6e5181ff-33051331ee.zip b/.yarn/cache/nano-staged-npm-0.8.0-ba6e5181ff-33051331ee.zip new file mode 100644 index 000000000..38c9f52c5 Binary files /dev/null and b/.yarn/cache/nano-staged-npm-0.8.0-ba6e5181ff-33051331ee.zip differ diff --git a/.yarn/cache/nanoid-npm-3.3.7-98824ba130-ac1eb60f61.zip b/.yarn/cache/nanoid-npm-3.3.7-98824ba130-ac1eb60f61.zip deleted file mode 100644 index 2207db736..000000000 Binary files a/.yarn/cache/nanoid-npm-3.3.7-98824ba130-ac1eb60f61.zip and /dev/null differ diff --git a/.yarn/cache/nanoid-npm-3.3.8-d22226208b-2d1766606c.zip b/.yarn/cache/nanoid-npm-3.3.8-d22226208b-2d1766606c.zip new file mode 100644 index 000000000..ec9e2621c Binary files /dev/null and b/.yarn/cache/nanoid-npm-3.3.8-d22226208b-2d1766606c.zip differ diff --git a/.yarn/cache/node-fetch-npm-2.6.12-48619ce9d6-370ed4d906.zip b/.yarn/cache/node-fetch-npm-2.6.12-48619ce9d6-370ed4d906.zip deleted file mode 100644 index 35cf21817..000000000 Binary files a/.yarn/cache/node-fetch-npm-2.6.12-48619ce9d6-370ed4d906.zip and /dev/null differ diff --git a/.yarn/cache/node-releases-npm-2.0.14-d39047cad8-0f7607ec7d.zip b/.yarn/cache/node-releases-npm-2.0.14-d39047cad8-0f7607ec7d.zip deleted file mode 100644 index bfb01a30e..000000000 Binary files a/.yarn/cache/node-releases-npm-2.0.14-d39047cad8-0f7607ec7d.zip and /dev/null differ diff --git a/.yarn/cache/node-releases-npm-2.0.19-b123ed6240-c2b33b4f0c.zip b/.yarn/cache/node-releases-npm-2.0.19-b123ed6240-c2b33b4f0c.zip new file mode 100644 index 000000000..cf958c382 Binary files /dev/null and b/.yarn/cache/node-releases-npm-2.0.19-b123ed6240-c2b33b4f0c.zip differ diff --git a/.yarn/cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip b/.yarn/cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip deleted file mode 100644 index 1fc2fd6f1..000000000 Binary files a/.yarn/cache/nopt-npm-7.2.0-dd734b678d-1e7489f17c.zip and /dev/null differ diff --git a/.yarn/cache/normalize-package-data-npm-6.0.0-eb6fb03d4d-e31e31a2eb.zip b/.yarn/cache/normalize-package-data-npm-6.0.0-eb6fb03d4d-e31e31a2eb.zip deleted file mode 100644 index d8fdce293..000000000 Binary files a/.yarn/cache/normalize-package-data-npm-6.0.0-eb6fb03d4d-e31e31a2eb.zip and /dev/null differ diff --git a/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip b/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip new file mode 100644 index 000000000..855af70e6 Binary files /dev/null and b/.yarn/cache/normalize-path-npm-3.0.0-658ba7d77f-88eeb4da89.zip differ diff --git a/.yarn/cache/npm-install-checks-npm-6.1.1-e05db36ccf-8fb3ed05cf.zip b/.yarn/cache/npm-install-checks-npm-6.1.1-e05db36ccf-8fb3ed05cf.zip deleted file mode 100644 index 42723c441..000000000 Binary files a/.yarn/cache/npm-install-checks-npm-6.1.1-e05db36ccf-8fb3ed05cf.zip and /dev/null differ diff --git a/.yarn/cache/npm-package-arg-npm-11.0.1-c881ac64e5-a16e632703.zip b/.yarn/cache/npm-package-arg-npm-11.0.1-c881ac64e5-a16e632703.zip deleted file mode 100644 index 4a9fceab2..000000000 Binary files a/.yarn/cache/npm-package-arg-npm-11.0.1-c881ac64e5-a16e632703.zip and /dev/null differ diff --git a/.yarn/cache/npm-packlist-npm-8.0.1-5bbf574d7c-470b56b1c5.zip b/.yarn/cache/npm-packlist-npm-8.0.1-5bbf574d7c-470b56b1c5.zip deleted file mode 100644 index aab181312..000000000 Binary files a/.yarn/cache/npm-packlist-npm-8.0.1-5bbf574d7c-470b56b1c5.zip and /dev/null differ diff --git a/.yarn/cache/npm-pick-manifest-npm-9.0.0-ad85663392-29dca2a838.zip b/.yarn/cache/npm-pick-manifest-npm-9.0.0-ad85663392-29dca2a838.zip deleted file mode 100644 index 1ea04511b..000000000 Binary files a/.yarn/cache/npm-pick-manifest-npm-9.0.0-ad85663392-29dca2a838.zip and /dev/null differ diff --git a/.yarn/cache/npm-run-path-npm-5.1.0-79c0668d42-dc184eb5ec.zip b/.yarn/cache/npm-run-path-npm-5.1.0-79c0668d42-dc184eb5ec.zip deleted file mode 100644 index 9b9a307b4..000000000 Binary files a/.yarn/cache/npm-run-path-npm-5.1.0-79c0668d42-dc184eb5ec.zip and /dev/null differ diff --git a/.yarn/cache/nx-npm-19.0.4-8bdba69a90-37f63af1dc.zip b/.yarn/cache/nx-npm-19.0.4-8bdba69a90-37f63af1dc.zip deleted file mode 100644 index 5f2f63c08..000000000 Binary files a/.yarn/cache/nx-npm-19.0.4-8bdba69a90-37f63af1dc.zip and /dev/null differ diff --git a/.yarn/cache/nx-npm-20.0.8-0a0e855cc4-2b11a447e3.zip b/.yarn/cache/nx-npm-20.0.8-0a0e855cc4-2b11a447e3.zip new file mode 100644 index 000000000..ef411d8d9 Binary files /dev/null and b/.yarn/cache/nx-npm-20.0.8-0a0e855cc4-2b11a447e3.zip differ diff --git a/.yarn/cache/onetime-npm-6.0.0-4f3684e29a-0846ce78e4.zip b/.yarn/cache/onetime-npm-6.0.0-4f3684e29a-0846ce78e4.zip deleted file mode 100644 index 05f13202f..000000000 Binary files a/.yarn/cache/onetime-npm-6.0.0-4f3684e29a-0846ce78e4.zip and /dev/null differ diff --git a/.yarn/cache/onetime-npm-7.0.0-cfdd2a579d-eb08d2da93.zip b/.yarn/cache/onetime-npm-7.0.0-cfdd2a579d-eb08d2da93.zip deleted file mode 100644 index 91656f9d7..000000000 Binary files a/.yarn/cache/onetime-npm-7.0.0-cfdd2a579d-eb08d2da93.zip and /dev/null differ diff --git a/.yarn/cache/parse-json-npm-8.1.0-3bb3720119-efc4256c91.zip b/.yarn/cache/parse-json-npm-8.1.0-3bb3720119-efc4256c91.zip new file mode 100644 index 000000000..7b6cf3410 Binary files /dev/null and b/.yarn/cache/parse-json-npm-8.1.0-3bb3720119-efc4256c91.zip differ diff --git a/.yarn/cache/path-key-npm-4.0.0-2bce99f089-8e6c314ae6.zip b/.yarn/cache/path-key-npm-4.0.0-2bce99f089-8e6c314ae6.zip deleted file mode 100644 index 271eb0345..000000000 Binary files a/.yarn/cache/path-key-npm-4.0.0-2bce99f089-8e6c314ae6.zip and /dev/null differ diff --git a/.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-eebfb8304f.zip b/.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-eebfb8304f.zip deleted file mode 100644 index 10a74fec6..000000000 Binary files a/.yarn/cache/path-scurry-npm-1.10.1-52bd946f2e-eebfb8304f.zip and /dev/null differ diff --git a/.yarn/cache/path-scurry-npm-2.0.0-5a556e8161-285ae0c2d6.zip b/.yarn/cache/path-scurry-npm-2.0.0-5a556e8161-285ae0c2d6.zip new file mode 100644 index 000000000..244235a52 Binary files /dev/null and b/.yarn/cache/path-scurry-npm-2.0.0-5a556e8161-285ae0c2d6.zip differ diff --git a/.yarn/cache/path-type-npm-5.0.0-205dd6bae0-15ec24050e.zip b/.yarn/cache/path-type-npm-5.0.0-205dd6bae0-15ec24050e.zip deleted file mode 100644 index 8dc528bb9..000000000 Binary files a/.yarn/cache/path-type-npm-5.0.0-205dd6bae0-15ec24050e.zip and /dev/null differ diff --git a/.yarn/cache/path-type-npm-6.0.0-b8256ae3a6-b9f6eaf779.zip b/.yarn/cache/path-type-npm-6.0.0-b8256ae3a6-b9f6eaf779.zip new file mode 100644 index 000000000..49d15b220 Binary files /dev/null and b/.yarn/cache/path-type-npm-6.0.0-b8256ae3a6-b9f6eaf779.zip differ diff --git a/.yarn/cache/pathe-npm-1.1.2-b80d94db55-f201d79635.zip b/.yarn/cache/pathe-npm-1.1.2-b80d94db55-f201d79635.zip deleted file mode 100644 index 1597e85ed..000000000 Binary files a/.yarn/cache/pathe-npm-1.1.2-b80d94db55-f201d79635.zip and /dev/null differ diff --git a/.yarn/cache/pathe-npm-2.0.3-0924246ee0-01e9a69928.zip b/.yarn/cache/pathe-npm-2.0.3-0924246ee0-01e9a69928.zip new file mode 100644 index 000000000..c45f803a1 Binary files /dev/null and b/.yarn/cache/pathe-npm-2.0.3-0924246ee0-01e9a69928.zip differ diff --git a/.yarn/cache/picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip b/.yarn/cache/picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip deleted file mode 100644 index 2d7c3d573..000000000 Binary files a/.yarn/cache/picocolors-npm-1.0.0-d81e0b1927-a2e8092dd8.zip and /dev/null differ diff --git a/.yarn/cache/picocolors-npm-1.1.1-4fede47cf1-e1cf46bf84.zip b/.yarn/cache/picocolors-npm-1.1.1-4fede47cf1-e1cf46bf84.zip new file mode 100644 index 000000000..44976ad16 Binary files /dev/null and b/.yarn/cache/picocolors-npm-1.1.1-4fede47cf1-e1cf46bf84.zip differ diff --git a/.yarn/cache/picomatch-npm-4.0.2-e93516ddf2-ce617b8da3.zip b/.yarn/cache/picomatch-npm-4.0.2-e93516ddf2-ce617b8da3.zip new file mode 100644 index 000000000..2ae285994 Binary files /dev/null and b/.yarn/cache/picomatch-npm-4.0.2-e93516ddf2-ce617b8da3.zip differ diff --git a/.yarn/cache/pidtree-npm-0.6.0-3d92e16117-ea67fb3159.zip b/.yarn/cache/pidtree-npm-0.6.0-3d92e16117-ea67fb3159.zip deleted file mode 100644 index b603c07cc..000000000 Binary files a/.yarn/cache/pidtree-npm-0.6.0-3d92e16117-ea67fb3159.zip and /dev/null differ diff --git a/.yarn/cache/polite-json-npm-5.0.0-1530173a2d-2faeff490c.zip b/.yarn/cache/polite-json-npm-5.0.0-1530173a2d-2faeff490c.zip new file mode 100644 index 000000000..622ee4a36 Binary files /dev/null and b/.yarn/cache/polite-json-npm-5.0.0-1530173a2d-2faeff490c.zip differ diff --git a/.yarn/cache/postcss-npm-8.4.38-495621b279-6e44a7ed83.zip b/.yarn/cache/postcss-npm-8.4.38-495621b279-6e44a7ed83.zip deleted file mode 100644 index a89b0e8a6..000000000 Binary files a/.yarn/cache/postcss-npm-8.4.38-495621b279-6e44a7ed83.zip and /dev/null differ diff --git a/.yarn/cache/postcss-npm-8.5.1-90fd898a99-1fbd287531.zip b/.yarn/cache/postcss-npm-8.5.1-90fd898a99-1fbd287531.zip new file mode 100644 index 000000000..ddab98ec0 Binary files /dev/null and b/.yarn/cache/postcss-npm-8.5.1-90fd898a99-1fbd287531.zip differ diff --git a/.yarn/cache/prettier-npm-3.3.3-e811f023f3-5beac1f30b.zip b/.yarn/cache/prettier-npm-3.3.3-e811f023f3-5beac1f30b.zip deleted file mode 100644 index 318970429..000000000 Binary files a/.yarn/cache/prettier-npm-3.3.3-e811f023f3-5beac1f30b.zip and /dev/null differ diff --git a/.yarn/cache/prettier-npm-3.5.3-787132ce04-7050c08f67.zip b/.yarn/cache/prettier-npm-3.5.3-787132ce04-7050c08f67.zip new file mode 100644 index 000000000..f2283d5e2 Binary files /dev/null and b/.yarn/cache/prettier-npm-3.5.3-787132ce04-7050c08f67.zip differ diff --git a/.yarn/cache/read-package-up-npm-11.0.0-e39aefc766-535b7554d4.zip b/.yarn/cache/read-package-up-npm-11.0.0-e39aefc766-535b7554d4.zip new file mode 100644 index 000000000..f3e422f81 Binary files /dev/null and b/.yarn/cache/read-package-up-npm-11.0.0-e39aefc766-535b7554d4.zip differ diff --git a/.yarn/cache/read-pkg-npm-9.0.1-a6051ad95a-5544bea2a5.zip b/.yarn/cache/read-pkg-npm-9.0.1-a6051ad95a-5544bea2a5.zip new file mode 100644 index 000000000..5fbad09c0 Binary files /dev/null and b/.yarn/cache/read-pkg-npm-9.0.1-a6051ad95a-5544bea2a5.zip differ diff --git a/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-196b30ef6c.zip b/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-196b30ef6c.zip new file mode 100644 index 000000000..e2e27a68f Binary files /dev/null and b/.yarn/cache/readdirp-npm-3.6.0-f950cc74ab-196b30ef6c.zip differ diff --git a/.yarn/cache/regjsparser-npm-0.10.0-f65a000af3-06f7f0e595.zip b/.yarn/cache/regjsparser-npm-0.10.0-f65a000af3-06f7f0e595.zip deleted file mode 100644 index 8b5c0154c..000000000 Binary files a/.yarn/cache/regjsparser-npm-0.10.0-f65a000af3-06f7f0e595.zip and /dev/null differ diff --git a/.yarn/cache/regjsparser-npm-0.12.0-9d000fca30-c2d6506b33.zip b/.yarn/cache/regjsparser-npm-0.12.0-9d000fca30-c2d6506b33.zip new file mode 100644 index 000000000..95e1bd338 Binary files /dev/null and b/.yarn/cache/regjsparser-npm-0.12.0-9d000fca30-c2d6506b33.zip differ diff --git a/.yarn/cache/resolve-import-npm-2.0.0-04c5bad790-42806adf37.zip b/.yarn/cache/resolve-import-npm-2.0.0-04c5bad790-42806adf37.zip new file mode 100644 index 000000000..e7ee51585 Binary files /dev/null and b/.yarn/cache/resolve-import-npm-2.0.0-04c5bad790-42806adf37.zip differ diff --git a/.yarn/cache/restore-cursor-npm-5.1.0-b8fd1128bf-838dd54e45.zip b/.yarn/cache/restore-cursor-npm-5.1.0-b8fd1128bf-838dd54e45.zip deleted file mode 100644 index 80620acb8..000000000 Binary files a/.yarn/cache/restore-cursor-npm-5.1.0-b8fd1128bf-838dd54e45.zip and /dev/null differ diff --git a/.yarn/cache/rfdc-npm-1.4.1-1a1c63d052-2f3d11d3d8.zip b/.yarn/cache/rfdc-npm-1.4.1-1a1c63d052-2f3d11d3d8.zip deleted file mode 100644 index 1b5a66983..000000000 Binary files a/.yarn/cache/rfdc-npm-1.4.1-1a1c63d052-2f3d11d3d8.zip and /dev/null differ diff --git a/.yarn/cache/rimraf-npm-6.0.1-2d0b0aeb1b-0eb7edf08a.zip b/.yarn/cache/rimraf-npm-6.0.1-2d0b0aeb1b-0eb7edf08a.zip new file mode 100644 index 000000000..c07620c1b Binary files /dev/null and b/.yarn/cache/rimraf-npm-6.0.1-2d0b0aeb1b-0eb7edf08a.zip differ diff --git a/.yarn/cache/rollup-npm-4.14.0-77380b8277-803b45976d.zip b/.yarn/cache/rollup-npm-4.14.0-77380b8277-803b45976d.zip deleted file mode 100644 index 13de7e352..000000000 Binary files a/.yarn/cache/rollup-npm-4.14.0-77380b8277-803b45976d.zip and /dev/null differ diff --git a/.yarn/cache/rollup-npm-4.31.0-cc9ec35c39-4f5fac0a0d.zip b/.yarn/cache/rollup-npm-4.31.0-cc9ec35c39-4f5fac0a0d.zip new file mode 100644 index 000000000..34c8ce3c5 Binary files /dev/null and b/.yarn/cache/rollup-npm-4.31.0-cc9ec35c39-4f5fac0a0d.zip differ diff --git a/.yarn/cache/rxjs-npm-7.8.2-80ecda9013-03dff09191.zip b/.yarn/cache/rxjs-npm-7.8.2-80ecda9013-03dff09191.zip new file mode 100644 index 000000000..e58fa268c Binary files /dev/null and b/.yarn/cache/rxjs-npm-7.8.2-80ecda9013-03dff09191.zip differ diff --git a/.yarn/cache/semver-npm-7.6.2-0fec6944bb-296b17d027.zip b/.yarn/cache/semver-npm-7.6.3-57e82c14d5-36b1fbe1a2.zip similarity index 74% rename from .yarn/cache/semver-npm-7.6.2-0fec6944bb-296b17d027.zip rename to .yarn/cache/semver-npm-7.6.3-57e82c14d5-36b1fbe1a2.zip index f3e5303fa..bb2a4c255 100644 Binary files a/.yarn/cache/semver-npm-7.6.2-0fec6944bb-296b17d027.zip and b/.yarn/cache/semver-npm-7.6.3-57e82c14d5-36b1fbe1a2.zip differ diff --git a/.yarn/cache/semver-npm-7.7.1-4572475307-4cfa1eb91e.zip b/.yarn/cache/semver-npm-7.7.1-4572475307-4cfa1eb91e.zip new file mode 100644 index 000000000..5af801268 Binary files /dev/null and b/.yarn/cache/semver-npm-7.7.1-4572475307-4cfa1eb91e.zip differ diff --git a/.yarn/cache/sirv-npm-2.0.4-cace6fe955-24f42cf068.zip b/.yarn/cache/sirv-npm-2.0.4-cace6fe955-24f42cf068.zip deleted file mode 100644 index 50527a332..000000000 Binary files a/.yarn/cache/sirv-npm-2.0.4-cace6fe955-24f42cf068.zip and /dev/null differ diff --git a/.yarn/cache/sirv-npm-3.0.1-6bef01ff05-b110ebe28e.zip b/.yarn/cache/sirv-npm-3.0.1-6bef01ff05-b110ebe28e.zip new file mode 100644 index 000000000..95574c5aa Binary files /dev/null and b/.yarn/cache/sirv-npm-3.0.1-6bef01ff05-b110ebe28e.zip differ diff --git a/.yarn/cache/slice-ansi-npm-5.0.0-8cd4f226df-7e600a2a55.zip b/.yarn/cache/slice-ansi-npm-5.0.0-8cd4f226df-7e600a2a55.zip deleted file mode 100644 index d3e5c6f1a..000000000 Binary files a/.yarn/cache/slice-ansi-npm-5.0.0-8cd4f226df-7e600a2a55.zip and /dev/null differ diff --git a/.yarn/cache/slice-ansi-npm-7.1.0-ecf63701b8-10313dd3cf.zip b/.yarn/cache/slice-ansi-npm-7.1.0-ecf63701b8-10313dd3cf.zip deleted file mode 100644 index 23ea19ad8..000000000 Binary files a/.yarn/cache/slice-ansi-npm-7.1.0-ecf63701b8-10313dd3cf.zip and /dev/null differ diff --git a/.yarn/cache/source-map-js-npm-1.2.0-6e63f357e5-74f331cfd2.zip b/.yarn/cache/source-map-js-npm-1.2.1-b9a47d7e1a-ff9d8c8bf0.zip similarity index 66% rename from .yarn/cache/source-map-js-npm-1.2.0-6e63f357e5-74f331cfd2.zip rename to .yarn/cache/source-map-js-npm-1.2.1-b9a47d7e1a-ff9d8c8bf0.zip index d1e5de6b4..d7d2f6a93 100644 Binary files a/.yarn/cache/source-map-js-npm-1.2.0-6e63f357e5-74f331cfd2.zip and b/.yarn/cache/source-map-js-npm-1.2.1-b9a47d7e1a-ff9d8c8bf0.zip differ diff --git a/.yarn/cache/ssri-npm-10.0.4-f583dafaf3-3f3dc4a0bb.zip b/.yarn/cache/ssri-npm-10.0.4-f583dafaf3-3f3dc4a0bb.zip deleted file mode 100644 index 6aa034628..000000000 Binary files a/.yarn/cache/ssri-npm-10.0.4-f583dafaf3-3f3dc4a0bb.zip and /dev/null differ diff --git a/.yarn/cache/std-env-npm-3.7.0-5261c3c3c3-6ee0cca1ad.zip b/.yarn/cache/std-env-npm-3.7.0-5261c3c3c3-6ee0cca1ad.zip deleted file mode 100644 index c8cdcbef6..000000000 Binary files a/.yarn/cache/std-env-npm-3.7.0-5261c3c3c3-6ee0cca1ad.zip and /dev/null differ diff --git a/.yarn/cache/std-env-npm-3.8.0-f5ccf32ee1-034176196c.zip b/.yarn/cache/std-env-npm-3.8.0-f5ccf32ee1-034176196c.zip new file mode 100644 index 000000000..494c2126c Binary files /dev/null and b/.yarn/cache/std-env-npm-3.8.0-f5ccf32ee1-034176196c.zip differ diff --git a/.yarn/cache/string-argv-npm-0.3.2-6e057a88f1-f9d3addf88.zip b/.yarn/cache/string-argv-npm-0.3.2-6e057a88f1-f9d3addf88.zip deleted file mode 100644 index c491cf9ab..000000000 Binary files a/.yarn/cache/string-argv-npm-0.3.2-6e057a88f1-f9d3addf88.zip and /dev/null differ diff --git a/.yarn/cache/string-width-npm-7.0.0-1bcc0b3bce-bc0de5700a.zip b/.yarn/cache/string-width-npm-7.0.0-1bcc0b3bce-bc0de5700a.zip deleted file mode 100644 index eb50cd144..000000000 Binary files a/.yarn/cache/string-width-npm-7.0.0-1bcc0b3bce-bc0de5700a.zip and /dev/null differ diff --git a/.yarn/cache/strip-final-newline-npm-3.0.0-7972cbec8b-23ee263adf.zip b/.yarn/cache/strip-final-newline-npm-3.0.0-7972cbec8b-23ee263adf.zip deleted file mode 100644 index 9cbcced9e..000000000 Binary files a/.yarn/cache/strip-final-newline-npm-3.0.0-7972cbec8b-23ee263adf.zip and /dev/null differ diff --git a/.yarn/cache/strip-indent-npm-4.0.0-12c489be86-06cbcd93da.zip b/.yarn/cache/strip-indent-npm-4.0.0-12c489be86-06cbcd93da.zip new file mode 100644 index 000000000..8fb1a25aa Binary files /dev/null and b/.yarn/cache/strip-indent-npm-4.0.0-12c489be86-06cbcd93da.zip differ diff --git a/.yarn/cache/sync-content-npm-2.0.1-7285922480-43d7afcc3a.zip b/.yarn/cache/sync-content-npm-2.0.1-7285922480-43d7afcc3a.zip new file mode 100644 index 000000000..1dbba81a9 Binary files /dev/null and b/.yarn/cache/sync-content-npm-2.0.1-7285922480-43d7afcc3a.zip differ diff --git a/.yarn/cache/text-table-npm-0.2.0-d92a778b59-4383b5baae.zip b/.yarn/cache/text-table-npm-0.2.0-d92a778b59-4383b5baae.zip deleted file mode 100644 index ca82cc668..000000000 Binary files a/.yarn/cache/text-table-npm-0.2.0-d92a778b59-4383b5baae.zip and /dev/null differ diff --git a/.yarn/cache/tinybench-npm-2.8.0-e63baae395-9731d070be.zip b/.yarn/cache/tinybench-npm-2.8.0-e63baae395-9731d070be.zip deleted file mode 100644 index f9176141d..000000000 Binary files a/.yarn/cache/tinybench-npm-2.8.0-e63baae395-9731d070be.zip and /dev/null differ diff --git a/.yarn/cache/tinybench-npm-2.9.0-2861a048db-cfa1e1418e.zip b/.yarn/cache/tinybench-npm-2.9.0-2861a048db-cfa1e1418e.zip new file mode 100644 index 000000000..f43132506 Binary files /dev/null and b/.yarn/cache/tinybench-npm-2.9.0-2861a048db-cfa1e1418e.zip differ diff --git a/.yarn/cache/tinyexec-npm-0.3.2-381b1e349c-b9d5fed316.zip b/.yarn/cache/tinyexec-npm-0.3.2-381b1e349c-b9d5fed316.zip new file mode 100644 index 000000000..d47cdc010 Binary files /dev/null and b/.yarn/cache/tinyexec-npm-0.3.2-381b1e349c-b9d5fed316.zip differ diff --git a/.yarn/cache/tinyglobby-npm-0.2.12-c8807de691-4ad28701fa.zip b/.yarn/cache/tinyglobby-npm-0.2.12-c8807de691-4ad28701fa.zip new file mode 100644 index 000000000..8b9eaf10c Binary files /dev/null and b/.yarn/cache/tinyglobby-npm-0.2.12-c8807de691-4ad28701fa.zip differ diff --git a/.yarn/cache/tinypool-npm-1.0.0-01bf44ef1d-4041a9ae62.zip b/.yarn/cache/tinypool-npm-1.0.0-01bf44ef1d-4041a9ae62.zip deleted file mode 100644 index 6bcf81271..000000000 Binary files a/.yarn/cache/tinypool-npm-1.0.0-01bf44ef1d-4041a9ae62.zip and /dev/null differ diff --git a/.yarn/cache/tinypool-npm-1.0.2-622ea851e4-6109322f14.zip b/.yarn/cache/tinypool-npm-1.0.2-622ea851e4-6109322f14.zip new file mode 100644 index 000000000..b3e350ed6 Binary files /dev/null and b/.yarn/cache/tinypool-npm-1.0.2-622ea851e4-6109322f14.zip differ diff --git a/.yarn/cache/tinyrainbow-npm-1.2.0-456cccee06-2924444db6.zip b/.yarn/cache/tinyrainbow-npm-1.2.0-456cccee06-2924444db6.zip deleted file mode 100644 index a82033421..000000000 Binary files a/.yarn/cache/tinyrainbow-npm-1.2.0-456cccee06-2924444db6.zip and /dev/null differ diff --git a/.yarn/cache/tinyrainbow-npm-2.0.0-b4ba575b93-94d4e16246.zip b/.yarn/cache/tinyrainbow-npm-2.0.0-b4ba575b93-94d4e16246.zip new file mode 100644 index 000000000..faa3fd08b Binary files /dev/null and b/.yarn/cache/tinyrainbow-npm-2.0.0-b4ba575b93-94d4e16246.zip differ diff --git a/.yarn/cache/tinyspy-npm-3.0.0-f3d94b9691-b5b686acff.zip b/.yarn/cache/tinyspy-npm-3.0.0-f3d94b9691-b5b686acff.zip deleted file mode 100644 index d8e783eae..000000000 Binary files a/.yarn/cache/tinyspy-npm-3.0.0-f3d94b9691-b5b686acff.zip and /dev/null differ diff --git a/.yarn/cache/tinyspy-npm-3.0.2-4f17593a18-5db671b2ff.zip b/.yarn/cache/tinyspy-npm-3.0.2-4f17593a18-5db671b2ff.zip new file mode 100644 index 000000000..536af239f Binary files /dev/null and b/.yarn/cache/tinyspy-npm-3.0.2-4f17593a18-5db671b2ff.zip differ diff --git a/.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip b/.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip deleted file mode 100644 index bed5e126b..000000000 Binary files a/.yarn/cache/to-fast-properties-npm-2.0.0-0dc60cc481-be2de62fe5.zip and /dev/null differ diff --git a/.yarn/cache/ts-api-utils-npm-1.3.0-33457908f8-3ee44faa24.zip b/.yarn/cache/ts-api-utils-npm-1.3.0-33457908f8-3ee44faa24.zip deleted file mode 100644 index dff1be637..000000000 Binary files a/.yarn/cache/ts-api-utils-npm-1.3.0-33457908f8-3ee44faa24.zip and /dev/null differ diff --git a/.yarn/cache/ts-api-utils-npm-2.0.1-03c1d3773a-2e68938cd5.zip b/.yarn/cache/ts-api-utils-npm-2.0.1-03c1d3773a-2e68938cd5.zip new file mode 100644 index 000000000..34934eb74 Binary files /dev/null and b/.yarn/cache/ts-api-utils-npm-2.0.1-03c1d3773a-2e68938cd5.zip differ diff --git a/.yarn/cache/ts-expose-internals-conditionally-npm-1.0.0-empty.0-7134a0e5ed-6b4f546fc5.zip b/.yarn/cache/ts-expose-internals-conditionally-npm-1.0.0-empty.0-7134a0e5ed-6b4f546fc5.zip deleted file mode 100644 index 77e30d305..000000000 Binary files a/.yarn/cache/ts-expose-internals-conditionally-npm-1.0.0-empty.0-7134a0e5ed-6b4f546fc5.zip and /dev/null differ diff --git a/.yarn/cache/tshy-npm-3.0.2-d850619ed8-48ae27425c.zip b/.yarn/cache/tshy-npm-3.0.2-d850619ed8-48ae27425c.zip new file mode 100644 index 000000000..d2d7bdb5c Binary files /dev/null and b/.yarn/cache/tshy-npm-3.0.2-d850619ed8-48ae27425c.zip differ diff --git a/.yarn/cache/turbo-darwin-64-npm-2.1.1-8573c9c54c-10.zip b/.yarn/cache/turbo-darwin-64-npm-2.4.4-3a8ace4e6c-10.zip similarity index 50% rename from .yarn/cache/turbo-darwin-64-npm-2.1.1-8573c9c54c-10.zip rename to .yarn/cache/turbo-darwin-64-npm-2.4.4-3a8ace4e6c-10.zip index e8e77289b..edc0dd87e 100644 Binary files a/.yarn/cache/turbo-darwin-64-npm-2.1.1-8573c9c54c-10.zip and b/.yarn/cache/turbo-darwin-64-npm-2.4.4-3a8ace4e6c-10.zip differ diff --git a/.yarn/cache/turbo-darwin-arm64-npm-2.1.1-05ababad17-10.zip b/.yarn/cache/turbo-darwin-arm64-npm-2.1.1-05ababad17-10.zip deleted file mode 100644 index 1132f3e17..000000000 Binary files a/.yarn/cache/turbo-darwin-arm64-npm-2.1.1-05ababad17-10.zip and /dev/null differ diff --git a/.yarn/cache/turbo-windows-arm64-npm-2.1.1-61b3738add-10.zip b/.yarn/cache/turbo-darwin-arm64-npm-2.4.4-4a90351e28-10.zip similarity index 57% rename from .yarn/cache/turbo-windows-arm64-npm-2.1.1-61b3738add-10.zip rename to .yarn/cache/turbo-darwin-arm64-npm-2.4.4-4a90351e28-10.zip index b4e32eeb9..3a230c8c4 100644 Binary files a/.yarn/cache/turbo-windows-arm64-npm-2.1.1-61b3738add-10.zip and b/.yarn/cache/turbo-darwin-arm64-npm-2.4.4-4a90351e28-10.zip differ diff --git a/.yarn/cache/turbo-linux-64-npm-2.1.1-2cfdceef0e-10.zip b/.yarn/cache/turbo-linux-64-npm-2.4.4-4e9e4213fd-10.zip similarity index 53% rename from .yarn/cache/turbo-linux-64-npm-2.1.1-2cfdceef0e-10.zip rename to .yarn/cache/turbo-linux-64-npm-2.4.4-4e9e4213fd-10.zip index f7dd506f5..4883c5042 100644 Binary files a/.yarn/cache/turbo-linux-64-npm-2.1.1-2cfdceef0e-10.zip and b/.yarn/cache/turbo-linux-64-npm-2.4.4-4e9e4213fd-10.zip differ diff --git a/.yarn/cache/turbo-linux-arm64-npm-2.1.1-d10c2c287c-10.zip b/.yarn/cache/turbo-linux-arm64-npm-2.1.1-d10c2c287c-10.zip deleted file mode 100644 index dc330b4ee..000000000 Binary files a/.yarn/cache/turbo-linux-arm64-npm-2.1.1-d10c2c287c-10.zip and /dev/null differ diff --git a/.yarn/cache/turbo-windows-64-npm-2.1.1-962d0c4f7d-10.zip b/.yarn/cache/turbo-linux-arm64-npm-2.4.4-b11a28c585-10.zip similarity index 57% rename from .yarn/cache/turbo-windows-64-npm-2.1.1-962d0c4f7d-10.zip rename to .yarn/cache/turbo-linux-arm64-npm-2.4.4-b11a28c585-10.zip index 9d9017374..fc70a125c 100644 Binary files a/.yarn/cache/turbo-windows-64-npm-2.1.1-962d0c4f7d-10.zip and b/.yarn/cache/turbo-linux-arm64-npm-2.4.4-b11a28c585-10.zip differ diff --git a/.yarn/cache/turbo-npm-2.1.1-946a032a80-4137d17936.zip b/.yarn/cache/turbo-npm-2.1.1-946a032a80-4137d17936.zip deleted file mode 100644 index da10d75b2..000000000 Binary files a/.yarn/cache/turbo-npm-2.1.1-946a032a80-4137d17936.zip and /dev/null differ diff --git a/.yarn/cache/turbo-npm-2.4.4-f4d385e5a5-ea60911d28.zip b/.yarn/cache/turbo-npm-2.4.4-f4d385e5a5-ea60911d28.zip new file mode 100644 index 000000000..ea95cd815 Binary files /dev/null and b/.yarn/cache/turbo-npm-2.4.4-f4d385e5a5-ea60911d28.zip differ diff --git a/.yarn/cache/turbo-windows-64-npm-2.4.4-a9777504ec-10.zip b/.yarn/cache/turbo-windows-64-npm-2.4.4-a9777504ec-10.zip new file mode 100644 index 000000000..a6e96ff70 Binary files /dev/null and b/.yarn/cache/turbo-windows-64-npm-2.4.4-a9777504ec-10.zip differ diff --git a/.yarn/cache/turbo-windows-arm64-npm-2.4.4-91c49a539d-10.zip b/.yarn/cache/turbo-windows-arm64-npm-2.4.4-91c49a539d-10.zip new file mode 100644 index 000000000..3f5652bb9 Binary files /dev/null and b/.yarn/cache/turbo-windows-arm64-npm-2.4.4-91c49a539d-10.zip differ diff --git a/.yarn/cache/typescript-eslint-npm-8.26.0-b1967976e8-e9bcaf4393.zip b/.yarn/cache/typescript-eslint-npm-8.26.0-b1967976e8-e9bcaf4393.zip new file mode 100644 index 000000000..4573f5fa7 Binary files /dev/null and b/.yarn/cache/typescript-eslint-npm-8.26.0-b1967976e8-e9bcaf4393.zip differ diff --git a/.yarn/cache/typescript-eslint-npm-8.3.0-965b2af9e3-15b98cf65e.zip b/.yarn/cache/typescript-eslint-npm-8.3.0-965b2af9e3-15b98cf65e.zip deleted file mode 100644 index f6ad2dde1..000000000 Binary files a/.yarn/cache/typescript-eslint-npm-8.3.0-965b2af9e3-15b98cf65e.zip and /dev/null differ diff --git a/.yarn/cache/typescript-npm-5.3.3-6b23a5da18-6e4e6a14a5.zip b/.yarn/cache/typescript-npm-5.3.3-6b23a5da18-6e4e6a14a5.zip deleted file mode 100644 index 2f4ee3b24..000000000 Binary files a/.yarn/cache/typescript-npm-5.3.3-6b23a5da18-6e4e6a14a5.zip and /dev/null differ diff --git a/.yarn/cache/typescript-npm-5.4.5-8568a42232-d04a9e27e6.zip b/.yarn/cache/typescript-npm-5.4.5-8568a42232-d04a9e27e6.zip deleted file mode 100644 index bb766b3d8..000000000 Binary files a/.yarn/cache/typescript-npm-5.4.5-8568a42232-d04a9e27e6.zip and /dev/null differ diff --git a/.yarn/cache/typescript-npm-5.5.4-79ce5f60f7-1689ccafef.zip b/.yarn/cache/typescript-npm-5.5.4-79ce5f60f7-1689ccafef.zip deleted file mode 100644 index 0f260d381..000000000 Binary files a/.yarn/cache/typescript-npm-5.5.4-79ce5f60f7-1689ccafef.zip and /dev/null differ diff --git a/.yarn/cache/typescript-npm-5.6.1-rc-96316e7f74-5716659d5b.zip b/.yarn/cache/typescript-npm-5.6.1-rc-96316e7f74-5716659d5b.zip new file mode 100644 index 000000000..c53a47021 Binary files /dev/null and b/.yarn/cache/typescript-npm-5.6.1-rc-96316e7f74-5716659d5b.zip differ diff --git a/.yarn/cache/typescript-npm-5.7.3-e71b273452-6a7e556de9.zip b/.yarn/cache/typescript-npm-5.7.3-e71b273452-6a7e556de9.zip new file mode 100644 index 000000000..1e2f51c9c Binary files /dev/null and b/.yarn/cache/typescript-npm-5.7.3-e71b273452-6a7e556de9.zip differ diff --git a/.yarn/cache/typescript-npm-5.8.2-b95d637f6a-dbc2168a55.zip b/.yarn/cache/typescript-npm-5.8.2-b95d637f6a-dbc2168a55.zip new file mode 100644 index 000000000..8ad9584b9 Binary files /dev/null and b/.yarn/cache/typescript-npm-5.8.2-b95d637f6a-dbc2168a55.zip differ diff --git a/.yarn/cache/typescript-patch-26c53754b1-97920a082f.zip b/.yarn/cache/typescript-patch-26c53754b1-97920a082f.zip new file mode 100644 index 000000000..e336adf41 Binary files /dev/null and b/.yarn/cache/typescript-patch-26c53754b1-97920a082f.zip differ diff --git a/.yarn/cache/typescript-patch-4778c7998b-c93786fcc9.zip b/.yarn/cache/typescript-patch-4778c7998b-c93786fcc9.zip deleted file mode 100644 index 9c476d939..000000000 Binary files a/.yarn/cache/typescript-patch-4778c7998b-c93786fcc9.zip and /dev/null differ diff --git a/.yarn/cache/typescript-patch-6da68bae26-dc58d777eb.zip b/.yarn/cache/typescript-patch-6da68bae26-dc58d777eb.zip new file mode 100644 index 000000000..46d7601f4 Binary files /dev/null and b/.yarn/cache/typescript-patch-6da68bae26-dc58d777eb.zip differ diff --git a/.yarn/cache/typescript-patch-6e159bfddb-760f7d92fb.zip b/.yarn/cache/typescript-patch-6e159bfddb-760f7d92fb.zip deleted file mode 100644 index af3fc0ca3..000000000 Binary files a/.yarn/cache/typescript-patch-6e159bfddb-760f7d92fb.zip and /dev/null differ diff --git a/.yarn/cache/typescript-patch-f14503dcf9-462e0bb46c.zip b/.yarn/cache/typescript-patch-f14503dcf9-462e0bb46c.zip new file mode 100644 index 000000000..28b01c7a0 Binary files /dev/null and b/.yarn/cache/typescript-patch-f14503dcf9-462e0bb46c.zip differ diff --git a/.yarn/cache/typescript-patch-fe43cd9db9-746fdd0865.zip b/.yarn/cache/typescript-patch-fe43cd9db9-746fdd0865.zip deleted file mode 100644 index 1c79d5116..000000000 Binary files a/.yarn/cache/typescript-patch-fe43cd9db9-746fdd0865.zip and /dev/null differ diff --git a/.yarn/cache/undici-types-npm-6.19.6-9d9ccfb00d-0ea9bc2576.zip b/.yarn/cache/undici-types-npm-6.20.0-bd21e669af-583ac7bbf4.zip similarity index 78% rename from .yarn/cache/undici-types-npm-6.19.6-9d9ccfb00d-0ea9bc2576.zip rename to .yarn/cache/undici-types-npm-6.20.0-bd21e669af-583ac7bbf4.zip index aada38bf9..5a7adbd51 100644 Binary files a/.yarn/cache/undici-types-npm-6.19.6-9d9ccfb00d-0ea9bc2576.zip and b/.yarn/cache/undici-types-npm-6.20.0-bd21e669af-583ac7bbf4.zip differ diff --git a/.yarn/cache/unicorn-magic-npm-0.3.0-4d15f393a4-bdd7d7c522.zip b/.yarn/cache/unicorn-magic-npm-0.3.0-4d15f393a4-bdd7d7c522.zip new file mode 100644 index 000000000..570c11eac Binary files /dev/null and b/.yarn/cache/unicorn-magic-npm-0.3.0-4d15f393a4-bdd7d7c522.zip differ diff --git a/.yarn/cache/update-browserslist-db-npm-1.0.13-ea7b8ee24d-9074b4ef34.zip b/.yarn/cache/update-browserslist-db-npm-1.0.13-ea7b8ee24d-9074b4ef34.zip deleted file mode 100644 index 1afcdf6f8..000000000 Binary files a/.yarn/cache/update-browserslist-db-npm-1.0.13-ea7b8ee24d-9074b4ef34.zip and /dev/null differ diff --git a/.yarn/cache/update-browserslist-db-npm-1.1.3-569a9be54b-87af277605.zip b/.yarn/cache/update-browserslist-db-npm-1.1.3-569a9be54b-87af277605.zip new file mode 100644 index 000000000..3c7d690a4 Binary files /dev/null and b/.yarn/cache/update-browserslist-db-npm-1.1.3-569a9be54b-87af277605.zip differ diff --git a/.yarn/cache/validate-npm-package-name-npm-5.0.0-fc061c1b84-5342a99498.zip b/.yarn/cache/validate-npm-package-name-npm-5.0.0-fc061c1b84-5342a99498.zip deleted file mode 100644 index 7ccf34ce7..000000000 Binary files a/.yarn/cache/validate-npm-package-name-npm-5.0.0-fc061c1b84-5342a99498.zip and /dev/null differ diff --git a/.yarn/cache/vite-node-npm-2.0.5-ec0bec3024-de259cdf4b.zip b/.yarn/cache/vite-node-npm-2.0.5-ec0bec3024-de259cdf4b.zip deleted file mode 100644 index 88f03ea99..000000000 Binary files a/.yarn/cache/vite-node-npm-2.0.5-ec0bec3024-de259cdf4b.zip and /dev/null differ diff --git a/.yarn/cache/vite-node-npm-3.0.8-89b14c8e2c-9a06d27d9f.zip b/.yarn/cache/vite-node-npm-3.0.8-89b14c8e2c-9a06d27d9f.zip new file mode 100644 index 000000000..0e0105086 Binary files /dev/null and b/.yarn/cache/vite-node-npm-3.0.8-89b14c8e2c-9a06d27d9f.zip differ diff --git a/.yarn/cache/vite-npm-5.2.8-618ece674d-caa40343c2.zip b/.yarn/cache/vite-npm-5.2.8-618ece674d-caa40343c2.zip deleted file mode 100644 index 13e6980df..000000000 Binary files a/.yarn/cache/vite-npm-5.2.8-618ece674d-caa40343c2.zip and /dev/null differ diff --git a/.yarn/cache/vite-npm-6.0.9-279047ec1c-6f4f27c602.zip b/.yarn/cache/vite-npm-6.0.9-279047ec1c-6f4f27c602.zip new file mode 100644 index 000000000..a0a3fc984 Binary files /dev/null and b/.yarn/cache/vite-npm-6.0.9-279047ec1c-6f4f27c602.zip differ diff --git a/.yarn/cache/vitest-npm-2.0.5-3ee23fccc7-abb916e349.zip b/.yarn/cache/vitest-npm-2.0.5-3ee23fccc7-abb916e349.zip deleted file mode 100644 index 8e9728b74..000000000 Binary files a/.yarn/cache/vitest-npm-2.0.5-3ee23fccc7-abb916e349.zip and /dev/null differ diff --git a/.yarn/cache/vitest-npm-3.0.8-53f80fdbd8-83b246ded7.zip b/.yarn/cache/vitest-npm-3.0.8-53f80fdbd8-83b246ded7.zip new file mode 100644 index 000000000..1d90a2c93 Binary files /dev/null and b/.yarn/cache/vitest-npm-3.0.8-53f80fdbd8-83b246ded7.zip differ diff --git a/.yarn/cache/walk-up-path-npm-4.0.0-d7e927f7ee-6a230b20e5.zip b/.yarn/cache/walk-up-path-npm-4.0.0-d7e927f7ee-6a230b20e5.zip new file mode 100644 index 000000000..d04e642d7 Binary files /dev/null and b/.yarn/cache/walk-up-path-npm-4.0.0-d7e927f7ee-6a230b20e5.zip differ diff --git a/.yarn/cache/wrap-ansi-npm-9.0.0-c35f82c87c-b9d91564c0.zip b/.yarn/cache/wrap-ansi-npm-9.0.0-c35f82c87c-b9d91564c0.zip deleted file mode 100644 index 7345994e5..000000000 Binary files a/.yarn/cache/wrap-ansi-npm-9.0.0-c35f82c87c-b9d91564c0.zip and /dev/null differ diff --git a/.yarn/cache/yaml-npm-2.5.0-402c6c0928-72e903fdbe.zip b/.yarn/cache/yaml-npm-2.5.0-402c6c0928-72e903fdbe.zip deleted file mode 100644 index 0f05d824c..000000000 Binary files a/.yarn/cache/yaml-npm-2.5.0-402c6c0928-72e903fdbe.zip and /dev/null differ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index aed75746d..eccee00e8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -73,7 +73,7 @@ yarn demo ## Publishing new versions -Note: This can only be done by someone with permission to the org on `npm`. +Note: This can only be done by someone with permission to the org on `npm` and requires 2FA setup. ```sh yarn lerna publish diff --git a/LICENSE b/LICENSE index 6a10a8efe..f71869887 100644 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2023 Simon Boudrias +Copyright (c) 2025 Simon Boudrias Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation diff --git a/SECURITY.md b/SECURITY.md index 7a1465916..cb0b4f4b5 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1 +1,5 @@ -Report security issues at admin@simonboudrias.com +## Security contact information + +To report a security vulnerability, please use the [Tidelift security contact](https://tidelift.com/security). Tidelift will coordinate the fix and disclosure. + +You can also send an email to admin@simonboudrias.com for direct contact with the maintainer. diff --git a/eslint.config.js b/eslint.config.js index 5b5873ed2..72d47ea2b 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -27,6 +27,7 @@ export default tseslint.config( }, }, rules: { + 'n/hashbang': 'off', 'unicorn/consistent-function-scoping': 'off', 'unicorn/filename-case': 'off', 'unicorn/no-array-callback-reference': 'off', @@ -41,17 +42,19 @@ export default tseslint.config( }, { files: ['**/*.mts', '**/*.ts'], - extends: [...tseslint.configs.recommendedTypeChecked], + extends: [...tseslint.configs.strictTypeChecked], languageOptions: { parserOptions: { - projectService: { - allowDefaultProject: ['packages/*/*.test.mts'], - defaultProject: './tsconfig.test.json', - maximumDefaultProjectFileMatchCount_THIS_WILL_SLOW_DOWN_LINTING: 20, - }, - tsconfigRootDir: import.meta.dirname, + projectService: true, }, }, + rules: { + '@typescript-eslint/restrict-template-expressions': 'off', + '@typescript-eslint/no-invalid-void-type': 'off', + '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/no-confusing-void-expression': 'off', + '@typescript-eslint/no-unnecessary-type-parameters': 'off', + }, }, { files: ['**/*.cjs'], diff --git a/integration/cjs/fixturePrompt.cjs b/integration/cjs/fixturePrompt.cjs new file mode 100644 index 000000000..192f47f0d --- /dev/null +++ b/integration/cjs/fixturePrompt.cjs @@ -0,0 +1,3 @@ +const { createPrompt } = require('@inquirer/core'); + +module.exports = createPrompt(function fixturePrompt() {}); diff --git a/integration/cjs/integration.test.cjs b/integration/cjs/integration.test.cjs index f0516e72b..a0699532a 100644 --- a/integration/cjs/integration.test.cjs +++ b/integration/cjs/integration.test.cjs @@ -6,23 +6,30 @@ const { createPrompt } = require('@inquirer/core'); const defaultInput = require('@inquirer/input').default; const inquirer = require('inquirer').default; const { createPromptModule } = require('inquirer'); +const fixturePrompt = require('./fixturePrompt.cjs'); describe('CommonJS Integration', () => { it('@inquirer/prompts should be exported', () => { - assert(input instanceof Function); + assert(typeof input === 'function'); }); it('@inquirer/input should be exported', () => { - assert(defaultInput instanceof Function); + assert(typeof defaultInput === 'function'); }); it('@inquirer/core should export createPrompt', () => { - assert(createPrompt instanceof Function); + assert(typeof createPrompt === 'function'); + }); + + it('works when prompt throws an error', async () => { + await assert.rejects(() => fixturePrompt({}), { + message: `Prompt functions must return a string.\n at ${require.resolve('./fixturePrompt.cjs')}`, + }); }); it('inquirer should be exported', () => { - assert(inquirer.prompt instanceof Function); - assert(inquirer.createPromptModule instanceof Function); - assert(createPromptModule instanceof Function); + assert(typeof inquirer.prompt === 'function'); + assert(typeof inquirer.createPromptModule === 'function'); + assert(typeof createPromptModule === 'function'); }); }); diff --git a/integration/cjs/package.json b/integration/cjs/package.json index f5dd7029e..55634c180 100644 --- a/integration/cjs/package.json +++ b/integration/cjs/package.json @@ -1,14 +1,14 @@ { - "private": true, "name": "@inquirer/cjs-integration-tests", "version": "0.0.0", - "engines": { - "node": ">=18" - }, + "private": true, "devDependencies": { "@inquirer/core": "workspace:*", "@inquirer/input": "workspace:*", "@inquirer/prompts": "workspace:*", "inquirer": "workspace:*" + }, + "engines": { + "node": ">=18" } } diff --git a/integration/esm/fixturePrompt.mjs b/integration/esm/fixturePrompt.mjs new file mode 100644 index 000000000..deee7a4e5 --- /dev/null +++ b/integration/esm/fixturePrompt.mjs @@ -0,0 +1,3 @@ +import { createPrompt } from '@inquirer/core'; + +export default createPrompt(function fixturePrompt() {}); diff --git a/integration/esm/integration.test.mjs b/integration/esm/integration.test.mjs index 6a62a4e48..be31b4a30 100644 --- a/integration/esm/integration.test.mjs +++ b/integration/esm/integration.test.mjs @@ -1,27 +1,37 @@ /* eslint-disable n/no-unsupported-features/node-builtins */ +import { createRequire } from 'node:module'; import { describe, it } from 'node:test'; -import assert from 'node:assert'; +import assert from 'node:assert/strict'; import { input } from '@inquirer/prompts'; import defaultInput from '@inquirer/input'; import { createPrompt } from '@inquirer/core'; import inquirer, { createPromptModule } from 'inquirer'; +import fixturePrompt from './fixturePrompt.mjs'; + +const require = createRequire(import.meta.url); describe('ESM Integration', () => { it('@inquirer/prompts should be exported', () => { - assert(input instanceof Function); + assert.ok(typeof input === 'function'); }); it('@inquirer/input should be exported', () => { - assert(defaultInput instanceof Function); + assert.ok(typeof defaultInput === 'function'); }); it('@inquirer/core should export createPrompt', () => { - assert(createPrompt instanceof Function); + assert.ok(typeof createPrompt === 'function'); + }); + + it('works when prompt throws an error', async () => { + await assert.rejects(() => fixturePrompt({}), { + message: `Prompt functions must return a string.\n at file://${require.resolve('./fixturePrompt.mjs')}`, + }); }); it('inquirer should be exported', () => { - assert(inquirer.prompt instanceof Function); - assert(inquirer.createPromptModule instanceof Function); - assert(createPromptModule instanceof Function); + assert.ok(typeof inquirer.prompt === 'function'); + assert.ok(typeof inquirer.createPromptModule === 'function'); + assert.ok(typeof createPromptModule === 'function'); }); }); diff --git a/integration/esm/package.json b/integration/esm/package.json index 651f69494..ee263f8bf 100644 --- a/integration/esm/package.json +++ b/integration/esm/package.json @@ -1,15 +1,15 @@ { - "private": true, - "type": "module", "name": "@inquirer/esm-integration-tests", "version": "0.0.0", - "engines": { - "node": ">=18" - }, + "private": true, + "type": "module", "devDependencies": { "@inquirer/core": "workspace:*", "@inquirer/input": "workspace:*", "@inquirer/prompts": "workspace:*", "inquirer": "workspace:*" + }, + "engines": { + "node": ">=18" } } diff --git a/internals/hoist-peer-dependencies/index.js b/internals/hoist-peer-dependencies/index.js new file mode 100644 index 000000000..463b0bf1d --- /dev/null +++ b/internals/hoist-peer-dependencies/index.js @@ -0,0 +1,35 @@ +// @ts-check + +import { writeFileSync } from 'node:fs'; +import Module from 'node:module'; +const require = Module.createRequire(import.meta.url); + +/** + * @param {string} target + */ +export function fixPeerDeps(target) { + const pkg = require(`${target}/package.json`); + + for (const name of Object.keys(pkg.dependencies ?? {})) { + // Import the dependency package.json file and parse it + let depPkg; + try { + depPkg = require(`${name}/package.json`); + } catch { + // If the sub package doesn't expose their package.json; skip it. + console.error(`Could not find package.json for ${name}. Skipping...`); + continue; + } + + for (const [peerName, peerVersion] of Object.entries(depPkg.peerDependencies ?? {})) { + // If the peer dependency is not already a dependency, add it + if (!pkg.dependencies[peerName]) { + pkg.peerDependencies = pkg.peerDependencies ?? {}; + pkg.peerDependencies[peerName] = peerVersion; + } + } + } + + // Write the updated package.json file + writeFileSync(`${target}/package.json`, JSON.stringify(pkg, null, 2) + '\n'); +} diff --git a/internals/hoist-peer-dependencies/package.json b/internals/hoist-peer-dependencies/package.json new file mode 100644 index 000000000..cbdfee843 --- /dev/null +++ b/internals/hoist-peer-dependencies/package.json @@ -0,0 +1,10 @@ +{ + "name": "@repo/hoist-peer-dependencies", + "version": "0.0.0", + "private": true, + "type": "module", + "main": "index.js", + "engines": { + "node": ">=18" + } +} diff --git a/internals/tsconfig/package.json b/internals/tsconfig/package.json new file mode 100644 index 000000000..7acfedecf --- /dev/null +++ b/internals/tsconfig/package.json @@ -0,0 +1,12 @@ +{ + "name": "@repo/tsconfig", + "version": "0.0.0", + "private": true, + "main": "tsconfig.json", + "dependencies": { + "@sindresorhus/tsconfig": "^7.0.0" + }, + "engines": { + "node": ">=18" + } +} diff --git a/internals/tsconfig/tsconfig.json b/internals/tsconfig/tsconfig.json new file mode 100644 index 000000000..5cb5b2f5a --- /dev/null +++ b/internals/tsconfig/tsconfig.json @@ -0,0 +1,11 @@ +{ + "extends": "@sindresorhus/tsconfig", + "ts-node": { + "esm": true + }, + "compilerOptions": { + "lib": ["es2023"], + "skipLibCheck": false, + "esModuleInterop": true + } +} diff --git a/package.json b/package.json index 59341edab..1470a1716 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,6 @@ { - "private": true, - "type": "module", "name": "@inquirer/root", - "author": "Simon Boudrias ", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "packageManager": "yarn@4.4.1+sha256.920b4530755296dc2ce8b4351f057d4a26429524fcb2789d277560d94837c27e", + "private": true, "keywords": [ "answer", "answers", @@ -47,53 +40,63 @@ "yo", "zsh" ], - "devDependencies": { - "@arethetypeswrong/cli": "^0.15.4", - "@eslint/js": "^9.9.1", - "@sindresorhus/tsconfig": "^6.0.0", - "@types/node": "^22.5.2", - "@vitest/coverage-v8": "^2.0.5", - "@vitest/ui": "^2.0.5", - "eslint": "^9.9.1", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-n": "^17.10.2", - "eslint-plugin-prettier": "^5.2.1", - "eslint-plugin-unicorn": "^55.0.0", - "globals": "^15.9.0", - "globby": "^14.0.2", - "husky": "^9.1.5", - "lerna": "^8.1.8", - "lint-staged": "^15.2.10", - "prettier": "^3.3.3", - "ts-node": "^10.9.2", - "turbo": "^2.1.1", - "typescript": "^5.5.4", - "typescript-eslint": "^8.3.0", - "vitest": "^2.0.5" - }, - "resolutions": { - "type-fest": "^4.0.0" + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" }, + "license": "MIT", + "author": "Simon Boudrias ", + "type": "module", "workspaces": [ "packages/*", - "integration/*" + "integration/*", + "internals/*" ], "scripts": { + "demo": "node --watch-path=packages/ packages/demo/dist/esm/index.js", + "dev": "turbo watch tsc", "prepare": "husky && turbo tsc attw", + "prepack": "find . -type f -name 'README*' -exec sed -i '' -e 's/utm_source=github/utm_source=npmjs/g' {} +", + "postpack": "git restore packages/**/README.md", "setup": "node ./tools/setup-packages.mjs", "pretest": "turbo tsc && eslint . && yarn tsc:test", "test": "vitest --run packages && node --test integration/**/*.test.*", - "dev": "turbo watch tsc", - "demo": "node --watch-path=packages/ packages/demo/", "tsc": "turbo tsc", - "tsc:test": "tsc -p tsconfig.test.json" + "tsc:test": "tsc -p tsconfig.json" }, - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, - "lint-staged": { - "*": "yarn prettier --write", + "nano-staged": { + "*": "yarn prettier --write --ignore-unknown", "*.m?[jt]sx?": "yarn eslint --fix" + }, + "resolutions": { + "type-fest": "^4.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.22.0", + "@repo/hoist-peer-dependencies": "workspace:*", + "@repo/tsconfig": "workspace:*", + "@types/node": "^22.13.10", + "@vitest/coverage-v8": "^3.0.8", + "@vitest/ui": "^3.0.8", + "eslint": "^9.22.0", + "eslint-config-prettier": "^10.1.1", + "eslint-plugin-n": "^17.16.2", + "eslint-plugin-prettier": "^5.2.3", + "eslint-plugin-unicorn": "^57.0.0", + "globals": "^16.0.0", + "globby": "^14.1.0", + "husky": "^9.1.7", + "lerna": "^8.2.1", + "nano-staged": "^0.8.0", + "prettier": "^3.5.3", + "ts-node": "^10.9.2", + "turbo": "^2.4.4", + "typescript": "^5.8.2", + "typescript-eslint": "^8.26.0", + "vitest": "^3.0.8" + }, + "packageManager": "yarn@4.5.3+sha512.3003a14012e2987072d244c720506549c1aab73ee728208f1b2580a9fd67b92d61ba6b08fe93f6dce68fd771e3af1e59a0afa28dd242dd0940d73b95fedd4e90", + "engines": { + "node": ">=18" } } diff --git a/packages/checkbox/.tshy/build.json b/packages/checkbox/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/checkbox/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/checkbox/.tshy/commonjs.json b/packages/checkbox/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/checkbox/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/checkbox/.tshy/esm.json b/packages/checkbox/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/checkbox/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/checkbox/README.md b/packages/checkbox/README.md index 5bef6ba48..6dfc4b8ec 100644 --- a/packages/checkbox/README.md +++ b/packages/checkbox/README.md @@ -73,15 +73,16 @@ const answer = await checkbox({ ## Options -| Property | Type | Required | Description | -| -------- | --------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| message | `string` | yes | The question to ask | -| choices | `Choice[]` | yes | List of the available choices. | -| pageSize | `number` | no | By default, lists of choice longer than 7 will be paginated. Use this option to control how many choices will appear on the screen at once. | -| loop | `boolean` | no | Defaults to `true`. When set to `false`, the cursor will be constrained to the top and bottom of the choice list without looping. | -| required | `boolean` | no | When set to `true`, ensures at least one choice must be selected. | -| validate | `async (Choice[]) => boolean \| string` | no | On submit, validate the choices. When returning a string, it'll be used as the error message displayed to the user. Note: returning a rejected promise, we'll assume a code error happened and crash. | -| theme | [See Theming](#Theming) | no | Customize look of the prompt. | +| Property | Type | Required | Description | +| --------- | --------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| message | `string` | yes | The question to ask | +| choices | `Choice[]` | yes | List of the available choices. | +| pageSize | `number` | no | By default, lists of choice longer than 7 will be paginated. Use this option to control how many choices will appear on the screen at once. | +| loop | `boolean` | no | Defaults to `true`. When set to `false`, the cursor will be constrained to the top and bottom of the choice list without looping. | +| required | `boolean` | no | When set to `true`, ensures at least one choice must be selected. | +| validate | `async (Choice[]) => boolean \| string` | no | On submit, validate the choices. When returning a string, it'll be used as the error message displayed to the user. Note: returning a rejected promise, we'll assume a code error happened and crash. | +| shortcuts | [See Shortcuts](#Shortcuts) | no | Customize shortcut keys for `all` and `invert`. | +| theme | [See Theming](#Theming) | no | Customize look of the prompt. | `Separator` objects can be used in the `choices` array to render non-selectable lines in the choice list. By default it'll render a line, but you can provide the text as argument (`new Separator('-- Dependencies --')`). This option is often used to add labels to groups within long list of options. @@ -113,20 +114,31 @@ Also note the `choices` array can contain `Separator`s to help organize long lis `choices` can also be an array of string, in which case the string will be used both as the `value` and the `name`. +## Shortcuts + +You can customize the shortcut keys for `all` and `invert` or disable them by setting them to `null`. + +```ts +type Shortcuts = { + all?: string | null; // default: 'a' + invert?: string | null; // default: 'i' +}; +``` + ## Theming You can theme a prompt by passing a `theme` object option. The theme object only need to includes the keys you wish to modify, we'll fallback on the defaults for the rest. ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; defaultAnswer: (text: string) => string; help: (text: string) => string; diff --git a/packages/checkbox/checkbox.test.mts b/packages/checkbox/checkbox.test.ts similarity index 82% rename from packages/checkbox/checkbox.test.mts rename to packages/checkbox/checkbox.test.ts index b0a3719db..a165e0a8a 100644 --- a/packages/checkbox/checkbox.test.mts +++ b/packages/checkbox/checkbox.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect } from 'vitest'; import { render } from '@inquirer/testing'; import { ValidationError } from '@inquirer/core'; -import checkbox, { Separator } from './src/index.mjs'; +import checkbox, { Separator } from './src/index.js'; const numberedChoices = [ { value: 1 }, @@ -55,7 +55,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([2, 3]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 2, 3"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 2, 3"'); }); it('works with string choices', async () => { @@ -83,7 +83,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(['Option B']); - expect(getScreen()).toMatchInlineSnapshot(`"? Select a number Option B"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Select a number Option B"`); }); it('does not scroll up beyond first item when not looping', async () => { @@ -121,7 +121,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([1]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 1"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 1"'); }); it('does not scroll up beyond first selectable item when not looping', async () => { @@ -159,7 +159,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([1]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 1"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 1"'); }); it('does not scroll down beyond last option when not looping', async () => { @@ -198,7 +198,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([12]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 12"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 12"'); }); it('does not scroll down beyond last selectable option when not looping', async () => { @@ -237,7 +237,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([12]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 12"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 12"'); }); it('use number key to select an option', async () => { @@ -261,7 +261,53 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([4]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 4"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 4"'); + }); + + it('allow preselecting an option', async () => { + const { answer, events, getScreen } = await render(checkbox, { + message: 'Select a number', + choices: [{ value: 1 }, { value: 2, checked: true }], + }); + + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number (Press to select, to toggle all, to invert + selection, and to proceed) + ❯◯ 1 + ◉ 2" + `); + + events.keypress('enter'); + await expect(answer).resolves.toEqual([2]); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 2"'); + }); + + it('allow preselecting and changing that selection', async () => { + const { answer, events, getScreen } = await render(checkbox, { + message: 'Select a number', + choices: [{ value: 1 }, { value: 2, checked: true }], + }); + + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number (Press to select, to toggle all, to invert + selection, and to proceed) + ❯◯ 1 + ◉ 2" + `); + + events.keypress('space'); + events.keypress('down'); + events.keypress('space'); + + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number + ◉ 1 + ❯◯ 2" + `); + + events.keypress('enter'); + await expect(answer).resolves.toEqual([1]); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 1"'); }); it('allow setting a smaller page size', async () => { @@ -368,7 +414,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(['pepperoni']); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping Pepperoni"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping Pepperoni"'); }); it('skip disabled options by number key', async () => { @@ -400,7 +446,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping"'); }); it('skip separator by arrow keys', async () => { @@ -432,7 +478,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(['pepperoni']); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping Pepperoni"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping Pepperoni"'); }); it('skip separator by number key', async () => { @@ -464,7 +510,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping"'); }); it('allow select all', async () => { @@ -589,7 +635,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number"'); }); it('allow customizing help tip', async () => { @@ -615,7 +661,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([]); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number"'); }); it('throws if all choices are disabled', async () => { @@ -826,7 +872,7 @@ describe('checkbox prompt', () => { await answer; expect(getScreen()).toMatchInlineSnapshot( - '"? Select your favourite number. You have selected 1 and 2 more."', + '"✔ Select your favourite number. You have selected 1 and 2 more."', ); }); @@ -872,7 +918,9 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(['2cc9e311', '3272b94a']); - expect(getScreen()).toMatchInlineSnapshot(`"? Select a commit 2cc9e311, 3272b94a"`); + expect(getScreen()).toMatchInlineSnapshot( + `"✔ Select a commit 2cc9e311, 3272b94a"`, + ); }); it('using allChoices parameter', async () => { @@ -899,7 +947,7 @@ describe('checkbox prompt', () => { await answer; expect(getScreen()).toMatchInlineSnapshot( - '"? Select your favourite number. You have selected 2 out of 12 options."', + '"✔ Select your favourite number. You have selected 2 out of 12 options."', ); }); }); @@ -961,7 +1009,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([2]); - expect(getScreen()).toMatchInlineSnapshot(`"? Select a number 2"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Select a number 2"`); }); it('helpMode: always', async () => { @@ -1020,7 +1068,7 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([2]); - expect(getScreen()).toMatchInlineSnapshot(`"? Select a number 2"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Select a number 2"`); }); it('helpMode: never', async () => { @@ -1073,7 +1121,123 @@ describe('checkbox prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual([2]); - expect(getScreen()).toMatchInlineSnapshot(`"? Select a number 2"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Select a number 2"`); }); }); + + describe('shortcuts', () => { + it('allow select all with customized key', async () => { + const { answer, events, getScreen } = await render(checkbox, { + message: 'Select a number', + choices: numberedChoices, + shortcuts: { + all: 'b', + }, + }); + + events.keypress('4'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number (Press to select, to toggle all, to invert + selection, and to proceed) + ◯ 1 + ◯ 2 + ◯ 3 + ❯◉ 4 + ◯ 5 + ◯ 6 + ◯ 7" + `); + + events.keypress('b'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number (Press to select, to toggle all, to invert + selection, and to proceed) + ◉ 1 + ◉ 2 + ◉ 3 + ❯◉ 4 + ◉ 5 + ◉ 6 + ◉ 7" + `); + + events.keypress('b'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number (Press to select, to toggle all, to invert + selection, and to proceed) + ◯ 1 + ◯ 2 + ◯ 3 + ❯◯ 4 + ◯ 5 + ◯ 6 + ◯ 7" + `); + + events.keypress('b'); + events.keypress('enter'); + await expect(answer).resolves.toEqual(numberedChoices.map(({ value }) => value)); + }); + }); + + it('allow inverting selection with customized key', async () => { + const { answer, events, getScreen } = await render(checkbox, { + message: 'Select a number', + choices: numberedChoices, + shortcuts: { + invert: 'j', + }, + }); + + const unselect = [2, 4, 6, 7, 8, 11]; + unselect.forEach((value) => { + events.keypress(String(value)); + }); + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number (Press to select, to toggle all, to invert + selection, and to proceed) + ◯ 5 + ◉ 6 + ◉ 7 + ❯◉ 8 + ◯ 9 + ◯ 10 + ◯ 11" + `); + + events.keypress('j'); + events.keypress('enter'); + await expect(answer).resolves.not.toContain(unselect); + }); + + it('disable `all` and `invert` keys', async () => { + const { events, getScreen } = await render(checkbox, { + message: 'Select a number', + choices: numberedChoices, + shortcuts: { + all: null, + invert: null, + }, + }); + + // All options are deselected and should not change if default shortcuts are pressed + const expectedScreen = getScreen(); + expect(expectedScreen).toMatchInlineSnapshot(` + "? Select a number (Press to select, and to proceed) + ❯◯ 1 + ◯ 2 + ◯ 3 + ◯ 4 + ◯ 5 + ◯ 6 + ◯ 7 + (Use arrow keys to reveal more choices)" + `); + + events.keypress('a'); + expect(getScreen()).toBe(expectedScreen); + + events.keypress('i'); + expect(getScreen()).toBe(expectedScreen); + }); }); diff --git a/packages/checkbox/package.json b/packages/checkbox/package.json index aa36ffa0b..aaa5a1c85 100644 --- a/packages/checkbox/package.json +++ b/packages/checkbox/package.json @@ -1,19 +1,7 @@ { "name": "@inquirer/checkbox", - "version": "2.5.0", - "engines": { - "node": ">=18" - }, + "version": "4.1.4", "description": "Inquirer checkbox prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -53,39 +41,72 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/checkbox/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", + "@inquirer/core": "^10.1.9", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.5", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "devDependencies": { - "@inquirer/testing": "^2.1.32" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "engines": { + "node": ">=18" }, "publishConfig": { "access": "public" }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/checkbox/src/index.mts b/packages/checkbox/src/index.ts similarity index 89% rename from packages/checkbox/src/index.mts rename to packages/checkbox/src/index.ts index 8ac07a5c3..36aa3c495 100644 --- a/packages/checkbox/src/index.mts +++ b/packages/checkbox/src/index.ts @@ -15,6 +15,7 @@ import { ValidationError, Separator, type Theme, + type Status, } from '@inquirer/core'; import type { PartialDeep } from '@inquirer/type'; import colors from 'yoctocolors-cjs'; @@ -38,6 +39,11 @@ type CheckboxTheme = { helpMode: 'always' | 'never' | 'auto'; }; +type CheckboxShortcuts = { + all?: string | null; + invert?: string | null; +}; + const checkboxTheme: CheckboxTheme = { icon: { checked: colors.green(figures.circleFilled), @@ -91,6 +97,7 @@ type CheckboxConfig< choices: ReadonlyArray>, ) => boolean | string | Promise; theme?: PartialDeep>; + shortcuts?: CheckboxShortcuts; }; type Item = NormalizedChoice | Separator; @@ -142,7 +149,7 @@ function normalizeChoices( } export default createPrompt( - (config: CheckboxConfig, done: (value: Array) => void) => { + (config: CheckboxConfig, done: (value: Array) => void) => { const { instructions, pageSize = 7, @@ -150,10 +157,11 @@ export default createPrompt( required, validate = () => true, } = config; + const shortcuts = { all: 'a', invert: 'i', ...config.shortcuts }; const theme = makeTheme(checkboxTheme, config.theme); - const prefix = usePrefix({ theme }); const firstRender = useRef(true); - const [status, setStatus] = useState('pending'); + const [status, setStatus] = useState('idle'); + const prefix = usePrefix({ status, theme }); const [items, setItems] = useState>>( normalizeChoices(config.choices), ); @@ -162,7 +170,7 @@ export default createPrompt( const first = items.findIndex(isSelectable); const last = items.findLastIndex(isSelectable); - if (first < 0) { + if (first === -1) { throw new ValidationError( '[checkbox prompt] No selectable choices. All choices are disabled.', ); @@ -204,10 +212,10 @@ export default createPrompt( setError(undefined); setShowHelpTip(false); setItems(items.map((choice, i) => (i === active ? toggle(choice) : choice))); - } else if (key.name === 'a') { + } else if (key.name === shortcuts.all) { const selectAll = items.some((choice) => isSelectable(choice) && !choice.checked); setItems(items.map(check(selectAll))); - } else if (key.name === 'i') { + } else if (key.name === shortcuts.invert) { setItems(items.map(toggle)); } else if (isNumberKey(key)) { // Adjust index to start at 1 @@ -220,9 +228,9 @@ export default createPrompt( } }); - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); - let description; + let description: string | undefined; const page = usePagination({ items, active, @@ -272,16 +280,19 @@ export default createPrompt( } else { const keys = [ `${theme.style.key('space')} to select`, - `${theme.style.key('a')} to toggle all`, - `${theme.style.key('i')} to invert selection`, + shortcuts.all ? `${theme.style.key(shortcuts.all)} to toggle all` : '', + shortcuts.invert + ? `${theme.style.key(shortcuts.invert)} to invert selection` + : '', `and ${theme.style.key('enter')} to proceed`, ]; - helpTipTop = ` (Press ${keys.join(', ')})`; + helpTipTop = ` (Press ${keys.filter((key) => key !== '').join(', ')})`; } if ( items.length > pageSize && (theme.helpMode === 'always' || + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition (theme.helpMode === 'auto' && firstRender.current)) ) { helpTipBottom = `\n${theme.style.help('(Use arrow keys to reveal more choices)')}`; diff --git a/packages/checkbox/tsconfig.cjs.json b/packages/checkbox/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/checkbox/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/checkbox/tsconfig.json b/packages/checkbox/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/checkbox/tsconfig.json +++ b/packages/checkbox/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/confirm/.tshy/build.json b/packages/confirm/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/confirm/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/confirm/.tshy/commonjs.json b/packages/confirm/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/confirm/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/confirm/.tshy/esm.json b/packages/confirm/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/confirm/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/confirm/README.md b/packages/confirm/README.md index 09400eb08..fe2e5f023 100644 --- a/packages/confirm/README.md +++ b/packages/confirm/README.md @@ -73,14 +73,14 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; defaultAnswer: (text: string) => string; }; }; diff --git a/packages/confirm/confirm.test.mts b/packages/confirm/confirm.test.ts similarity index 70% rename from packages/confirm/confirm.test.mts rename to packages/confirm/confirm.test.ts index ff36c1d48..49e1e6160 100644 --- a/packages/confirm/confirm.test.mts +++ b/packages/confirm/confirm.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { render } from '@inquirer/testing'; -import confirm from './src/index.mjs'; +import confirm from './src/index.js'; describe('confirm prompt', () => { it('handles "yes"', async () => { @@ -16,7 +16,7 @@ describe('confirm prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(true); - expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? yes"'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Do you want to proceed? Yes"`); }); it('handles "no"', async () => { @@ -32,7 +32,7 @@ describe('confirm prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(false); - expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? no"'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Do you want to proceed? No"`); }); it('handles "y"', async () => { @@ -48,7 +48,7 @@ describe('confirm prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(true); - expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? yes"'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Do you want to proceed? Yes"`); }); it('handles "n"', async () => { @@ -64,7 +64,7 @@ describe('confirm prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(false); - expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? no"'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Do you want to proceed? No"`); }); it('uses default (yes) on empty input', async () => { @@ -78,7 +78,7 @@ describe('confirm prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(true); - expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? yes"'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Do you want to proceed? Yes"`); }); it('uses default (no) on empty input', async () => { @@ -92,7 +92,7 @@ describe('confirm prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(false); - expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? no"'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Do you want to proceed? No"`); }); it('uses default on gibberish input', async () => { @@ -107,7 +107,7 @@ describe('confirm prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(true); - expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? yes"'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Do you want to proceed? Yes"`); }); it('supports transformer option', async () => { @@ -121,6 +121,27 @@ describe('confirm prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(true); - expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? Oui!"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Do you want to proceed? Oui!"'); + }); + + it('toggle between values with the tab key', async () => { + const { answer, events, getScreen } = await render(confirm, { + message: 'Do you want to proceed?', + }); + + expect(getScreen()).toMatchInlineSnapshot('"? Do you want to proceed? (Y/n)"'); + + events.keypress('tab'); + expect(getScreen()).toMatchInlineSnapshot(`"? Do you want to proceed? (Y/n) No"`); + + events.keypress('tab'); + expect(getScreen()).toMatchInlineSnapshot(`"? Do you want to proceed? (Y/n) Yes"`); + + events.keypress('tab'); + expect(getScreen()).toMatchInlineSnapshot(`"? Do you want to proceed? (Y/n) No"`); + + events.keypress('enter'); + await expect(answer).resolves.toEqual(false); + expect(getScreen()).toMatchInlineSnapshot('"✔ Do you want to proceed? No"'); }); }); diff --git a/packages/confirm/package.json b/packages/confirm/package.json index d4c5ae762..4d461ae7c 100644 --- a/packages/confirm/package.json +++ b/packages/confirm/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/confirm", - "version": "3.2.0", + "version": "5.1.8", "description": "Inquirer confirm prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -50,39 +41,69 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/confirm/README.md", - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" }, - "devDependencies": { - "@inquirer/testing": "^2.1.32" + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "attw": "attw --pack", + "tsc": "tshy" }, - "publishConfig": { - "access": "public" + "dependencies": { + "@inquirer/core": "^10.1.9", + "@inquirer/type": "^3.0.5" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, "engines": { "node": ">=18" }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "publishConfig": { + "access": "public" + }, + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/confirm/src/index.mts b/packages/confirm/src/index.ts similarity index 54% rename from packages/confirm/src/index.mts rename to packages/confirm/src/index.ts index ed01ec53a..64fa6595e 100644 --- a/packages/confirm/src/index.mts +++ b/packages/confirm/src/index.ts @@ -6,6 +6,7 @@ import { usePrefix, makeTheme, type Theme, + type Status, } from '@inquirer/core'; import type { PartialDeep } from '@inquirer/type'; @@ -16,22 +17,35 @@ type ConfirmConfig = { theme?: PartialDeep; }; +function getBooleanValue(value: string, defaultValue?: boolean): boolean { + let answer = defaultValue !== false; + if (/^(y|yes)/i.test(value)) answer = true; + else if (/^(n|no)/i.test(value)) answer = false; + return answer; +} + +function boolToString(value: boolean): string { + return value ? 'Yes' : 'No'; +} + export default createPrompt((config, done) => { - const { transformer = (answer) => (answer ? 'yes' : 'no') } = config; - const [status, setStatus] = useState('pending'); + const { transformer = boolToString } = config; + const [status, setStatus] = useState('idle'); const [value, setValue] = useState(''); const theme = makeTheme(config.theme); - const prefix = usePrefix({ theme }); + const prefix = usePrefix({ status, theme }); useKeypress((key, rl) => { if (isEnterKey(key)) { - let answer = config.default !== false; - if (/^(y|yes)/i.test(value)) answer = true; - else if (/^(n|no)/i.test(value)) answer = false; - + const answer = getBooleanValue(value, config.default); setValue(transformer(answer)); setStatus('done'); done(answer); + } else if (key.name === 'tab') { + const answer = boolToString(!getBooleanValue(value, config.default)); + rl.clearLine(0); // Remove the tab character. + rl.write(answer); + setValue(answer); } else { setValue(rl.line); } @@ -47,6 +61,6 @@ export default createPrompt((config, done) => { )}`; } - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); return `${prefix} ${message}${defaultValue} ${formattedValue}`; }); diff --git a/packages/confirm/tsconfig.cjs.json b/packages/confirm/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/confirm/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/confirm/tsconfig.json b/packages/confirm/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/confirm/tsconfig.json +++ b/packages/confirm/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/core/.tshy/build.json b/packages/core/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/core/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/core/.tshy/commonjs.json b/packages/core/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/core/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/core/.tshy/esm.json b/packages/core/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/core/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/core/README.md b/packages/core/README.md index 5b55a82ae..2ae241817 100644 --- a/packages/core/README.md +++ b/packages/core/README.md @@ -154,7 +154,7 @@ All default prompts, and most custom ones, uses a prefix at the beginning of the ```ts const input = createPrompt((config, done) => { - const prefix = usePrefix({ isLoading }); + const prefix = usePrefix({ status }); return `${prefix} My question`; }); @@ -265,7 +265,7 @@ type PromptConfig = { export default createPrompt((config, done) => { const theme = makeTheme(config.theme); - const prefix = usePrefix({ isLoading, theme }); + const prefix = usePrefix({ status, theme }); return `${prefix} ${theme.style.highlight('hello')}`; }); @@ -290,24 +290,24 @@ type PromptConfig = { export default createPrompt((config, done) => { const theme = makeTheme(promptTheme, config.theme); - const prefix = usePrefix({ isLoading, theme }); + const prefix = usePrefix({ status, theme }); return `${prefix} ${theme.icon}`; }); ``` -The [default theme keys cover](https://github.com/SBoudrias/Inquirer.js/blob/theme/packages/core/src/lib/theme.mts): +The [default theme keys cover](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/core/src/lib/theme.ts): ```ts type DefaultTheme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; defaultAnswer: (text: string) => string; help: (text: string) => string; @@ -321,14 +321,14 @@ type DefaultTheme = { You can refer to any `@inquirer/prompts` prompts for real examples: -- [Confirm Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/confirm/src/index.mts) -- [Input Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/input/src/index.mts) -- [Password Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/password/src/index.mts) -- [Editor Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/editor/src/index.mts) -- [Select Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/select/src/index.mts) -- [Checkbox Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/checkbox/src/index.mts) -- [Rawlist Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/rawlist/src/index.mts) -- [Expand Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/expand/src/index.mts) +- [Confirm Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/confirm/src/index.ts) +- [Input Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/input/src/index.ts) +- [Password Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/password/src/index.ts) +- [Editor Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/editor/src/index.ts) +- [Select Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/select/src/index.ts) +- [Checkbox Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/checkbox/src/index.ts) +- [Rawlist Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/rawlist/src/index.ts) +- [Expand Prompt](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/expand/src/index.ts) ```ts import colors from 'yoctocolors'; @@ -338,11 +338,12 @@ import { useKeypress, isEnterKey, usePrefix, + type Status, } from '@inquirer/core'; const confirm = createPrompt( (config, done) => { - const [status, setStatus] = useState('pending'); + const [status, setStatus] = useState('idle'); const [value, setValue] = useState(''); const prefix = usePrefix({}); diff --git a/packages/core/core.test.mts b/packages/core/core.test.ts similarity index 93% rename from packages/core/core.test.mts rename to packages/core/core.test.ts index 1e56eb295..d991307c5 100644 --- a/packages/core/core.test.mts +++ b/packages/core/core.test.ts @@ -2,9 +2,8 @@ import { AsyncResource } from 'node:async_hooks'; import { Stream } from 'node:stream'; import { describe, it, expect, vi } from 'vitest'; import { render } from '@inquirer/testing'; -import stripAnsi from 'strip-ansi'; +import { stripVTControlCharacters } from 'node:util'; import ansiEscapes from 'ansi-escapes'; -import spinners from 'cli-spinners'; import { createPrompt, useEffect, @@ -23,7 +22,9 @@ import { ValidationError, HookError, type KeypressEvent, -} from './src/index.mjs'; + makeTheme, + type Status, +} from './src/index.js'; describe('createPrompt()', () => { it('onKeypress: allow to implement custom behavior on keypress', async () => { @@ -366,17 +367,27 @@ describe('createPrompt()', () => { it('usePrefix() renders loader and prefix', async () => { vi.useFakeTimers(); const delay = 300; - const { interval } = spinners.dots; - const totalDuration = interval * spinners.dots.frames.length; + let totalDuration = 0; + let interval = 0; const Prompt = (config: { message: string }, done: (value: string) => void) => { - const [status, setStatus] = useState('loading'); - const prefix = usePrefix({ isLoading: status === 'loading' }); + const theme = makeTheme({ + prefix: { + idle: '?', + done: '✔', + unicorn: '🦄', + }, + }); + const [status, setStatus] = useState('loading'); + const prefix = usePrefix({ status, theme }); + + interval = theme.spinner.interval; + totalDuration = interval * theme.spinner.frames.length; useEffect(() => { setTimeout( AsyncResource.bind(() => { - setStatus('idle'); + setStatus('done'); }), totalDuration, ); @@ -386,6 +397,9 @@ describe('createPrompt()', () => { if (isEnterKey(event)) { done(''); } + if (isSpaceKey(event)) { + setStatus('unicorn'); + } }); return `${prefix} ${config.message}`; @@ -408,7 +422,10 @@ describe('createPrompt()', () => { expect(getScreen()).toMatchInlineSnapshot(`"⠸ Question"`); vi.advanceTimersByTime(totalDuration); - expect(getScreen()).toMatchInlineSnapshot(`"? Question"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Question"`); + + events.keypress('space'); + expect(getScreen()).toMatchInlineSnapshot(`"🦄 Question"`); vi.useRealTimers(); @@ -473,7 +490,7 @@ describe('createPrompt()', () => { }); it('clear timeout when force closing', { timeout: 1000 }, async () => { - let exitSpy = vi.fn(); + const exitSpy = vi.fn(); const prompt = createPrompt( (config: { message: string }, done: (value: string) => void) => { const timeout = useRef(); @@ -486,7 +503,7 @@ describe('createPrompt()', () => { timeout.current = setTimeout(() => {}, 1000); }); - exitSpy = vi.fn(() => { + exitSpy.mockImplementation(() => { clearTimeout(timeout.current); cleaned.current = true; // We call done explicitly, as onSignalExit is not triggered in this case @@ -562,6 +579,7 @@ it('allow cancelling the prompt multiple times', async () => { const { answer, events } = await render(prompt, { message: 'Question' }); answer.cancel(); + answer.cancel(); events.keypress('enter'); @@ -614,6 +632,18 @@ it('fail on aborted signals', async () => { }); describe('Error handling', () => { + it('gracefully error on missing content', async () => { + // @ts-expect-error Testing an invalid behavior. + const prompt = createPrompt(function TestPrompt() {}); + const { answer } = await render(prompt, {}); + await expect(answer).rejects.toMatchInlineSnapshot( + ` + [Error: Prompt functions must return a string. + at ${import.meta.filename}] + `, + ); + }); + it('surface errors in render functions', async () => { const Prompt = () => { throw new Error('Error in render function'); @@ -714,7 +744,7 @@ describe('Separator', () => { }); it('renders separator', () => { - expect(stripAnsi(new Separator().separator)).toMatchInlineSnapshot( + expect(stripVTControlCharacters(new Separator().separator)).toMatchInlineSnapshot( '"──────────────"', ); expect(new Separator('===').separator).toEqual('==='); diff --git a/packages/core/lines.test.mts b/packages/core/lines.test.ts similarity index 98% rename from packages/core/lines.test.mts rename to packages/core/lines.test.ts index 50190a57d..54fb2ab80 100644 --- a/packages/core/lines.test.mts +++ b/packages/core/lines.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect } from 'vitest'; -import { lines } from './src/lib/pagination/lines.mjs'; +import { lines } from './src/lib/pagination/lines.js'; function renderResult(result: string[]) { return `\n${result.join('\n')}\n`; diff --git a/packages/core/package.json b/packages/core/package.json index 1788faa43..0b32625b5 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,19 +1,7 @@ { "name": "@inquirer/core", - "version": "9.1.0", - "engines": { - "node": ">=18" - }, + "version": "10.1.9", "description": "Core Inquirer prompt API", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -53,47 +41,78 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/core/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.5.2", - "@types/wrap-ansi": "^3.0.0", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.5", "ansi-escapes": "^4.3.2", - "cli-spinners": "^2.9.2", "cli-width": "^4.1.0", - "mute-stream": "^1.0.0", + "mute-stream": "^2.0.0", "signal-exit": "^4.1.0", - "strip-ansi": "^6.0.1", "wrap-ansi": "^6.2.0", "yoctocolors-cjs": "^2.1.2" }, "devDependencies": { - "@inquirer/testing": "^2.1.32" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.13.10", + "@types/wrap-ansi": "^3.0.0", + "tshy": "^3.0.2" }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + }, + "engines": { + "node": ">=18" }, "publishConfig": { "access": "public" }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } - }, - "sideEffects": false + } } diff --git a/packages/core/src/index.mts b/packages/core/src/index.mts deleted file mode 100644 index 03a7e7100..000000000 --- a/packages/core/src/index.mts +++ /dev/null @@ -1,13 +0,0 @@ -export * from './lib/key.mjs'; -export * from './lib/errors.mjs'; -export { usePrefix } from './lib/use-prefix.mjs'; -export { useState } from './lib/use-state.mjs'; -export { useEffect } from './lib/use-effect.mjs'; -export { useMemo } from './lib/use-memo.mjs'; -export { useRef } from './lib/use-ref.mjs'; -export { useKeypress } from './lib/use-keypress.mjs'; -export { makeTheme } from './lib/make-theme.mjs'; -export type { Theme } from './lib/theme.mjs'; -export { usePagination } from './lib/pagination/use-pagination.mjs'; -export { createPrompt } from './lib/create-prompt.mjs'; -export { Separator } from './lib/Separator.mjs'; diff --git a/packages/core/src/index.ts b/packages/core/src/index.ts new file mode 100644 index 000000000..5d67c0d51 --- /dev/null +++ b/packages/core/src/index.ts @@ -0,0 +1,13 @@ +export * from './lib/key.js'; +export * from './lib/errors.js'; +export { usePrefix } from './lib/use-prefix.js'; +export { useState } from './lib/use-state.js'; +export { useEffect } from './lib/use-effect.js'; +export { useMemo } from './lib/use-memo.js'; +export { useRef } from './lib/use-ref.js'; +export { useKeypress } from './lib/use-keypress.js'; +export { makeTheme } from './lib/make-theme.js'; +export type { Theme, Status } from './lib/theme.js'; +export { usePagination } from './lib/pagination/use-pagination.js'; +export { createPrompt } from './lib/create-prompt.js'; +export { Separator } from './lib/Separator.js'; diff --git a/packages/core/src/lib/Separator.mts b/packages/core/src/lib/Separator.ts similarity index 100% rename from packages/core/src/lib/Separator.mts rename to packages/core/src/lib/Separator.ts diff --git a/packages/core/src/lib/create-prompt.mts b/packages/core/src/lib/create-prompt.mts deleted file mode 100644 index 2cbe5ebc3..000000000 --- a/packages/core/src/lib/create-prompt.mts +++ /dev/null @@ -1,121 +0,0 @@ -import * as readline from 'node:readline'; -import { AsyncResource } from 'node:async_hooks'; -import { type Prompt, type Prettify } from '@inquirer/type'; -import MuteStream from 'mute-stream'; -import { onExit as onSignalExit } from 'signal-exit'; -import ScreenManager from './screen-manager.mjs'; -import { CancelablePromise, type InquirerReadline } from '@inquirer/type'; -import { withHooks, effectScheduler } from './hook-engine.mjs'; -import { AbortPromptError, CancelPromptError, ExitPromptError } from './errors.mjs'; - -type ViewFunction = ( - config: Prettify, - done: (value: Value) => void, -) => string | [string, string | undefined]; - -export function createPrompt(view: ViewFunction) { - const prompt: Prompt = (config, context = {}) => { - // Default `input` to stdin - const { input = process.stdin, signal } = context; - - // Add mute capabilities to the output - const output = new MuteStream(); - output.pipe(context.output ?? process.stdout); - - const rl = readline.createInterface({ - terminal: true, - input, - output, - }) as InquirerReadline; - const screen = new ScreenManager(rl); - - const cleanups = new Set<() => void>(); - const { promise, resolve, reject } = CancelablePromise.withResolver(); - - function onExit() { - cleanups.forEach((cleanup) => cleanup()); - - screen.done({ clearContent: Boolean(context?.clearPromptOnDone) }); - output.end(); - } - - function fail(error: unknown) { - onExit(); - reject(error); - } - - if (signal) { - const abort = () => fail(new AbortPromptError({ cause: signal.reason })); - if (signal.aborted) { - abort(); - return promise; - } - signal.addEventListener('abort', abort); - cleanups.add(() => signal.removeEventListener('abort', abort)); - } - - withHooks(rl, (cycle) => { - cleanups.add( - onSignalExit((code, signal) => { - fail( - new ExitPromptError(`User force closed the prompt with ${code} ${signal}`), - ); - }), - ); - - const hooksCleanup = AsyncResource.bind(() => { - try { - effectScheduler.clearAll(); - } catch (error) { - reject(error); - } - }); - cleanups.add(hooksCleanup); - - // Re-renders only happen when the state change; but the readline cursor could change position - // and that also requires a re-render (and a manual one because we mute the streams). - // We set the listener after the initial workLoop to avoid a double render if render triggered - // by a state change sets the cursor to the right position. - const checkCursorPos = () => screen.checkCursorPos(); - rl.input.on('keypress', checkCursorPos); - cleanups.add(() => rl.input.removeListener('keypress', checkCursorPos)); - - // The close event triggers immediately when the user press ctrl+c. SignalExit on the other hand - // triggers after the process is done (which happens after timeouts are done triggering.) - // We triggers the hooks cleanup phase on rl `close` so active timeouts can be cleared. - rl.on('close', hooksCleanup); - cleanups.add(() => rl.removeListener('close', hooksCleanup)); - - function done(value: Value) { - // Delay execution to let time to the hookCleanup functions to registers. - setImmediate(() => { - onExit(); - - // Finally we resolve our promise - resolve(value); - }); - } - - cycle(() => { - try { - const nextView = view(config, done); - - const [content, bottomContent] = - typeof nextView === 'string' ? [nextView] : nextView; - screen.render(content, bottomContent); - - effectScheduler.run(); - } catch (error: unknown) { - fail(error); - } - }); - }); - - promise.cancel = () => { - fail(new CancelPromptError()); - }; - return promise; - }; - - return prompt; -} diff --git a/packages/core/src/lib/create-prompt.ts b/packages/core/src/lib/create-prompt.ts new file mode 100644 index 000000000..990198077 --- /dev/null +++ b/packages/core/src/lib/create-prompt.ts @@ -0,0 +1,145 @@ +import * as readline from 'node:readline'; +import { AsyncResource } from 'node:async_hooks'; +import { type Prompt, type Prettify } from '@inquirer/type'; +import MuteStream from 'mute-stream'; +import { onExit as onSignalExit } from 'signal-exit'; +import ScreenManager from './screen-manager.js'; +import { PromisePolyfill } from './promise-polyfill.js'; +import { type InquirerReadline } from '@inquirer/type'; +import { withHooks, effectScheduler } from './hook-engine.js'; +import { AbortPromptError, CancelPromptError, ExitPromptError } from './errors.js'; + +type ViewFunction = ( + config: Prettify, + done: (value: Value) => void, +) => string | [string, string | undefined]; + +function getCallSites() { + const _prepareStackTrace = Error.prepareStackTrace; + let result: NodeJS.CallSite[] = []; + try { + Error.prepareStackTrace = (_, callSites) => { + const callSitesWithoutCurrent = callSites.slice(1); + result = callSitesWithoutCurrent; + return callSitesWithoutCurrent; + }; + // eslint-disable-next-line @typescript-eslint/no-unused-expressions, unicorn/error-message + new Error().stack; + } catch { + // An error will occur if the Node flag --frozen-intrinsics is used. + // https://nodejs.org/api/cli.html#--frozen-intrinsics + return result; + } + Error.prepareStackTrace = _prepareStackTrace; + return result; +} + +export function createPrompt(view: ViewFunction) { + const callSites = getCallSites(); + + const prompt: Prompt = (config, context = {}) => { + // Default `input` to stdin + const { input = process.stdin, signal } = context; + const cleanups = new Set<() => void>(); + + // Add mute capabilities to the output + const output = new MuteStream(); + output.pipe(context.output ?? process.stdout); + + const rl = readline.createInterface({ + terminal: true, + input, + output, + }) as unknown as InquirerReadline; + const screen = new ScreenManager(rl); + + const { promise, resolve, reject } = PromisePolyfill.withResolver(); + const cancel = () => reject(new CancelPromptError()); + + if (signal) { + const abort = () => reject(new AbortPromptError({ cause: signal.reason })); + if (signal.aborted) { + abort(); + return Object.assign(promise, { cancel }); + } + signal.addEventListener('abort', abort); + cleanups.add(() => signal.removeEventListener('abort', abort)); + } + + cleanups.add( + onSignalExit((code, signal) => { + reject( + new ExitPromptError(`User force closed the prompt with ${code} ${signal}`), + ); + }), + ); + + // Re-renders only happen when the state change; but the readline cursor could change position + // and that also requires a re-render (and a manual one because we mute the streams). + // We set the listener after the initial workLoop to avoid a double render if render triggered + // by a state change sets the cursor to the right position. + const checkCursorPos = () => screen.checkCursorPos(); + rl.input.on('keypress', checkCursorPos); + cleanups.add(() => rl.input.removeListener('keypress', checkCursorPos)); + + return withHooks(rl, (cycle) => { + // The close event triggers immediately when the user press ctrl+c. SignalExit on the other hand + // triggers after the process is done (which happens after timeouts are done triggering.) + // We triggers the hooks cleanup phase on rl `close` so active timeouts can be cleared. + const hooksCleanup = AsyncResource.bind(() => effectScheduler.clearAll()); + rl.on('close', hooksCleanup); + cleanups.add(() => rl.removeListener('close', hooksCleanup)); + + cycle(() => { + try { + const nextView = view(config, (value) => { + setImmediate(() => resolve(value)); + }); + + // Typescript won't allow this, but not all users rely on typescript. + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + if (nextView === undefined) { + const callerFilename = callSites[1]?.getFileName?.(); + throw new Error( + `Prompt functions must return a string.\n at ${callerFilename}`, + ); + } + + const [content, bottomContent] = + typeof nextView === 'string' ? [nextView] : nextView; + screen.render(content, bottomContent); + + effectScheduler.run(); + } catch (error: unknown) { + reject(error); + } + }); + + return Object.assign( + promise + .then( + (answer) => { + effectScheduler.clearAll(); + return answer; + }, + (error: unknown) => { + effectScheduler.clearAll(); + throw error; + }, + ) + // Wait for the promise to settle, then cleanup. + .finally(() => { + cleanups.forEach((cleanup) => cleanup()); + + screen.done({ clearContent: Boolean(context.clearPromptOnDone) }); + output.end(); + }) + // Once cleanup is done, let the expose promise resolve/reject to the internal one. + .then(() => promise), + { cancel }, + ); + }); + }; + + return prompt; +} diff --git a/packages/core/src/lib/errors.mts b/packages/core/src/lib/errors.ts similarity index 100% rename from packages/core/src/lib/errors.mts rename to packages/core/src/lib/errors.ts diff --git a/packages/core/src/lib/hook-engine.mts b/packages/core/src/lib/hook-engine.ts similarity index 93% rename from packages/core/src/lib/hook-engine.mts rename to packages/core/src/lib/hook-engine.ts index ff23942d3..04a8ab8e6 100644 --- a/packages/core/src/lib/hook-engine.mts +++ b/packages/core/src/lib/hook-engine.ts @@ -2,7 +2,7 @@ import { AsyncLocalStorage, AsyncResource } from 'node:async_hooks'; import type { InquirerReadline } from '@inquirer/type'; -import { HookError, ValidationError } from './errors.mjs'; +import { HookError, ValidationError } from './errors.js'; type HookStore = { rl: InquirerReadline; @@ -28,10 +28,10 @@ function createStore(rl: InquirerReadline) { } // Run callback in with the hook engine setup. -export function withHooks( +export function withHooks( rl: InquirerReadline, - cb: (cycle: (render: () => void) => void) => void, -) { + cb: (cycle: (render: () => void) => void) => T, +): T { const store = createStore(rl); return hookStorage.run(store, () => { function cycle(render: () => void) { @@ -43,7 +43,7 @@ export function withHooks( store.handleChange(); } - cb(cycle); + return cb(cycle); }); } @@ -68,7 +68,7 @@ export function withUpdates R>( ): (...args: Parameters) => R { const wrapped = (...args: Parameters): R => { const store = getStore(); - let shouldUpdate = false; + let shouldUpdate = false as boolean; const oldHandleChange = store.handleChange; store.handleChange = () => { shouldUpdate = true; @@ -125,7 +125,7 @@ export function handleChange() { } export const effectScheduler = { - queue(cb: (readline: InquirerReadline) => void) { + queue(cb: (readline: InquirerReadline) => void | (() => void)) { const store = getStore(); const { index } = store; diff --git a/packages/core/src/lib/key.mts b/packages/core/src/lib/key.ts similarity index 95% rename from packages/core/src/lib/key.mts rename to packages/core/src/lib/key.ts index 430bf5550..ddfbc111f 100644 --- a/packages/core/src/lib/key.mts +++ b/packages/core/src/lib/key.ts @@ -24,7 +24,7 @@ export const isSpaceKey = (key: KeypressEvent): boolean => key.name === 'space'; export const isBackspaceKey = (key: KeypressEvent): boolean => key.name === 'backspace'; export const isNumberKey = (key: KeypressEvent): boolean => - '123456789'.includes(key.name); + '1234567890'.includes(key.name); export const isEnterKey = (key: KeypressEvent): boolean => key.name === 'enter' || key.name === 'return'; diff --git a/packages/core/src/lib/make-theme.mts b/packages/core/src/lib/make-theme.ts similarity index 95% rename from packages/core/src/lib/make-theme.mts rename to packages/core/src/lib/make-theme.ts index 290fe2f0d..bc58f19b1 100644 --- a/packages/core/src/lib/make-theme.mts +++ b/packages/core/src/lib/make-theme.ts @@ -1,5 +1,5 @@ import type { Prettify, PartialDeep } from '@inquirer/type'; -import { defaultTheme, type Theme } from './theme.mjs'; +import { defaultTheme, type Theme } from './theme.js'; function isPlainObject(value: unknown): value is object { if (typeof value !== 'object' || value === null) return false; diff --git a/packages/core/src/lib/pagination/lines.mts b/packages/core/src/lib/pagination/lines.ts similarity index 98% rename from packages/core/src/lib/pagination/lines.mts rename to packages/core/src/lib/pagination/lines.ts index 6389f58c0..25d6e87ee 100644 --- a/packages/core/src/lib/pagination/lines.mts +++ b/packages/core/src/lib/pagination/lines.ts @@ -1,5 +1,5 @@ import { type Prettify } from '@inquirer/type'; -import { breakLines } from '../utils.mjs'; +import { breakLines } from '../utils.js'; /** Represents an item that's part of a layout, about to be rendered */ export type Layout = { diff --git a/packages/core/src/lib/pagination/position.mts b/packages/core/src/lib/pagination/position.ts similarity index 100% rename from packages/core/src/lib/pagination/position.mts rename to packages/core/src/lib/pagination/position.ts diff --git a/packages/core/src/lib/pagination/use-pagination.mts b/packages/core/src/lib/pagination/use-pagination.ts similarity index 82% rename from packages/core/src/lib/pagination/use-pagination.mts rename to packages/core/src/lib/pagination/use-pagination.ts index e6c3e3a54..f6f8f67f3 100644 --- a/packages/core/src/lib/pagination/use-pagination.mts +++ b/packages/core/src/lib/pagination/use-pagination.ts @@ -1,9 +1,9 @@ import type { Prettify } from '@inquirer/type'; -import { useRef } from '../use-ref.mjs'; -import { readlineWidth } from '../utils.mjs'; -import { type Theme } from '../theme.mjs'; -import { lines, type Layout } from './lines.mjs'; -import { finite, infinite } from './position.mjs'; +import { useRef } from '../use-ref.js'; +import { readlineWidth } from '../utils.js'; +import { type Theme } from '../theme.js'; +import { lines, type Layout } from './lines.js'; +import { finite, infinite } from './position.js'; export function usePagination({ items, diff --git a/packages/core/src/lib/promise-polyfill.ts b/packages/core/src/lib/promise-polyfill.ts new file mode 100644 index 000000000..fe3b60521 --- /dev/null +++ b/packages/core/src/lib/promise-polyfill.ts @@ -0,0 +1,15 @@ +// TODO: Remove this class once Node 22 becomes the minimum supported version. +export class PromisePolyfill extends Promise { + // Available starting from Node 22 + // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/withResolvers + static withResolver() { + let resolve: (value: T) => void; + let reject: (error: unknown) => void; + const promise = new Promise((res, rej) => { + resolve = res; + reject = rej; + }); + + return { promise, resolve: resolve!, reject: reject! }; + } +} diff --git a/packages/core/src/lib/screen-manager.mts b/packages/core/src/lib/screen-manager.ts similarity index 91% rename from packages/core/src/lib/screen-manager.mts rename to packages/core/src/lib/screen-manager.ts index a09c84cc4..3b9857a18 100644 --- a/packages/core/src/lib/screen-manager.mts +++ b/packages/core/src/lib/screen-manager.ts @@ -1,7 +1,6 @@ -import type { CursorPos } from 'node:readline'; -import stripAnsi from 'strip-ansi'; +import { stripVTControlCharacters } from 'node:util'; import ansiEscapes from 'ansi-escapes'; -import { breakLines, readlineWidth } from './utils.mjs'; +import { breakLines, readlineWidth } from './utils.js'; import type { InquirerReadline } from '@inquirer/type'; const height = (content: string): number => content.split('\n').length; @@ -15,9 +14,13 @@ export default class ScreenManager { // These variables are keeping information to allow correct prompt re-rendering private height: number = 0; private extraLinesUnderPrompt: number = 0; - private cursorPos: CursorPos; + private cursorPos: { + rows: number; + cols: number; + }; + private readonly rl: InquirerReadline; - constructor(private readonly rl: InquirerReadline) { + constructor(rl: InquirerReadline) { this.rl = rl; this.cursorPos = rl.getCursorPos(); } @@ -31,7 +34,7 @@ export default class ScreenManager { render(content: string, bottomContent: string = '') { // Write message to screen and setPrompt to control backspace const promptLine = lastLine(content); - const rawPromptLine = stripAnsi(promptLine); + const rawPromptLine = stripVTControlCharacters(promptLine); // Remove the rl.line from our prompt. We can't rely on the content of // rl.line (mainly because of the password prompt), so just rely on it's diff --git a/packages/core/src/lib/theme.mts b/packages/core/src/lib/theme.mts deleted file mode 100644 index 6a0fdf471..000000000 --- a/packages/core/src/lib/theme.mts +++ /dev/null @@ -1,39 +0,0 @@ -import colors from 'yoctocolors-cjs'; -import spinners from 'cli-spinners'; -import type { Prettify } from '@inquirer/type'; - -type DefaultTheme = { - prefix: string; - spinner: { - interval: number; - frames: string[]; - }; - style: { - answer: (text: string) => string; - message: (text: string) => string; - error: (text: string) => string; - defaultAnswer: (text: string) => string; - help: (text: string) => string; - highlight: (text: string) => string; - key: (text: string) => string; - }; -}; - -export type Theme = Prettify; - -export const defaultTheme: DefaultTheme = { - prefix: colors.green('?'), - spinner: { - interval: spinners.dots.interval, - frames: spinners.dots.frames.map((frame) => colors.yellow(frame)), - }, - style: { - answer: colors.cyan, - message: colors.bold, - error: (text) => colors.red(`> ${text}`), - defaultAnswer: (text) => colors.dim(`(${text})`), - help: colors.dim, - highlight: colors.cyan, - key: (text: string) => colors.cyan(colors.bold(`<${text}>`)), - }, -}; diff --git a/packages/core/src/lib/theme.ts b/packages/core/src/lib/theme.ts new file mode 100644 index 000000000..fd3c02d0d --- /dev/null +++ b/packages/core/src/lib/theme.ts @@ -0,0 +1,189 @@ +import colors from 'yoctocolors-cjs'; +import figures from '@inquirer/figures'; +import type { Prettify } from '@inquirer/type'; + +/** + * Union type representing the possible statuses of a prompt. + * + * - `'loading'`: The prompt is currently loading. + * - `'idle'`: The prompt is loaded and currently waiting for the user to + * submit an answer. + * - `'done'`: The user has submitted an answer and the prompt is finished. + * - `string`: Any other string: The prompt is in a custom state. + */ +export type Status = 'loading' | 'idle' | 'done' | (string & {}); + +type DefaultTheme = { + /** + * Prefix to prepend to the message. If a function is provided, it will be + * called with the current status of the prompt, and the return value will be + * used as the prefix. + * + * @remarks + * If `status === 'loading'`, this property is ignored and the spinner (styled + * by the `spinner` property) will be displayed instead. + * + * @defaultValue + * ```ts + * // import colors from 'yoctocolors-cjs'; + * (status) => status === 'done' ? colors.green('✔') : colors.blue('?') + * ``` + */ + prefix: string | Prettify, 'loading'>>; + + /** + * Configuration for the spinner that is displayed when the prompt is in the + * `'loading'` state. + * + * We recommend the use of {@link https://github.com/sindresorhus/cli-spinners|cli-spinners} for a list of available spinners. + */ + spinner: { + /** + * The time interval between frames, in milliseconds. + * + * @defaultValue + * ```ts + * 80 + * ``` + */ + interval: number; + + /** + * A list of frames to show for the spinner. + * + * @defaultValue + * ```ts + * ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'] + * ``` + */ + frames: string[]; + }; + /** + * Object containing functions to style different parts of the prompt. + */ + style: { + /** + * Style to apply to the user's answer once it has been submitted. + * + * @param text - The user's answer. + * @returns The styled answer. + * + * @defaultValue + * ```ts + * // import colors from 'yoctocolors-cjs'; + * (text) => colors.cyan(text) + * ``` + */ + answer: (text: string) => string; + + /** + * Style to apply to the message displayed to the user. + * + * @param text - The message to style. + * @param status - The current status of the prompt. + * @returns The styled message. + * + * @defaultValue + * ```ts + * // import colors from 'yoctocolors-cjs'; + * (text, status) => colors.bold(text) + * ``` + */ + message: (text: string, status: Status) => string; + + /** + * Style to apply to error messages. + * + * @param text - The error message. + * @returns The styled error message. + * + * @defaultValue + * ```ts + * // import colors from 'yoctocolors-cjs'; + * (text) => colors.red(`> ${text}`) + * ``` + */ + error: (text: string) => string; + + /** + * Style to apply to the default answer when one is provided. + * + * @param text - The default answer. + * @returns The styled default answer. + * + * @defaultValue + * ```ts + * // import colors from 'yoctocolors-cjs'; + * (text) => colors.dim(`(${text})`) + * ``` + */ + defaultAnswer: (text: string) => string; + + /** + * Style to apply to help text. + * + * @param text - The help text. + * @returns The styled help text. + * + * @defaultValue + * ```ts + * // import colors from 'yoctocolors-cjs'; + * (text) => colors.dim(text) + * ``` + */ + help: (text: string) => string; + + /** + * Style to apply to highlighted text. + * + * @param text - The text to highlight. + * @returns The highlighted text. + * + * @defaultValue + * ```ts + * // import colors from 'yoctocolors-cjs'; + * (text) => colors.cyan(text) + * ``` + */ + highlight: (text: string) => string; + + /** + * Style to apply to keyboard keys referred to in help texts. + * + * @param text - The key to style. + * @returns The styled key. + * + * @defaultValue + * ```ts + * // import colors from 'yoctocolors-cjs'; + * (text) => colors.cyan(colors.bold(`<${text}>`)) + * ``` + */ + key: (text: string) => string; + }; +}; + +export type Theme = Prettify; + +export const defaultTheme: DefaultTheme = { + prefix: { + idle: colors.blue('?'), + // TODO: use figure + done: colors.green(figures.tick), + }, + spinner: { + interval: 80, + frames: ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'].map((frame) => + colors.yellow(frame), + ), + }, + style: { + answer: colors.cyan, + message: colors.bold, + error: (text) => colors.red(`> ${text}`), + defaultAnswer: (text) => colors.dim(`(${text})`), + help: colors.dim, + highlight: colors.cyan, + key: (text: string) => colors.cyan(colors.bold(`<${text}>`)), + }, +}; diff --git a/packages/core/src/lib/use-effect.mts b/packages/core/src/lib/use-effect.ts similarity index 87% rename from packages/core/src/lib/use-effect.mts rename to packages/core/src/lib/use-effect.ts index d954be651..eb5232362 100644 --- a/packages/core/src/lib/use-effect.mts +++ b/packages/core/src/lib/use-effect.ts @@ -1,4 +1,4 @@ -import { withPointer, effectScheduler } from './hook-engine.mjs'; +import { withPointer, effectScheduler } from './hook-engine.js'; import type { InquirerReadline } from '@inquirer/type'; export function useEffect( diff --git a/packages/core/src/lib/use-keypress.mts b/packages/core/src/lib/use-keypress.ts similarity index 76% rename from packages/core/src/lib/use-keypress.mts rename to packages/core/src/lib/use-keypress.ts index 57f5ffa7e..b2d0b08c9 100644 --- a/packages/core/src/lib/use-keypress.mts +++ b/packages/core/src/lib/use-keypress.ts @@ -1,8 +1,8 @@ import { type InquirerReadline } from '@inquirer/type'; -import { type KeypressEvent } from './key.mjs'; -import { useRef } from './use-ref.mjs'; -import { useEffect } from './use-effect.mjs'; -import { withUpdates } from './hook-engine.mjs'; +import { type KeypressEvent } from './key.js'; +import { useRef } from './use-ref.js'; +import { useEffect } from './use-effect.js'; +import { withUpdates } from './hook-engine.js'; export function useKeypress( userHandler: (event: KeypressEvent, rl: InquirerReadline) => void | Promise, diff --git a/packages/core/src/lib/use-memo.mts b/packages/core/src/lib/use-memo.ts similarity index 92% rename from packages/core/src/lib/use-memo.mts rename to packages/core/src/lib/use-memo.ts index 44c85f2d0..1d8167312 100644 --- a/packages/core/src/lib/use-memo.mts +++ b/packages/core/src/lib/use-memo.ts @@ -1,4 +1,4 @@ -import { withPointer } from './hook-engine.mjs'; +import { withPointer } from './hook-engine.js'; type PointerValue = { value: Value; diff --git a/packages/core/src/lib/use-prefix.mts b/packages/core/src/lib/use-prefix.ts similarity index 66% rename from packages/core/src/lib/use-prefix.mts rename to packages/core/src/lib/use-prefix.ts index 0be816e9d..c85abb9f9 100644 --- a/packages/core/src/lib/use-prefix.mts +++ b/packages/core/src/lib/use-prefix.ts @@ -1,14 +1,14 @@ import { AsyncResource } from 'node:async_hooks'; -import { useState } from './use-state.mjs'; -import { useEffect } from './use-effect.mjs'; -import { makeTheme } from './make-theme.mjs'; -import { type Theme } from './theme.mjs'; +import { useState } from './use-state.js'; +import { useEffect } from './use-effect.js'; +import { makeTheme } from './make-theme.js'; +import type { Theme, Status } from './theme.js'; export function usePrefix({ - isLoading = false, + status = 'idle', theme, }: { - isLoading?: boolean; + status?: Status; theme?: Theme; }): string { const [showLoader, setShowLoader] = useState(false); @@ -16,7 +16,7 @@ export function usePrefix({ const { prefix, spinner } = makeTheme(theme); useEffect((): void | (() => unknown) => { - if (isLoading) { + if (status === 'loading') { let tickInterval: NodeJS.Timeout | undefined; let inc = -1; // Delay displaying spinner by 300ms, to avoid flickering @@ -42,11 +42,13 @@ export function usePrefix({ } else { setShowLoader(false); } - }, [isLoading]); + }, [status]); if (showLoader) { return spinner.frames[tick]!; } - return prefix; + // There's a delay before we show the loader. So we want to ignore `loading` here, and pass idle instead. + const iconName = status === 'loading' ? 'idle' : status; + return typeof prefix === 'string' ? prefix : (prefix[iconName] ?? prefix['idle']); } diff --git a/packages/core/src/lib/use-ref.mts b/packages/core/src/lib/use-ref.ts similarity index 83% rename from packages/core/src/lib/use-ref.mts rename to packages/core/src/lib/use-ref.ts index efe73c4e9..2d209eec7 100644 --- a/packages/core/src/lib/use-ref.mts +++ b/packages/core/src/lib/use-ref.ts @@ -1,4 +1,4 @@ -import { useState } from './use-state.mjs'; +import { useState } from './use-state.js'; export function useRef(val: Value): { current: Value }; export function useRef(val?: Value): { current: Value | undefined }; diff --git a/packages/core/src/lib/use-state.mts b/packages/core/src/lib/use-state.ts similarity index 87% rename from packages/core/src/lib/use-state.mts rename to packages/core/src/lib/use-state.ts index 639758b10..c91344bab 100644 --- a/packages/core/src/lib/use-state.mts +++ b/packages/core/src/lib/use-state.ts @@ -1,4 +1,4 @@ -import { withPointer, handleChange } from './hook-engine.mjs'; +import { withPointer, handleChange } from './hook-engine.js'; type NotFunction = T extends (...args: never) => unknown ? never : T; @@ -7,7 +7,7 @@ export function useState( ): [Value, (newValue: Value) => void]; export function useState( defaultValue?: NotFunction | (() => Value), -): [Value | undefined, (newValue?: Value | undefined) => void]; +): [Value | undefined, (newValue?: Value) => void]; export function useState(defaultValue: NotFunction | (() => Value)) { return withPointer void]>((pointer) => { const setFn = (newValue: Value) => { diff --git a/packages/core/src/lib/utils.mts b/packages/core/src/lib/utils.ts similarity index 94% rename from packages/core/src/lib/utils.mts rename to packages/core/src/lib/utils.ts index a065d774a..883e65069 100644 --- a/packages/core/src/lib/utils.mts +++ b/packages/core/src/lib/utils.ts @@ -1,6 +1,6 @@ import cliWidth from 'cli-width'; import wrapAnsi from 'wrap-ansi'; -import { readline } from './hook-engine.mjs'; +import { readline } from './hook-engine.js'; /** * Force line returns at specific width. This function is ANSI code friendly and it'll diff --git a/packages/core/tsconfig.cjs.json b/packages/core/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/core/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/core/tsconfig.json b/packages/core/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/core/tsconfig.json +++ b/packages/core/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/demo/.tshy/build.json b/packages/demo/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/demo/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/demo/.tshy/esm.json b/packages/demo/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/demo/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/demo/index.mjs b/packages/demo/index.mjs deleted file mode 100755 index bbf5d4330..000000000 --- a/packages/demo/index.mjs +++ /dev/null @@ -1,75 +0,0 @@ -#!/usr/bin/env node - -import { select } from '@inquirer/prompts'; -import checkboxDemo from './demos/checkbox.mjs'; -import confirmDemo from './demos/confirm.mjs'; -import editorDemo from './demos/editor.mjs'; -import expandDemo from './demos/expand.mjs'; -import inputDemo from './demos/input.mjs'; -import loaderDemo from './demos/loader.mjs'; -import numberDemo from './demos/number.mjs'; -import passwordDemo from './demos/password.mjs'; -import rawlistDemo from './demos/rawlist.mjs'; -import searchDemo from './demos/search.mjs'; -import selectDemo from './demos/select.mjs'; -import timeoutDemo from './demos/timeout.mjs'; - -const demos = { - checkbox: checkboxDemo, - confirm: confirmDemo, - editor: editorDemo, - expand: expandDemo, - input: inputDemo, - loader: loaderDemo, - number: numberDemo, - password: passwordDemo, - rawlist: rawlistDemo, - search: searchDemo, - select: selectDemo, - timeout: timeoutDemo, -}; - -async function askNextDemo() { - let selectedDemo = await select({ - message: 'Which prompt demo do you want to run?', - choices: [ - { name: 'Input', value: 'input' }, - { name: 'Password', value: 'password' }, - { name: 'Confirm', value: 'confirm' }, - { name: 'Select', value: 'select' }, - { name: 'Checkbox', value: 'checkbox' }, - { name: 'Search', value: 'search' }, - { name: 'Expand', value: 'expand' }, - { name: 'Rawlist', value: 'rawlist' }, - { name: 'Editor', value: 'editor' }, - { name: 'Number', value: 'number' }, - { name: 'Advanced demos', value: 'advanced' }, - { name: "Exit (I'm done)", value: 'exit' }, - ], - }); - - if (selectedDemo === 'advanced') { - selectedDemo = await select({ - message: 'Which demo do you want to run?', - choices: [ - { name: 'Default value after timeout', value: 'timeout' }, - { name: 'Loader', value: 'loader' }, - { name: 'Go back', value: 'back' }, - ], - }); - } - - if (selectedDemo === 'back') { - return askNextDemo(); - } - - return selectedDemo; -} - -(async () => { - let nextDemo = await askNextDemo(); - while (nextDemo !== 'exit') { - await demos[nextDemo](); - nextDemo = await askNextDemo(); - } -})(); diff --git a/packages/demo/package.json b/packages/demo/package.json index 23d0dfe3b..55793ae7b 100644 --- a/packages/demo/package.json +++ b/packages/demo/package.json @@ -1,23 +1,7 @@ { "name": "@inquirer/demo", - "version": "0.9.0", - "engines": { - "node": ">=18" - }, - "type": "module", + "version": "1.1.9", "description": "Inquirer demos", - "main": "index.mjs", - "bin": { - "inquirer-demo": "index.mjs" - }, - "files": [ - "index.mjs", - "demos/" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -57,16 +41,69 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + } + } + }, + "module": "./dist/esm/index.js", + "bin": { + "inquirer-demo": "./dist/esm/index.js" + }, + "files": [ + "dist" + ], + "scripts": { + "tsc": "tshy" + }, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/prompts": "^5.4.0", + "@inquirer/core": "^10.1.9", + "@inquirer/figures": "^1.0.11", + "@inquirer/prompts": "^7.4.0", "yoctocolors-cjs": "^2.1.2" }, + "devDependencies": { + "@repo/tsconfig": "workspace:*", + "@types/node": "^22.13.10", + "tshy": "^3.0.2" + }, + "engines": { + "node": ">=18" + }, "publishConfig": { "access": "public" }, - "sideEffects": false + "tshy": { + "dialects": [ + "esm" + ], + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/demo/demos/checkbox.mjs b/packages/demo/src/demos/checkbox.ts similarity index 98% rename from packages/demo/demos/checkbox.mjs rename to packages/demo/src/demos/checkbox.ts index 46b4848c8..5964b06b4 100644 --- a/packages/demo/demos/checkbox.mjs +++ b/packages/demo/src/demos/checkbox.ts @@ -58,7 +58,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/confirm.mjs b/packages/demo/src/demos/confirm.ts similarity index 97% rename from packages/demo/demos/confirm.mjs rename to packages/demo/src/demos/confirm.ts index 9cf9a9940..59062411b 100644 --- a/packages/demo/demos/confirm.mjs +++ b/packages/demo/src/demos/confirm.ts @@ -35,7 +35,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/editor.mjs b/packages/demo/src/demos/editor.ts similarity index 97% rename from packages/demo/demos/editor.mjs rename to packages/demo/src/demos/editor.ts index 1ae1f1631..3a5a8d968 100644 --- a/packages/demo/demos/editor.mjs +++ b/packages/demo/src/demos/editor.ts @@ -29,7 +29,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/expand.mjs b/packages/demo/src/demos/expand.ts similarity index 99% rename from packages/demo/demos/expand.mjs rename to packages/demo/src/demos/expand.ts index db037c3b1..9db6f2a25 100644 --- a/packages/demo/demos/expand.mjs +++ b/packages/demo/src/demos/expand.ts @@ -91,7 +91,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/input.mjs b/packages/demo/src/demos/input.ts similarity index 95% rename from packages/demo/demos/input.mjs rename to packages/demo/src/demos/input.ts index 0556bdbf5..5c174a639 100644 --- a/packages/demo/demos/input.mjs +++ b/packages/demo/src/demos/input.ts @@ -3,7 +3,7 @@ import colors from 'yoctocolors-cjs'; import { input } from '@inquirer/prompts'; const hexRegEx = /(\d|[a-f])/gim; -const isHex = (value) => +const isHex = (value: string) => (value.match(hexRegEx) || []).length === value.length && (value.length === 3 || value.length === 6); @@ -41,7 +41,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/loader.mjs b/packages/demo/src/demos/loader.ts similarity index 69% rename from packages/demo/demos/loader.mjs rename to packages/demo/src/demos/loader.ts index f8af9dba3..0d3845f4f 100644 --- a/packages/demo/demos/loader.mjs +++ b/packages/demo/src/demos/loader.ts @@ -1,8 +1,8 @@ import * as url from 'node:url'; import { createPrompt, useKeypress, usePrefix, isEnterKey } from '@inquirer/core'; -const loader = createPrompt((config, done) => { - const prefix = usePrefix({ isLoading: true }); +const loader = createPrompt((_config, done: (value: void) => void) => { + const prefix = usePrefix({ status: 'loading' }); useKeypress((key) => { if (isEnterKey(key)) { @@ -14,13 +14,13 @@ const loader = createPrompt((config, done) => { }); const demo = async () => { - await loader(); + await loader({}, { clearPromptOnDone: true }); }; if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/number.mjs b/packages/demo/src/demos/number.ts similarity index 97% rename from packages/demo/demos/number.mjs rename to packages/demo/src/demos/number.ts index 8e2254199..e709c80e6 100644 --- a/packages/demo/demos/number.mjs +++ b/packages/demo/src/demos/number.ts @@ -30,7 +30,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/password.mjs b/packages/demo/src/demos/password.ts similarity index 96% rename from packages/demo/demos/password.mjs rename to packages/demo/src/demos/password.ts index f91f6f4c0..942345176 100644 --- a/packages/demo/demos/password.mjs +++ b/packages/demo/src/demos/password.ts @@ -21,7 +21,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/rawlist.mjs b/packages/demo/src/demos/rawlist.ts similarity index 98% rename from packages/demo/demos/rawlist.mjs rename to packages/demo/src/demos/rawlist.ts index b46c700f7..ae033b2b2 100644 --- a/packages/demo/demos/rawlist.mjs +++ b/packages/demo/src/demos/rawlist.ts @@ -60,7 +60,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/search.mjs b/packages/demo/src/demos/search.ts similarity index 90% rename from packages/demo/demos/search.mjs rename to packages/demo/src/demos/search.ts index 9be13fda2..e2580e2ed 100644 --- a/packages/demo/demos/search.mjs +++ b/packages/demo/src/demos/search.ts @@ -3,14 +3,14 @@ import path from 'node:path'; import * as url from 'node:url'; import { search } from '@inquirer/prompts'; -async function fileExists(filepath) { +async function fileExists(filepath: string) { return fs.access(filepath).then( () => true, () => false, ); } -async function isDirectory(path) { +async function isDirectory(path: string) { if (await fileExists(path)) { const stats = await fs.stat(path); return stats.isDirectory(); @@ -33,7 +33,9 @@ const demo = async () => { `https://registry.npmjs.org/-/v1/search?text=${encodeURIComponent(input)}&size=20`, { signal }, ); - const data = await response.json(); + const data = (await response.json()) as { + objects: ReadonlyArray<{ package: { name: string; description: string } }>; + }; return data.objects.map((pkg) => ({ name: pkg.package.name, @@ -84,7 +86,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/select.mjs b/packages/demo/src/demos/select.ts similarity index 99% rename from packages/demo/demos/select.mjs rename to packages/demo/src/demos/select.ts index efe4237b8..09198a6b8 100644 --- a/packages/demo/demos/select.mjs +++ b/packages/demo/src/demos/select.ts @@ -76,7 +76,7 @@ const demo = async () => { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/demos/timeout.mjs b/packages/demo/src/demos/timeout.ts similarity index 80% rename from packages/demo/demos/timeout.mjs rename to packages/demo/src/demos/timeout.ts index 822047fed..293d8d390 100644 --- a/packages/demo/demos/timeout.mjs +++ b/packages/demo/src/demos/timeout.ts @@ -5,8 +5,8 @@ async function demo() { const answer = await input( { message: 'Enter a value (timing out in 5 seconds)' }, { signal: AbortSignal.timeout(5000) }, - ).catch((error) => { - if (error.name === 'AbortPromptError') { + ).catch((error: unknown) => { + if (error instanceof Error && error.name === 'AbortPromptError') { return 'Default value'; } @@ -18,7 +18,7 @@ async function demo() { if (import.meta.url.startsWith('file:')) { const modulePath = url.fileURLToPath(import.meta.url); if (process.argv[1] === modulePath) { - demo(); + await demo(); } } diff --git a/packages/demo/src/index.ts b/packages/demo/src/index.ts new file mode 100755 index 000000000..302f9549d --- /dev/null +++ b/packages/demo/src/index.ts @@ -0,0 +1,95 @@ +#!/usr/bin/env node + +import { select } from '@inquirer/prompts'; +import colors from 'yoctocolors-cjs'; +import figures from '@inquirer/figures'; +import checkboxDemo from './demos/checkbox.js'; +import confirmDemo from './demos/confirm.js'; +import editorDemo from './demos/editor.js'; +import expandDemo from './demos/expand.js'; +import inputDemo from './demos/input.js'; +import loaderDemo from './demos/loader.js'; +import numberDemo from './demos/number.js'; +import passwordDemo from './demos/password.js'; +import rawlistDemo from './demos/rawlist.js'; +import searchDemo from './demos/search.js'; +import selectDemo from './demos/select.js'; +import timeoutDemo from './demos/timeout.js'; + +const demos = { + checkbox: checkboxDemo, + confirm: confirmDemo, + editor: editorDemo, + expand: expandDemo, + input: inputDemo, + loader: loaderDemo, + number: numberDemo, + password: passwordDemo, + rawlist: rawlistDemo, + search: searchDemo, + select: selectDemo, + timeout: timeoutDemo, +} as const; + +type Demos = keyof typeof demos | 'advanced' | 'back' | 'exit'; + +async function askNextDemo() { + let selectedDemo: Demos = await select({ + message: 'Which prompt demo do you want to run?', + choices: [ + { name: 'Input', value: 'input' }, + { name: 'Password', value: 'password' }, + { name: 'Confirm', value: 'confirm' }, + { name: 'Select', value: 'select' }, + { name: 'Checkbox', value: 'checkbox' }, + { name: 'Search', value: 'search' }, + { name: 'Expand', value: 'expand' }, + { name: 'Rawlist', value: 'rawlist' }, + { name: 'Editor', value: 'editor' }, + { name: 'Number', value: 'number' }, + { name: 'Advanced demos', value: 'advanced' }, + { name: "Exit (I'm done)", value: 'exit' }, + ], + theme: { + prefix: { + done: colors.magenta(figures.play), + }, + }, + }); + + if (selectedDemo === 'advanced') { + selectedDemo = await select( + { + message: 'Which demo do you want to run?', + choices: [ + { name: 'Default value after timeout', value: 'timeout' }, + { name: 'Loader', value: 'loader' }, + { name: 'Go back', value: 'back' }, + ], + }, + { + clearPromptOnDone: true, + }, + ); + } + + if (selectedDemo === 'back') { + return askNextDemo(); + } + + return selectedDemo; +} + +try { + let nextDemo = await askNextDemo(); + while (nextDemo !== 'exit') { + await demos[nextDemo](); + nextDemo = await askNextDemo(); + } +} catch (error) { + if (error instanceof Error && error.name === 'ExitPromptError') { + // noop; silence this error + } else { + throw error; + } +} diff --git a/packages/demo/tsconfig.json b/packages/demo/tsconfig.json new file mode 100644 index 000000000..1747264e5 --- /dev/null +++ b/packages/demo/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "@repo/tsconfig" +} diff --git a/packages/editor/.tshy/build.json b/packages/editor/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/editor/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/editor/.tshy/commonjs.json b/packages/editor/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/editor/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/editor/.tshy/esm.json b/packages/editor/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/editor/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/editor/README.md b/packages/editor/README.md index 72f27de39..0aea729ff 100644 --- a/packages/editor/README.md +++ b/packages/editor/README.md @@ -2,6 +2,8 @@ Prompt that'll open the user preferred editor with default content and allow for a convenient multi-line input controlled through the command line. +The editor launched is the one [defined by the user's `EDITOR` environment variable](https://dev.to/jonasbn/til-integrate-visual-studio-code-with-shell--cli-2l1l). + # Installation @@ -60,14 +62,15 @@ const answer = await editor({ ## Options -| Property | Type | Required | Description | -| --------------- | ----------------------------------------------------------- | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| message | `string` | yes | The question to ask | -| default | `string` | no | Default value which will automatically be present in the editor | -| validate | `string => boolean \| string \| Promise` | no | On submit, validate the content. When returning a string, it'll be used as the error message displayed to the user. Note: returning a rejected promise, we'll assume a code error happened and crash. | -| postfix | `string` | no (default to `.txt`) | The postfix of the file being edited. Adding this will add color highlighting to the file content in most editors. | -| waitForUseInput | `boolean` | no (default to `true`) | Open the editor automatically without waiting for the user to press enter. Note that this mean the user will not see the question! So make sure you have a default value that provide guidance if it's unclear what input is expected. | -| theme | [See Theming](#Theming) | no | Customize look of the prompt. | +| Property | Type | Required | Description | +| --------------- | ------------------------------------------------------------------------------ | ---------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| message | `string` | yes | The question to ask | +| default | `string` | no | Default value which will automatically be present in the editor | +| validate | `string => boolean \| string \| Promise` | no | On submit, validate the content. When returning a string, it'll be used as the error message displayed to the user. Note: returning a rejected promise, we'll assume a code error happened and crash. | +| postfix | `string` | no (default to `.txt`) | The postfix of the file being edited. Adding this will add color highlighting to the file content in most editors. | +| file | [`IFileOptions`](https://github.com/mrkmg/node-external-editor#config-options) | no | Exposes the [`external-editor` package options](https://github.com/mrkmg/node-external-editor#config-options) to configure the temporary file. | +| waitForUseInput | `boolean` | no (default to `true`) | Open the editor automatically without waiting for the user to press enter. Note that this mean the user will not see the question! So make sure you have a default value that provide guidance if it's unclear what input is expected. | +| theme | [See Theming](#Theming) | no | Customize look of the prompt. | ## Theming @@ -75,20 +78,23 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; help: (text: string) => string; key: (text: string) => string; }; + validationFailureMode: 'keep' | 'clear'; }; ``` +`validationFailureMode` defines the behavior of the prompt when the value submitted is invalid. By default, we'll keep the value allowing the user to edit it. When the theme option is set to `clear`, we'll remove and reset to the default value or empty string. + # License Copyright (c) 2023 Simon Boudrias (twitter: [@vaxilart](https://twitter.com/Vaxilart))
diff --git a/packages/editor/editor.test.mts b/packages/editor/editor.test.mts deleted file mode 100644 index eb111b5f9..000000000 --- a/packages/editor/editor.test.mts +++ /dev/null @@ -1,149 +0,0 @@ -import { describe, it, expect, afterEach, vi } from 'vitest'; -import { render } from '@inquirer/testing'; -import { editAsync } from 'external-editor'; -import editor from './src/index.mjs'; - -vi.mock('external-editor'); -afterEach(() => { - vi.mocked(editAsync).mockClear(); -}); - -async function editorAction(error: undefined | Error, value?: string) { - const { lastCall } = vi.mocked(editAsync).mock; - if (!lastCall) throw new Error("editor wasn't open"); - - // Bugfix: The callback error value is nullable. - const editCallback = lastCall[1] as ( - error: undefined | Error, - value: string, - ) => void | Promise; - await editCallback(error, value ?? ''); -} - -describe('editor prompt', () => { - it('open editor after pressing enter', async () => { - const { answer, events, getScreen } = await render(editor, { - message: 'Add a description', - }); - - expect(getScreen()).toMatchInlineSnapshot( - `"? Add a description Press to launch your preferred editor."`, - ); - expect(editAsync).not.toHaveBeenCalled(); - - events.keypress('enter'); - expect(editAsync).toHaveBeenCalledWith('', expect.any(Function), { postfix: '.txt' }); - - await editorAction(undefined, 'value from editor'); - - await expect(answer).resolves.toEqual('value from editor'); - expect(getScreen()).toMatchInlineSnapshot(`"? Add a description"`); - }); - - it('open editor immediately', async () => { - const { answer, getScreen } = await render(editor, { - message: 'Add a description', - waitForUseInput: false, - }); - expect(editAsync).toHaveBeenCalledWith('', expect.any(Function), { postfix: '.txt' }); - - await editorAction(undefined, 'value from editor'); - - await expect(answer).resolves.toEqual('value from editor'); - expect(getScreen()).toMatchInlineSnapshot(`"? Add a description"`); - }); - - it('allow setting a default value & postfix', async () => { - const { answer, events, getScreen } = await render(editor, { - message: 'Add a description', - default: 'default description', - postfix: '.md', - }); - - expect(editAsync).not.toHaveBeenCalled(); - - events.keypress('enter'); - expect(editAsync).toHaveBeenCalledWith('default description', expect.any(Function), { - postfix: '.md', - }); - - await editorAction(undefined, 'value from editor'); - - await expect(answer).resolves.toEqual('value from editor'); - expect(getScreen()).toMatchInlineSnapshot(`"? Add a description"`); - }); - - it('handles validation', async () => { - const { answer, events, getScreen } = await render(editor, { - message: 'Add a description', - validate: (value: string) => { - switch (value) { - case '1': { - return true; - } - case '2': { - return '"2" is not an allowed value'; - } - default: { - return false; - } - } - }, - }); - - expect(editAsync).not.toHaveBeenCalled(); - events.keypress('enter'); - - // Test default error message - const editPromise = editorAction(undefined, '3'); - events.type('foo'); // Ignored events while validation runs - await editPromise; - expect(getScreen()).toMatchInlineSnapshot(` - "? Add a description Press to launch your preferred editor. - > You must provide a valid value" - `); - - expect(editAsync).toHaveBeenCalledOnce(); - events.keypress('enter'); - expect(editAsync).toHaveBeenCalledTimes(2); - - // Test user defined error message - await editorAction(undefined, '2'); - expect(getScreen()).toMatchInlineSnapshot(` - "? Add a description Press to launch your preferred editor. - > "2" is not an allowed value" - `); - - events.keypress('enter'); - expect(editAsync).toHaveBeenCalledTimes(3); - - await editorAction(undefined, '1'); - await expect(answer).resolves.toEqual('1'); - expect(getScreen()).toMatchInlineSnapshot(`"? Add a description"`); - }); - - it('surfaces external-editor errors', async () => { - const { answer, events, getScreen } = await render(editor, { - message: 'Add a description', - }); - - expect(editAsync).not.toHaveBeenCalled(); - events.keypress('enter'); - - await editorAction(new Error('$EDITOR failed!'), ''); - expect(getScreen()).toMatchInlineSnapshot(` - "? Add a description Press to launch your preferred editor. - > Error: $EDITOR failed!" - `); - - expect(editAsync).toHaveBeenCalledOnce(); - events.keypress('enter'); - expect(editAsync).toHaveBeenCalledTimes(2); - - // Test user defined error message - await editorAction(undefined, 'new value'); - - await expect(answer).resolves.toEqual('new value'); - expect(getScreen()).toMatchInlineSnapshot(`"? Add a description"`); - }); -}); diff --git a/packages/editor/editor.test.ts b/packages/editor/editor.test.ts new file mode 100644 index 000000000..860977421 --- /dev/null +++ b/packages/editor/editor.test.ts @@ -0,0 +1,277 @@ +import { describe, it, expect, afterEach, vi } from 'vitest'; +import { render } from '@inquirer/testing'; +import { editAsync } from 'external-editor'; +import editor from './src/index.js'; + +vi.mock('external-editor'); +afterEach(() => { + vi.mocked(editAsync).mockClear(); +}); + +async function editorAction(error: undefined | Error, value?: string) { + const { lastCall } = vi.mocked(editAsync).mock; + if (!lastCall) throw new Error("editor wasn't open"); + + // Bugfix: The callback error value is nullable. + const editCallback = lastCall[1] as ( + error: undefined | Error, + value: string, + ) => void | Promise; + await editCallback(error, value ?? ''); +} + +describe('editor prompt', () => { + it('open editor after pressing enter', async () => { + const { answer, events, getScreen } = await render(editor, { + message: 'Add a description', + }); + + expect(getScreen()).toMatchInlineSnapshot( + `"? Add a description Press to launch your preferred editor."`, + ); + expect(editAsync).not.toHaveBeenCalled(); + + events.keypress('enter'); + expect(editAsync).toHaveBeenLastCalledWith('', expect.any(Function), { + postfix: '.txt', + }); + + await editorAction(undefined, 'value from editor'); + + await expect(answer).resolves.toEqual('value from editor'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Add a description"`); + }); + + it('open editor immediately', async () => { + const { answer, getScreen } = await render(editor, { + message: 'Add a description', + waitForUseInput: false, + }); + expect(editAsync).toHaveBeenLastCalledWith('', expect.any(Function), { + postfix: '.txt', + }); + + await editorAction(undefined, 'value from editor'); + + await expect(answer).resolves.toEqual('value from editor'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Add a description"`); + }); + + it('allow setting a default value & postfix', async () => { + const { answer, events, getScreen } = await render(editor, { + message: 'Add a description', + default: 'default description', + postfix: '.md', + }); + + expect(editAsync).not.toHaveBeenCalled(); + + events.keypress('enter'); + expect(editAsync).toHaveBeenLastCalledWith( + 'default description', + expect.any(Function), + { + postfix: '.md', + }, + ); + + await editorAction(undefined, 'value from editor'); + + await expect(answer).resolves.toEqual('value from editor'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Add a description"`); + }); + + it('allow setting temp file options', async () => { + const { answer, events, getScreen } = await render(editor, { + message: 'Add a description', + file: { + postfix: '.md', + dir: '/tmp', + }, + }); + + expect(editAsync).not.toHaveBeenCalled(); + + events.keypress('enter'); + expect(editAsync).toHaveBeenLastCalledWith('', expect.any(Function), { + postfix: '.md', + dir: '/tmp', + }); + + await editorAction(undefined, 'value from editor'); + + await expect(answer).resolves.toEqual('value from editor'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Add a description"`); + }); + + it('handles validation', async () => { + const { answer, events, getScreen } = await render(editor, { + message: 'Add a description', + validate: (value: string) => { + switch (value) { + case '1': { + return true; + } + case '2': { + return '"2" is not an allowed value'; + } + default: { + return false; + } + } + }, + }); + + expect(editAsync).not.toHaveBeenCalled(); + events.keypress('enter'); + + // Test default error message + const editPromise = editorAction(undefined, '3'); + events.type('foo'); // Ignored events while validation runs + await editPromise; + expect(getScreen()).toMatchInlineSnapshot(` + "? Add a description Press to launch your preferred editor. + > You must provide a valid value" + `); + + expect(editAsync).toHaveBeenCalledOnce(); + events.keypress('enter'); + expect(editAsync).toHaveBeenCalledTimes(2); + // Previous answer is passed in the second time for editing + expect(editAsync).toHaveBeenLastCalledWith('3', expect.any(Function), { + postfix: '.txt', + }); + + // Test user defined error message + await editorAction(undefined, '2'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Add a description Press to launch your preferred editor. + > "2" is not an allowed value" + `); + + events.keypress('enter'); + expect(editAsync).toHaveBeenCalledTimes(3); + + await editorAction(undefined, '1'); + await expect(answer).resolves.toEqual('1'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Add a description"`); + }); + + it('clear value on failed validation', async () => { + const { answer, events, getScreen } = await render(editor, { + message: 'Add a description', + validate: (value: string) => { + switch (value) { + case '1': { + return true; + } + case '2': { + return '"2" is not an allowed value'; + } + default: { + return false; + } + } + }, + theme: { + validationFailureMode: 'clear', + }, + }); + + expect(editAsync).not.toHaveBeenCalled(); + events.keypress('enter'); + + expect(editAsync).toHaveBeenCalledOnce(); + expect(editAsync).toHaveBeenLastCalledWith('', expect.any(Function), { + postfix: '.txt', + }); + await editorAction(undefined, 'foo bar'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Add a description Press to launch your preferred editor. + > You must provide a valid value" + `); + + events.keypress('enter'); + expect(editAsync).toHaveBeenCalledTimes(2); + // Because we clear, the second call goes back to an empty string + expect(editAsync).toHaveBeenLastCalledWith('', expect.any(Function), { + postfix: '.txt', + }); + + await editorAction(undefined, '1'); + await expect(answer).resolves.toEqual('1'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Add a description"`); + }); + + it('goes back to default value on failed validation', async () => { + const { answer, events, getScreen } = await render(editor, { + message: 'Add a description', + default: 'default value', + validate: (value: string) => { + switch (value) { + case '1': { + return true; + } + case '2': { + return '"2" is not an allowed value'; + } + default: { + return false; + } + } + }, + theme: { + validationFailureMode: 'clear', + }, + }); + + expect(editAsync).not.toHaveBeenCalled(); + events.keypress('enter'); + + expect(editAsync).toHaveBeenCalledOnce(); + expect(editAsync).toHaveBeenLastCalledWith('default value', expect.any(Function), { + postfix: '.txt', + }); + await editorAction(undefined, 'foo bar'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Add a description Press to launch your preferred editor. + > You must provide a valid value" + `); + + events.keypress('enter'); + expect(editAsync).toHaveBeenCalledTimes(2); + // Because we clear, the second call goes back to the default value + expect(editAsync).toHaveBeenLastCalledWith('default value', expect.any(Function), { + postfix: '.txt', + }); + + await editorAction(undefined, '1'); + await expect(answer).resolves.toEqual('1'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Add a description"`); + }); + + it('surfaces external-editor errors', async () => { + const { answer, events, getScreen } = await render(editor, { + message: 'Add a description', + }); + + expect(editAsync).not.toHaveBeenCalled(); + events.keypress('enter'); + + await editorAction(new Error('$EDITOR failed!'), ''); + expect(getScreen()).toMatchInlineSnapshot(` + "? Add a description Press to launch your preferred editor. + > Error: $EDITOR failed!" + `); + + expect(editAsync).toHaveBeenCalledOnce(); + events.keypress('enter'); + expect(editAsync).toHaveBeenCalledTimes(2); + + // Test user defined error message + await editorAction(undefined, 'new value'); + + await expect(answer).resolves.toEqual('new value'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Add a description"`); + }); +}); diff --git a/packages/editor/package.json b/packages/editor/package.json index 56343ccad..f54209be8 100644 --- a/packages/editor/package.json +++ b/packages/editor/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/editor", - "version": "2.2.0", + "version": "4.2.9", "description": "Inquirer multiline editor prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -50,40 +41,70 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/editor/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", + "@inquirer/core": "^10.1.9", + "@inquirer/type": "^3.0.5", "external-editor": "^3.1.0" }, "devDependencies": { - "@inquirer/testing": "^2.1.32" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "engines": { + "node": ">=18" }, "publishConfig": { "access": "public" }, - "engines": { - "node": ">=18" - }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/editor/src/index.mts b/packages/editor/src/index.mts deleted file mode 100644 index 055273cbf..000000000 --- a/packages/editor/src/index.mts +++ /dev/null @@ -1,93 +0,0 @@ -import { AsyncResource } from 'node:async_hooks'; -import { editAsync } from 'external-editor'; -import { - createPrompt, - useEffect, - useState, - useKeypress, - usePrefix, - isEnterKey, - makeTheme, - type Theme, -} from '@inquirer/core'; -import type { PartialDeep, InquirerReadline } from '@inquirer/type'; - -type EditorConfig = { - message: string; - default?: string; - postfix?: string; - waitForUseInput?: boolean; - validate?: (value: string) => boolean | string | Promise; - theme?: PartialDeep; -}; - -export default createPrompt((config, done) => { - const { waitForUseInput = true, postfix = '.txt', validate = () => true } = config; - const theme = makeTheme(config.theme); - - const [status, setStatus] = useState('pending'); - const [value, setValue] = useState(config.default || ''); - const [errorMsg, setError] = useState(); - - const isLoading = status === 'loading'; - const prefix = usePrefix({ isLoading, theme }); - - function startEditor(rl: InquirerReadline) { - rl.pause(); - - // Note: The bind call isn't strictly required. But we need it for our mocks to work as expected. - const editCallback = AsyncResource.bind(async (error: Error, answer: string) => { - rl.resume(); - if (error) { - setError(error.toString()); - } else { - setStatus('loading'); - const isValid = await validate(answer); - if (isValid === true) { - setError(undefined); - setStatus('done'); - done(answer); - } else { - setValue(answer); - setError(isValid || 'You must provide a valid value'); - setStatus('pending'); - } - } - }); - - editAsync(value, (error, answer) => void editCallback(error, answer), { postfix }); - } - - useEffect((rl) => { - if (!waitForUseInput) { - startEditor(rl); - } - }, []); - - useKeypress((key, rl) => { - // Ignore keypress while our prompt is doing other processing. - if (status !== 'pending') { - return; - } - - if (isEnterKey(key)) { - startEditor(rl); - } - }); - - const message = theme.style.message(config.message); - let helpTip = ''; - if (status === 'loading') { - helpTip = theme.style.help('Received'); - } else if (status === 'pending') { - const enterKey = theme.style.key('enter'); - helpTip = theme.style.help(`Press ${enterKey} to launch your preferred editor.`); - } - - let error = ''; - if (errorMsg) { - error = theme.style.error(errorMsg); - } - - return [[prefix, message, helpTip].filter(Boolean).join(' '), error]; -}); diff --git a/packages/editor/src/index.ts b/packages/editor/src/index.ts new file mode 100644 index 000000000..0319a8860 --- /dev/null +++ b/packages/editor/src/index.ts @@ -0,0 +1,116 @@ +import { AsyncResource } from 'node:async_hooks'; +import { editAsync, IFileOptions } from 'external-editor'; +import { + createPrompt, + useEffect, + useState, + useKeypress, + usePrefix, + isEnterKey, + makeTheme, + type Theme, + type Status, +} from '@inquirer/core'; +import type { PartialDeep, InquirerReadline } from '@inquirer/type'; + +type EditorTheme = { + validationFailureMode: 'keep' | 'clear'; +}; + +const editorTheme: EditorTheme = { + validationFailureMode: 'keep', +}; + +type EditorConfig = { + message: string; + default?: string; + postfix?: string; + waitForUseInput?: boolean; + validate?: (value: string) => boolean | string | Promise; + file?: IFileOptions; + theme?: PartialDeep>; +}; + +export default createPrompt((config, done) => { + const { + waitForUseInput = true, + file: { postfix = config.postfix ?? '.txt', ...fileProps } = {}, + validate = () => true, + } = config; + const theme = makeTheme(editorTheme, config.theme); + + const [status, setStatus] = useState('idle'); + const [value = '', setValue] = useState(config.default); + const [errorMsg, setError] = useState(); + + const prefix = usePrefix({ status, theme }); + + function startEditor(rl: InquirerReadline) { + rl.pause(); + + // Note: The bind call isn't strictly required. But we need it for our mocks to work as expected. + const editCallback = AsyncResource.bind( + async (error: Error | undefined, answer: string) => { + rl.resume(); + if (error) { + setError(error.toString()); + } else { + setStatus('loading'); + const isValid = await validate(answer); + if (isValid === true) { + setError(undefined); + setStatus('done'); + done(answer); + } else { + if (theme.validationFailureMode === 'clear') { + setValue(config.default); + } else { + setValue(answer); + } + + setError(isValid || 'You must provide a valid value'); + setStatus('idle'); + } + } + }, + ); + + editAsync(value, (error, answer) => void editCallback(error, answer), { + postfix, + ...fileProps, + }); + } + + useEffect((rl) => { + if (!waitForUseInput) { + startEditor(rl); + } + }, []); + + useKeypress((key, rl) => { + // Ignore keypress while our prompt is doing other processing. + if (status !== 'idle') { + return; + } + + if (isEnterKey(key)) { + startEditor(rl); + } + }); + + const message = theme.style.message(config.message, status); + let helpTip = ''; + if (status === 'loading') { + helpTip = theme.style.help('Received'); + } else if (status === 'idle') { + const enterKey = theme.style.key('enter'); + helpTip = theme.style.help(`Press ${enterKey} to launch your preferred editor.`); + } + + let error = ''; + if (errorMsg) { + error = theme.style.error(errorMsg); + } + + return [[prefix, message, helpTip].filter(Boolean).join(' '), error]; +}); diff --git a/packages/editor/tsconfig.cjs.json b/packages/editor/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/editor/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/editor/tsconfig.json b/packages/editor/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/editor/tsconfig.json +++ b/packages/editor/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/expand/.tshy/build.json b/packages/expand/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/expand/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/expand/.tshy/commonjs.json b/packages/expand/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/expand/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/expand/.tshy/esm.json b/packages/expand/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/expand/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/expand/README.md b/packages/expand/README.md index a62195dc5..8e17971b4 100644 --- a/packages/expand/README.md +++ b/packages/expand/README.md @@ -94,6 +94,8 @@ const answer = await expand({ | expanded | `boolean` | no | Expand the choices by default | | theme | [See Theming](#Theming) | no | Customize look of the prompt. | +`Separator` objects can be used in the `choices` array to render non-selectable lines in the choice list. By default it'll render a line, but you can provide the text as argument (`new Separator('-- Dependencies --')`). This option is often used to add labels to groups within long list of options. + ### `Choice` object The `Choice` object is typed as @@ -118,14 +120,14 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; defaultAnswer: (text: string) => string; highlight: (text: string) => string; diff --git a/packages/expand/expand.test.mts b/packages/expand/expand.test.ts similarity index 72% rename from packages/expand/expand.test.mts rename to packages/expand/expand.test.ts index c33b35856..714ded675 100644 --- a/packages/expand/expand.test.mts +++ b/packages/expand/expand.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { render } from '@inquirer/testing'; -import expand from './src/index.mjs'; +import expand, { Separator } from './src/index.js'; const overwriteChoices = [ { @@ -72,7 +72,7 @@ describe('expand prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot(`"? Overwrite this file? Abort"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Overwrite this file? Abort"`); await expect(answer).resolves.toEqual('abort'); }); @@ -139,11 +139,63 @@ describe('expand prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot(`"? Overwrite this file? Abort"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Overwrite this file? Abort"`); await expect(answer).resolves.toEqual('abort'); }); + it('supports separators', async () => { + const { answer, events, getScreen } = await render(expand, { + message: 'Overwrite this file?', + choices: [ + { + value: 'Yarn', + key: 'y', + }, + new Separator(), + { + value: 'npm', + key: 'n', + }, + ], + }); + + expect(getScreen()).toMatchInlineSnapshot(`"? Overwrite this file? (ynH)"`); + + events.type('h'); + events.keypress('enter'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Overwrite this file? h + y) Yarn + ────────────── + n) npm" + `); + + events.type('y'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Overwrite this file? y + y) Yarn + ────────────── + n) npm + >> Yarn" + `); + + events.keypress('backspace'); + events.type('n'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Overwrite this file? n + y) Yarn + ────────────── + n) npm + >> npm" + `); + + events.keypress('enter'); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Overwrite this file? npm"`); + + await expect(answer).resolves.toEqual('npm'); + }); + it('selects without value', async () => { const { answer, events, getScreen } = await render(expand, { message: 'Overwrite this file?', @@ -159,7 +211,7 @@ describe('expand prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Overwrite this file? Overwrite"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Overwrite this file? Overwrite"'); await expect(answer).resolves.toEqual('Overwrite'); }); @@ -179,16 +231,21 @@ describe('expand prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Overwrite this file? overwrite"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Overwrite this file? overwrite"'); await expect(answer).resolves.toEqual('overwrite'); }); it('handles empty selection', async () => { - const { answer, events, getScreen } = await render(expand, { - message: 'Overwrite this file?', - choices: overwriteChoices, - }); + const abortController = new AbortController(); + const { answer, events, getScreen } = await render( + expand, + { + message: 'Overwrite this file?', + choices: overwriteChoices, + }, + { signal: abortController.signal }, + ); expect(getScreen()).toMatchInlineSnapshot('"? Overwrite this file? (yadxH)"'); @@ -212,15 +269,20 @@ describe('expand prompt', () => { > Please input a value" `); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toThrow(); }); it('handles non-existing selection', async () => { - const { answer, events, getScreen } = await render(expand, { - message: 'Overwrite this file?', - choices: overwriteChoices, - }); + const abortController = new AbortController(); + const { answer, events, getScreen } = await render( + expand, + { + message: 'Overwrite this file?', + choices: overwriteChoices, + }, + { signal: abortController.signal }, + ); expect(getScreen()).toMatchInlineSnapshot('"? Overwrite this file? (yadxH)"'); @@ -231,7 +293,7 @@ describe('expand prompt', () => { > "4" isn't an available option" `); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toThrow(); }); @@ -245,17 +307,22 @@ describe('expand prompt', () => { expect(getScreen()).toMatchInlineSnapshot('"? Overwrite this file? (Yadxh)"'); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot(`"? Overwrite this file? Overwrite"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Overwrite this file? Overwrite"`); await expect(answer).resolves.toEqual('overwrite'); }); it('can defaults to expanded', async () => { - const { answer, getScreen } = await render(expand, { - message: 'Overwrite this file?', - choices: overwriteChoices, - expanded: true, - }); + const abortController = new AbortController(); + const { answer, getScreen } = await render( + expand, + { + message: 'Overwrite this file?', + choices: overwriteChoices, + expanded: true, + }, + { signal: abortController.signal }, + ); expect(getScreen()).toMatchInlineSnapshot(` "? Overwrite this file? @@ -265,7 +332,7 @@ describe('expand prompt', () => { x) Abort" `); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toThrow(); }); }); diff --git a/packages/expand/package.json b/packages/expand/package.json index c4a43e6a2..492f40ac2 100644 --- a/packages/expand/package.json +++ b/packages/expand/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/expand", - "version": "2.2.0", + "version": "4.0.11", "description": "Inquirer checkbox prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -50,40 +41,70 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/expand/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", + "@inquirer/core": "^10.1.9", + "@inquirer/type": "^3.0.5", "yoctocolors-cjs": "^2.1.2" }, "devDependencies": { - "@inquirer/testing": "^2.1.32" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "engines": { + "node": ">=18" }, "publishConfig": { "access": "public" }, - "engines": { - "node": ">=18" - }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/expand/src/index.mts b/packages/expand/src/index.ts similarity index 74% rename from packages/expand/src/index.mts rename to packages/expand/src/index.ts index d1ec68aef..4332ddc76 100644 --- a/packages/expand/src/index.mts +++ b/packages/expand/src/index.ts @@ -6,7 +6,9 @@ import { usePrefix, isEnterKey, makeTheme, + Separator, type Theme, + type Status, } from '@inquirer/core'; import type { PartialDeep } from '@inquirer/type'; import colors from 'yoctocolors-cjs'; @@ -64,18 +66,24 @@ type ExpandConfig< ChoicesObject = readonly { key: Key; name: string }[] | readonly Choice[], > = { message: string; - choices: ChoicesObject extends readonly { key: Key; name: string }[] + choices: ChoicesObject extends readonly (Separator | { key: Key; name: string })[] ? ChoicesObject - : readonly Choice[]; + : readonly (Separator | Choice)[]; default?: Key | 'h'; expanded?: boolean; theme?: PartialDeep; }; function normalizeChoices( - choices: readonly { key: Key; name: string }[] | readonly Choice[], -): NormalizedChoice[] { + choices: + | readonly (Separator | { key: Key; name: string })[] + | readonly (Separator | Choice)[], +): (Separator | NormalizedChoice)[] { return choices.map((choice) => { + if (Separator.isSeparator(choice)) { + return choice; + } + const name: string = 'name' in choice ? choice.name : String(choice.value); const value = 'value' in choice ? choice.value : name; return { @@ -93,15 +101,15 @@ const helpChoice = { }; export default createPrompt( - (config: ExpandConfig, done: (value: Value) => void) => { + (config: ExpandConfig, done: (value: Value) => void) => { const { default: defaultKey = 'h' } = config; const choices = useMemo(() => normalizeChoices(config.choices), [config.choices]); - const [status, setStatus] = useState('pending'); + const [status, setStatus] = useState('idle'); const [value, setValue] = useState(''); const [expanded, setExpanded] = useState(config.expanded ?? false); const [errorMsg, setError] = useState(); const theme = makeTheme(config.theme); - const prefix = usePrefix({ theme }); + const prefix = usePrefix({ theme, status }); useKeypress((event, rl) => { if (isEnterKey(event)) { @@ -109,7 +117,10 @@ export default createPrompt( if (answer === 'h' && !expanded) { setExpanded(true); } else { - const selectedChoice = choices.find(({ key }) => key === answer); + const selectedChoice = choices.find( + (choice): choice is NormalizedChoice => + !Separator.isSeparator(choice) && choice.key === answer, + ); if (selectedChoice) { setStatus('done'); // Set the value as we might've selected the default one. @@ -127,13 +138,14 @@ export default createPrompt( } }); - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); if (status === 'done') { // If the prompt is done, it's safe to assume there is a selected value. const selectedChoice = choices.find( - ({ key }) => key === value, - ) as NormalizedChoice; + (choice): choice is NormalizedChoice => + !Separator.isSeparator(choice) && choice.key === value.toLowerCase(), + )!; return `${prefix} ${message} ${theme.style.answer(selectedChoice.name)}`; } @@ -143,6 +155,8 @@ export default createPrompt( let longChoices = ''; let shortChoices = allChoices .map((choice) => { + if (Separator.isSeparator(choice)) return ''; + if (choice.key === defaultKey) { return choice.key.toUpperCase(); } @@ -157,6 +171,10 @@ export default createPrompt( shortChoices = ''; longChoices = allChoices .map((choice) => { + if (Separator.isSeparator(choice)) { + return ` ${choice.separator}`; + } + const line = ` ${choice.key}) ${choice.name}`; if (choice.key === value.toLowerCase()) { return theme.style.highlight(line); @@ -168,7 +186,10 @@ export default createPrompt( } let helpTip = ''; - const currentOption = allChoices.find(({ key }) => key === value.toLowerCase()); + const currentOption = choices.find( + (choice): choice is NormalizedChoice => + !Separator.isSeparator(choice) && choice.key === value.toLowerCase(), + ); if (currentOption) { helpTip = `${colors.cyan('>>')} ${currentOption.name}`; } @@ -184,3 +205,5 @@ export default createPrompt( ]; }, ); + +export { Separator } from '@inquirer/core'; diff --git a/packages/expand/tsconfig.cjs.json b/packages/expand/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/expand/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/expand/tsconfig.json b/packages/expand/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/expand/tsconfig.json +++ b/packages/expand/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/figures/.tshy/build.json b/packages/figures/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/figures/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/figures/.tshy/commonjs.json b/packages/figures/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/figures/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/figures/.tshy/esm.json b/packages/figures/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/figures/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/figures/figures.test.mts b/packages/figures/figures.test.ts similarity index 99% rename from packages/figures/figures.test.mts rename to packages/figures/figures.test.ts index bfb037896..d5a26db1a 100644 --- a/packages/figures/figures.test.mts +++ b/packages/figures/figures.test.ts @@ -5,9 +5,9 @@ afterAll(() => { }); it('falls back to ascii figures when unicode is not supported', async () => { - const { default: unicodeFigures } = await import('./src/index.mjs'); + const { default: unicodeFigures } = await import('./src/index.js'); vi.resetModules().stubEnv('TERM', 'linux'); - const { default: asciiFigures } = await import('./src/index.mjs'); + const { default: asciiFigures } = await import('./src/index.js'); expect(asciiFigures.checkboxOn).not.toEqual(unicodeFigures.checkboxOn); diff --git a/packages/figures/package.json b/packages/figures/package.json index 70716ee96..fa62d0a18 100644 --- a/packages/figures/package.json +++ b/packages/figures/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/figures", - "version": "1.0.5", + "version": "1.0.11", "description": "Vendored version of figures, for CJS compatibility", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -52,28 +43,52 @@ "types", "typescript" ], - "author": "Simon Boudrias ", - "license": "MIT", - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" - }, - "engines": { - "node": ">=18" + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", "exports": { + "./package.json": "./package.json", ".": { "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" }, "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" } } }, - "sideEffects": false + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" + }, + "engines": { + "node": ">=18" + }, + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + } } diff --git a/packages/figures/src/index.mts b/packages/figures/src/index.ts similarity index 100% rename from packages/figures/src/index.mts rename to packages/figures/src/index.ts diff --git a/packages/figures/tsconfig.cjs.json b/packages/figures/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/figures/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/figures/tsconfig.json b/packages/figures/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/figures/tsconfig.json +++ b/packages/figures/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/input/.tshy/build.json b/packages/input/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/input/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/input/.tshy/commonjs.json b/packages/input/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/input/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/input/.tshy/esm.json b/packages/input/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/input/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/input/README.md b/packages/input/README.md index 06c98eba2..5b2d95ba0 100644 --- a/packages/input/README.md +++ b/packages/input/README.md @@ -63,7 +63,7 @@ const answer = await input({ message: 'Enter your name' }); | Property | Type | Required | Description | | ----------- | ----------------------------------------------------------- | -------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | message | `string` | yes | The question to ask | -| default | `string` | no | Default value if no answer is provided (clear it by pressing backspace) | +| default | `string` | no | Default value if no answer is provided (press `backspace` to clear the default; press `tab` to inline the value for edits) | | required | `boolean` | no | Defaults to `false`. If set to true, `undefined` (empty) will not be accepted for this. | | transformer | `(string, { isFinal: boolean }) => string` | no | Transform/Format the raw value entered by the user. Once the prompt is completed, `isFinal` will be `true`. This function is purely visual, modify the answer in your code if needed. | | validate | `string => boolean \| string \| Promise` | no | On submit, validate the filtered answered content. When returning a string, it'll be used as the error message displayed to the user. Note: returning a rejected promise, we'll assume a code error happened and crash. | @@ -75,20 +75,23 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; defaultAnswer: (text: string) => string; }; + validationFailureMode: 'keep' | 'clear'; }; ``` +`validationFailureMode` defines the behavior of the prompt when the value submitted is invalid. By default, we'll keep the value allowing the user to edit it. When the theme option is set to `clear`, we'll remove and reset to an empty string. + # License Copyright (c) 2023 Simon Boudrias (twitter: [@vaxilart](https://twitter.com/Vaxilart))
diff --git a/packages/input/input.test.mts b/packages/input/input.test.ts similarity index 82% rename from packages/input/input.test.mts rename to packages/input/input.test.ts index 236d5ddec..d954b0b8d 100644 --- a/packages/input/input.test.mts +++ b/packages/input/input.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { render } from '@inquirer/testing'; -import input from './src/index.mjs'; +import input from './src/index.js'; describe('input prompt', () => { it('handle simple use case', async () => { @@ -17,7 +17,7 @@ describe('input prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('John'); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your name John"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your name John"`); }); it('handle transformer', async () => { @@ -34,7 +34,7 @@ describe('input prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('John'); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your name Transformed"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your name Transformed"`); }); it('handle synchronous validation', async () => { @@ -63,6 +63,34 @@ describe('input prompt', () => { await expect(answer).resolves.toEqual('2'); }); + it('can clear value when validation fail', async () => { + const { answer, events, getScreen } = await render(input, { + message: 'Answer 2 ===', + validate: (value: string) => value === '2', + theme: { + validationFailureMode: 'clear', + }, + }); + + expect(getScreen()).toMatchInlineSnapshot(`"? Answer 2 ==="`); + + events.type('1'); + expect(getScreen()).toMatchInlineSnapshot(`"? Answer 2 === 1"`); + + events.keypress('enter'); + await Promise.resolve(); + expect(getScreen()).toMatchInlineSnapshot(` + "? Answer 2 === + > You must provide a valid value" + `); + + events.type('2'); + expect(getScreen()).toMatchInlineSnapshot(`"? Answer 2 === 2"`); + + events.keypress('enter'); + await expect(answer).resolves.toEqual('2'); + }); + it('handle asynchronous validation', async () => { const { answer, events, getScreen } = await render(input, { message: 'Answer 2 ===', @@ -107,7 +135,7 @@ describe('input prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('Mike'); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your name Mike"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your name Mike"`); }); it('handle overwriting the default option', async () => { @@ -121,7 +149,7 @@ describe('input prompt', () => { events.type('John'); events.keypress('enter'); await expect(answer).resolves.toEqual('John'); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your name John"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your name John"`); }); it('handle removing the default option', async () => { @@ -135,7 +163,7 @@ describe('input prompt', () => { events.keypress('backspace'); events.keypress('enter'); await expect(answer).resolves.toEqual(''); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your name"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your name"`); }); it('handle editing the default option', async () => { @@ -152,7 +180,7 @@ describe('input prompt', () => { events.type('y'); events.keypress('enter'); await expect(answer).resolves.toEqual('Mikey'); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your name Mikey"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your name Mikey"`); }); it('shows validation message if user did not provide any value', async () => { @@ -193,7 +221,7 @@ describe('input prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('Mike'); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your name Mike"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your name Mike"`); }); it('is theme-able', async () => { diff --git a/packages/input/package.json b/packages/input/package.json index 90b935531..d9b221260 100644 --- a/packages/input/package.json +++ b/packages/input/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/input", - "version": "2.3.0", + "version": "4.1.8", "description": "Inquirer input text prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -50,39 +41,69 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/input/README.md", - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" }, - "devDependencies": { - "@inquirer/testing": "^2.1.32" + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "attw": "attw --pack", + "tsc": "tshy" }, - "publishConfig": { - "access": "public" + "dependencies": { + "@inquirer/core": "^10.1.9", + "@inquirer/type": "^3.0.5" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, "engines": { "node": ">=18" }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "publishConfig": { + "access": "public" + }, + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/input/src/index.mts b/packages/input/src/index.ts similarity index 73% rename from packages/input/src/index.mts rename to packages/input/src/index.ts index 9127a4c91..a39d1a164 100644 --- a/packages/input/src/index.mts +++ b/packages/input/src/index.ts @@ -7,32 +7,40 @@ import { isBackspaceKey, makeTheme, type Theme, + type Status, } from '@inquirer/core'; import type { PartialDeep } from '@inquirer/type'; +type InputTheme = { + validationFailureMode: 'keep' | 'clear'; +}; + +const inputTheme: InputTheme = { + validationFailureMode: 'keep', +}; + type InputConfig = { message: string; default?: string; required?: boolean; transformer?: (value: string, { isFinal }: { isFinal: boolean }) => string; validate?: (value: string) => boolean | string | Promise; - theme?: PartialDeep; + theme?: PartialDeep>; }; export default createPrompt((config, done) => { const { required, validate = () => true } = config; - const theme = makeTheme(config.theme); - const [status, setStatus] = useState('pending'); + const theme = makeTheme(inputTheme, config.theme); + const [status, setStatus] = useState('idle'); const [defaultValue = '', setDefaultValue] = useState(config.default); const [errorMsg, setError] = useState(); const [value, setValue] = useState(''); - const isLoading = status === 'loading'; - const prefix = usePrefix({ isLoading, theme }); + const prefix = usePrefix({ status, theme }); useKeypress(async (key, rl) => { // Ignore keypress while our prompt is doing other processing. - if (status !== 'pending') { + if (status !== 'idle') { return; } @@ -47,11 +55,15 @@ export default createPrompt((config, done) => { setStatus('done'); done(answer); } else { - // Reset the readline line value to the previous value. On line event, the value - // get cleared, forcing the user to re-enter the value instead of fixing it. - rl.write(value); + if (theme.validationFailureMode === 'clear') { + setValue(''); + } else { + // Reset the readline line value to the previous value. On line event, the value + // get cleared, forcing the user to re-enter the value instead of fixing it. + rl.write(value); + } setError(isValid || 'You must provide a valid value'); - setStatus('pending'); + setStatus('idle'); } } else if (isBackspaceKey(key) && !value) { setDefaultValue(undefined); @@ -66,7 +78,7 @@ export default createPrompt((config, done) => { } }); - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); let formattedValue = value; if (typeof config.transformer === 'function') { formattedValue = config.transformer(value, { isFinal: status === 'done' }); diff --git a/packages/input/tsconfig.cjs.json b/packages/input/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/input/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/input/tsconfig.json b/packages/input/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/input/tsconfig.json +++ b/packages/input/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/inquirer/.tshy/build.json b/packages/inquirer/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/inquirer/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/inquirer/.tshy/commonjs.json b/packages/inquirer/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/inquirer/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/inquirer/.tshy/esm.json b/packages/inquirer/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/inquirer/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/inquirer/examples/checkbox.mjs b/packages/inquirer/examples/checkbox.mjs index 4bcaf8c2b..78977f216 100644 --- a/packages/inquirer/examples/checkbox.mjs +++ b/packages/inquirer/examples/checkbox.mjs @@ -2,7 +2,7 @@ * Checkbox list examples */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; inquirer .prompt([ diff --git a/packages/inquirer/examples/editor.mjs b/packages/inquirer/examples/editor.mjs index cf12db455..92f4372fc 100644 --- a/packages/inquirer/examples/editor.mjs +++ b/packages/inquirer/examples/editor.mjs @@ -2,7 +2,7 @@ * Editor prompt example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const questions = [ { diff --git a/packages/inquirer/examples/expand.mjs b/packages/inquirer/examples/expand.mjs index 2e535f5e4..f34f87e87 100644 --- a/packages/inquirer/examples/expand.mjs +++ b/packages/inquirer/examples/expand.mjs @@ -2,7 +2,7 @@ * Expand list examples */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; inquirer .prompt([ diff --git a/packages/inquirer/examples/filter-validate-progress.mjs b/packages/inquirer/examples/filter-validate-progress.mjs index 2c8983c14..2570ebfc2 100644 --- a/packages/inquirer/examples/filter-validate-progress.mjs +++ b/packages/inquirer/examples/filter-validate-progress.mjs @@ -2,7 +2,7 @@ * Filter and validate progress example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const questions = [ { diff --git a/packages/inquirer/examples/hierarchical.mjs b/packages/inquirer/examples/hierarchical.mjs index 5782f095f..e3c30bd38 100644 --- a/packages/inquirer/examples/hierarchical.mjs +++ b/packages/inquirer/examples/hierarchical.mjs @@ -2,7 +2,7 @@ * Heirarchical conversation example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const directionsPrompt = { type: 'list', diff --git a/packages/inquirer/examples/input.mjs b/packages/inquirer/examples/input.mjs index e15530fde..71faea691 100644 --- a/packages/inquirer/examples/input.mjs +++ b/packages/inquirer/examples/input.mjs @@ -2,7 +2,7 @@ * Input prompt example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const questions = [ { diff --git a/packages/inquirer/examples/list.mjs b/packages/inquirer/examples/list.mjs index eac367b44..1ea36d6cb 100644 --- a/packages/inquirer/examples/list.mjs +++ b/packages/inquirer/examples/list.mjs @@ -2,7 +2,7 @@ * List prompt example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; inquirer .prompt([ diff --git a/packages/inquirer/examples/long-list.mjs b/packages/inquirer/examples/long-list.mjs index f6b58e96b..b47458fb5 100644 --- a/packages/inquirer/examples/long-list.mjs +++ b/packages/inquirer/examples/long-list.mjs @@ -2,7 +2,7 @@ * Paginated list */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const choices = Array.apply(0, Array.from({ length: 26 })).map((x, y) => String.fromCodePoint(y + 65), diff --git a/packages/inquirer/examples/nested-call.mjs b/packages/inquirer/examples/nested-call.mjs index 38a8d3b0f..906325e6a 100644 --- a/packages/inquirer/examples/nested-call.mjs +++ b/packages/inquirer/examples/nested-call.mjs @@ -2,7 +2,7 @@ * Nested Inquirer call */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; inquirer .prompt({ diff --git a/packages/inquirer/examples/password.mjs b/packages/inquirer/examples/password.mjs index 0c553ac26..d8dba4f6c 100644 --- a/packages/inquirer/examples/password.mjs +++ b/packages/inquirer/examples/password.mjs @@ -2,7 +2,7 @@ * Password prompt example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const requireLetterAndNumber = (value) => { if (/\w/.test(value) && /\d/.test(value)) { diff --git a/packages/inquirer/examples/pizza.mjs b/packages/inquirer/examples/pizza.mjs index 24e0f83b9..b1bef7b0e 100644 --- a/packages/inquirer/examples/pizza.mjs +++ b/packages/inquirer/examples/pizza.mjs @@ -3,7 +3,7 @@ * run example by writing `node pizza.mjs` in your console */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; console.log('Hi, welcome to Node Pizza'); diff --git a/packages/inquirer/examples/rawlist.mjs b/packages/inquirer/examples/rawlist.mjs index b9f6d57a5..723e7b610 100644 --- a/packages/inquirer/examples/rawlist.mjs +++ b/packages/inquirer/examples/rawlist.mjs @@ -2,7 +2,7 @@ * Raw List prompt example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; inquirer .prompt([ diff --git a/packages/inquirer/examples/recursive.mjs b/packages/inquirer/examples/recursive.mjs index c975a4dd5..60b41f464 100644 --- a/packages/inquirer/examples/recursive.mjs +++ b/packages/inquirer/examples/recursive.mjs @@ -3,7 +3,7 @@ * Allows user to choose when to exit prompt */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const questions = [ { diff --git a/packages/inquirer/examples/regex-validate-input.mjs b/packages/inquirer/examples/regex-validate-input.mjs index c44418a97..9c2dbc093 100644 --- a/packages/inquirer/examples/regex-validate-input.mjs +++ b/packages/inquirer/examples/regex-validate-input.mjs @@ -2,7 +2,7 @@ * Filter and validate progress example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const questions = [ { diff --git a/packages/inquirer/examples/rx-observable-array.mjs b/packages/inquirer/examples/rx-observable-array.mjs index 60f74c6a9..ff96e5f3a 100644 --- a/packages/inquirer/examples/rx-observable-array.mjs +++ b/packages/inquirer/examples/rx-observable-array.mjs @@ -1,5 +1,5 @@ import { from } from 'rxjs'; -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const questions = [ { diff --git a/packages/inquirer/examples/rx-observable-create.mjs b/packages/inquirer/examples/rx-observable-create.mjs index 60507c9fb..0ef187e8b 100644 --- a/packages/inquirer/examples/rx-observable-create.mjs +++ b/packages/inquirer/examples/rx-observable-create.mjs @@ -1,5 +1,5 @@ import { Observable } from 'rxjs'; -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const observe = new Observable((subscriber) => { subscriber.next({ diff --git a/packages/inquirer/examples/when.mjs b/packages/inquirer/examples/when.mjs index c4696eebc..ba8cbddfc 100644 --- a/packages/inquirer/examples/when.mjs +++ b/packages/inquirer/examples/when.mjs @@ -2,7 +2,7 @@ * When example */ -import inquirer from '../dist/esm/index.mjs'; +import inquirer from '../dist/esm/index.js'; const questions = [ { diff --git a/packages/inquirer/inquirer.test.mts b/packages/inquirer/inquirer.test.ts similarity index 78% rename from packages/inquirer/inquirer.test.mts rename to packages/inquirer/inquirer.test.ts index 589c07285..e6eae6c34 100644 --- a/packages/inquirer/inquirer.test.mts +++ b/packages/inquirer/inquirer.test.ts @@ -7,14 +7,18 @@ import fs from 'node:fs'; import os from 'node:os'; import stream from 'node:stream'; import tty from 'node:tty'; +import readline from 'node:readline'; import { vi, expect, beforeEach, afterEach, describe, it, expectTypeOf } from 'vitest'; import { of } from 'rxjs'; +import { AbortPromptError, createPrompt } from '@inquirer/core'; import type { InquirerReadline } from '@inquirer/type'; -import inquirer, { type QuestionMap } from './src/index.mjs'; -import type { Answers } from './src/types.mjs'; -import { _ } from './src/ui/prompt.mjs'; +import inquirer from './src/index.js'; +import type { QuestionMap, Answers, Question, DistinctQuestion } from './src/index.js'; +import { _ } from './src/ui/prompt.js'; -declare module './src/index.mjs' { +const actualCreateInterface = readline.createInterface; + +declare module './src/index.js' { interface QuestionMap { stub: { answer?: string | boolean; message: string; default?: string }; stub2: { answer?: string | boolean; message: string; default: string }; @@ -56,10 +60,95 @@ class StubFailingPrompt { close() {} } +class StubEventuallyFailingPrompt { + timeout?: NodeJS.Timeout; + + run() { + return new Promise((_, reject) => { + this.timeout = setTimeout(() => { + reject(new Error('This test prompt always reject')); + }, 1000); + }); + } + + close() { + clearTimeout(this.timeout); + } +} + beforeEach(() => { inquirer.restoreDefaultPrompts(); inquirer.registerPrompt('stub', StubPrompt); inquirer.registerPrompt('failing', StubFailingPrompt); + + vi.resetAllMocks(); +}); + +describe('exported types', () => { + it('Question type is not any', () => { + expectTypeOf({}).not.toMatchTypeOf(); + }); + + it('exported Question type requires type, name and message', () => { + const question = { + type: 'input', + name: 'q1', + message: 'message', + } as const; + expectTypeOf(question).toMatchTypeOf(); + expectTypeOf(question).toMatchTypeOf(); + expectTypeOf({ name: 'q1', message: 'message' }).not.toMatchTypeOf(); + expectTypeOf({ type: 'stub', message: 'message' }).not.toMatchTypeOf(); + expectTypeOf({ type: 'stub', name: 'q1' }).not.toMatchTypeOf(); + }); + + it('Exported types can be used with "as const satisfies Question" to keep prompt type inference', async () => { + const question = { + type: 'stub', + name: 'q1', + message: 'message', + } as const satisfies Question; + expectTypeOf(await inquirer.prompt(question)).toEqualTypeOf<{ q1: any }>(); + + const questions = [ + { + type: 'stub', + name: 'q1', + message: 'message', + }, + { + type: 'stub', + name: 'q2', + message: 'message', + }, + ] as const satisfies Question[]; + expectTypeOf(await inquirer.prompt(questions)).toEqualTypeOf<{ q1: any; q2: any }>(); + + const questions2 = [ + { + type: 'input', + name: 'q1', + message: 'message', + when: false, + }, + { + type: 'password', + name: 'q2', + message: 'message', + when: false, + }, + ] as const satisfies DistinctQuestion[]; + expectTypeOf(await inquirer.prompt(questions2)).toEqualTypeOf<{ q1: any; q2: any }>(); + }); + + it('exported Answers type is not any', () => { + expectTypeOf(false).not.toMatchTypeOf(); + }); + + it('exported Answers type matches any object', () => { + expectTypeOf({}).toMatchTypeOf(); + expectTypeOf({ foo: 'bar' }).toMatchTypeOf(); + }); }); describe('inquirer.prompt(...)', () => { @@ -139,6 +228,14 @@ describe('inquirer.prompt(...)', () => { }); it("should close and create a new readline instances each time it's called", async () => { + const actualCreateInterface = readline.createInterface; + vi.spyOn(readline, 'createInterface').mockImplementation((opts) => { + const rl = actualCreateInterface(opts); + vi.spyOn(rl, 'close'); + vi.spyOn((rl as unknown as InquirerReadline).output, 'end'); + return rl; + }); + const promise = inquirer.prompt([ { type: 'stub', @@ -147,11 +244,9 @@ describe('inquirer.prompt(...)', () => { }, ]); - const rl1 = promise.ui.rl as InquirerReadline; - vi.spyOn(rl1, 'close'); - vi.spyOn(rl1.output, 'end'); - await promise; + const rl1 = vi.mocked(readline.createInterface).mock.results[0]! + .value as InquirerReadline; expect(rl1.close).toHaveBeenCalledTimes(1); expect(rl1.output.end).toHaveBeenCalledTimes(1); @@ -163,18 +258,23 @@ describe('inquirer.prompt(...)', () => { }, ]); - const rl2 = promise2.ui.rl as InquirerReadline; - vi.spyOn(rl2, 'close'); - vi.spyOn(rl2.output, 'end'); - await promise2; + const rl2 = vi.mocked(readline.createInterface).mock.results[1]! + .value as InquirerReadline; expect(rl2.close).toHaveBeenCalledTimes(1); expect(rl2.output.end).toHaveBeenCalledTimes(1); - expect(rl1).not.toEqual(rl2); + expect(rl1).not.toBe(rl2); }); it('should close readline instance on rejected promise', async () => { + vi.spyOn(readline, 'createInterface').mockImplementation((opts) => { + const rl = actualCreateInterface(opts); + vi.spyOn(rl, 'close'); + vi.spyOn((rl as unknown as InquirerReadline).output, 'end'); + return rl; + }); + const promise = inquirer.prompt([ { type: 'failing', @@ -183,14 +283,12 @@ describe('inquirer.prompt(...)', () => { }, ]); - const rl1 = promise.ui.rl as InquirerReadline; - vi.spyOn(rl1, 'close'); - vi.spyOn(rl1.output, 'end'); + await expect(promise).rejects.toThrow(); - await promise.catch(() => { - expect(rl1.close).toHaveBeenCalledTimes(1); - expect(rl1.output.end).toHaveBeenCalledTimes(1); - }); + const rl = vi.mocked(readline.createInterface).mock.results[0]! + .value as InquirerReadline; + expect(rl.close).toHaveBeenCalledTimes(1); + expect(rl.output.end).toHaveBeenCalledTimes(1); }); it('should take a prompts array with nested names', async () => { @@ -424,6 +522,35 @@ describe('inquirer.prompt(...)', () => { expect(answers).toEqual({ name1: 'bar', name: undefined }); }); + it('should use `default` when passed along `choices`', async () => { + class FakeSelect { + constructor(question: QuestionMap['stubSelect']) { + expect(question.choices).toEqual([ + { name: 'A', value: 'A', checked: false }, + { name: 'B', value: 'B', checked: true }, + ]); + } + + run() { + return Promise.resolve(); + } + + close() {} + } + inquirer.registerPrompt('stubSelect', FakeSelect); + + const answers = await inquirer.prompt([ + { + type: 'stubSelect', + name: 'name', + message: 'message', + choices: ['A', 'B'], + default: ['B'], + }, + ]); + expect(answers).toEqual({ name: undefined }); + }); + it('should expose the Reactive interface', async () => { const spy = vi.fn(); @@ -758,6 +885,57 @@ describe('inquirer.prompt(...)', () => { }); }); +describe('AbortSignal support', () => { + it('throws on aborted signal', async () => { + const localPrompt = inquirer.createPromptModule({ + signal: AbortSignal.abort(), + }); + localPrompt.registerPrompt('stub', StubEventuallyFailingPrompt); + + const promise = localPrompt({ type: 'stub', name: 'q1', message: 'message' }); + await expect(promise).rejects.toThrow(AbortPromptError); + }); + + it('legacy prompts can be aborted by module signal', async () => { + const abortController = new AbortController(); + const localPrompt = inquirer.createPromptModule({ + signal: abortController.signal, + }); + localPrompt.registerPrompt('stub', StubEventuallyFailingPrompt); + + const promise = localPrompt({ type: 'stub', name: 'q1', message: 'message' }); + setTimeout(() => abortController.abort(), 0); + await expect(promise).rejects.toThrow(AbortPromptError); + }); + + it('modern prompts can be aborted by module signal', async () => { + const abortController = new AbortController(); + const localPrompt = inquirer.createPromptModule({ + signal: abortController.signal, + }); + localPrompt.registerPrompt( + 'stub', + createPrompt(() => 'dummy prompt'), + ); + + const promise = localPrompt({ type: 'stub', name: 'q1', message: 'message' }); + abortController.abort(); + await expect(promise).rejects.toThrow(AbortPromptError); + }); + + it('modern prompts can be aborted using ui.close()', async () => { + const localPrompt = inquirer.createPromptModule(); + localPrompt.registerPrompt( + 'stub', + createPrompt(() => 'dummy prompt'), + ); + + const promise = localPrompt({ type: 'stub', name: 'q1', message: 'message' }); + promise.ui.close(); + await expect(promise).rejects.toThrow(AbortPromptError); + }); +}); + describe('Non-TTY checks', () => { let original: boolean; diff --git a/packages/inquirer/package.json b/packages/inquirer/package.json index ac72b9055..bfc6e8730 100644 --- a/packages/inquirer/package.json +++ b/packages/inquirer/package.json @@ -1,12 +1,7 @@ { "name": "inquirer", - "version": "10.2.0", + "version": "12.5.0", "description": "A collection of common interactive command line user interfaces.", - "author": "Simon Boudrias ", - "main": "./dist/cjs/index.js", - "files": [ - "dist/**/*" - ], "keywords": [ "answer", "answers", @@ -46,42 +41,71 @@ "yo", "zsh" ], - "engines": { - "node": ">=18" - }, + "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/inquirer/README.md", "repository": { "type": "git", "url": "https://github.com/SBoudrias/Inquirer.js.git" }, "license": "MIT", - "dependencies": { - "@inquirer/prompts": "^5.4.0", - "@inquirer/type": "^1.5.3", - "@types/mute-stream": "^0.0.4", - "ansi-escapes": "^4.3.2", - "mute-stream": "^1.0.0", - "run-async": "^3.0.0", - "rxjs": "^7.8.1" - }, - "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/inquirer/README.md", + "author": "Simon Boudrias ", "sideEffects": false, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" - }, + "type": "module", "exports": { + "./package.json": "./package.json", ".": { "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" }, "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" } } }, - "typings": "./dist/cjs/types/index.d.ts" + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, + "dependencies": { + "@inquirer/core": "^10.1.9", + "@inquirer/prompts": "^7.4.0", + "@inquirer/type": "^3.0.5", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0", + "run-async": "^3.0.0", + "rxjs": "^7.8.2" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@repo/tsconfig": "workspace:*", + "@types/mute-stream": "^0.0.4", + "tshy": "^3.0.2" + }, + "engines": { + "node": ">=18" + }, + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/inquirer/src/index.mts b/packages/inquirer/src/index.ts similarity index 80% rename from packages/inquirer/src/index.mts rename to packages/inquirer/src/index.ts index 6c414dd1a..35ed4212f 100644 --- a/packages/inquirer/src/index.mts +++ b/packages/inquirer/src/index.ts @@ -17,24 +17,27 @@ import { Separator, } from '@inquirer/prompts'; import type { Prettify } from '@inquirer/type'; -import { default as PromptsRunner } from './ui/prompt.mjs'; -import type { - PromptCollection, - LegacyPromptConstructor, - PromptFn, -} from './ui/prompt.mjs'; +import PromptsRunner from './ui/prompt.js'; +import type { PromptCollection, LegacyPromptConstructor, PromptFn } from './ui/prompt.js'; import type { Answers, CustomQuestion, - BuiltInQuestion, + UnnamedDistinctQuestion, StreamOptions, QuestionMap, -} from './types.mjs'; + PromptSession, +} from './types.js'; import { Observable } from 'rxjs'; -export type { QuestionMap } from './types.mjs'; +export type { + QuestionMap, + Question, + DistinctQuestion, + Answers, + PromptSession, +} from './types.js'; -const defaultPrompts: PromptCollection = { +const builtInPrompts: PromptCollection = { input, select, /** @deprecated `list` is now named `select` */ @@ -59,8 +62,10 @@ type PromptReturnType = Promise> & { export function createPromptModule< Prompts extends Record> = never, >(opt?: StreamOptions) { - type Question = BuiltInQuestion | CustomQuestion; - type NamedQuestion = Question & { + type SpecificQuestion = + | UnnamedDistinctQuestion + | CustomQuestion; + type NamedQuestion = SpecificQuestion & { name: Extract; }; function promptModule< @@ -75,7 +80,7 @@ export function createPromptModule< PrefilledAnswers extends Answers = object, >( questions: { - [name in keyof A]: Question>; + [name in keyof A]: SpecificQuestion>; }, answers?: PrefilledAnswers, ): PromptReturnType>>>; @@ -94,11 +99,7 @@ export function createPromptModule< answers?: PrefilledAnswers, ): PromptReturnType; function promptModule( - questions: - | NamedQuestion[] - | Record> - | Observable> - | NamedQuestion, + questions: PromptSession, answers?: Partial, ): PromptReturnType { const runner = new PromptsRunner(promptModule.prompts, opt); @@ -107,7 +108,7 @@ export function createPromptModule< return Object.assign(promptPromise, { ui: runner }); } - promptModule.prompts = { ...defaultPrompts }; + promptModule.prompts = { ...builtInPrompts }; /** * Register a prompt type @@ -124,7 +125,7 @@ export function createPromptModule< * Register the defaults provider prompts */ promptModule.restoreDefaultPrompts = function () { - promptModule.prompts = { ...defaultPrompts }; + promptModule.prompts = { ...builtInPrompts }; }; return promptModule; diff --git a/packages/inquirer/src/run-async.d.ts b/packages/inquirer/src/run-async.d.ts index 13ac466e8..b55bbfc53 100644 --- a/packages/inquirer/src/run-async.d.ts +++ b/packages/inquirer/src/run-async.d.ts @@ -1,11 +1,9 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ -type ExtractPromise = T extends Promise ? U : T; - declare module 'run-async' { const runAsync: any>( func: F, - ) => (...args: Parameters) => Promise>>; + ) => (...args: Parameters) => Promise>>; export default runAsync; } diff --git a/packages/inquirer/src/types.mts b/packages/inquirer/src/types.ts similarity index 78% rename from packages/inquirer/src/types.mts rename to packages/inquirer/src/types.ts index 1a3d49da9..197631c35 100644 --- a/packages/inquirer/src/types.mts +++ b/packages/inquirer/src/types.ts @@ -20,7 +20,7 @@ type AsyncCallbackFunction = ( ...args: [error: null | undefined, value: R] | [error: Error, value: undefined] ) => void; -type AsyncGetterFunction = ( +export type AsyncGetterFunction = ( this: { async: () => AsyncCallbackFunction }, answers: Prettify>, ) => void | R | Promise; @@ -47,9 +47,13 @@ export interface QuestionMap { type KeyValueOrAsyncGetterFunction = T extends Record ? T[k] | AsyncGetterFunction : never; -export type AnyQuestion = { +export type Question = { type: Type; name: string; + message: string | AsyncGetterFunction; + default?: any; + choices?: any; + filter?: (answer: any, answers: Partial) => any; askAnswered?: boolean; when?: boolean | AsyncGetterFunction; }; @@ -71,8 +75,12 @@ type QuestionWithGetters< } >; -export type BuiltInQuestion = - | QuestionWithGetters<'checkbox', Parameters[0], A> +export type UnnamedDistinctQuestion = + | QuestionWithGetters< + 'checkbox', + Parameters[0] & { default: unknown[] }, + A + > | QuestionWithGetters<'confirm', Parameters[0], A> | QuestionWithGetters<'editor', Parameters[0], A> | QuestionWithGetters<'expand', Parameters[0], A> @@ -85,6 +93,12 @@ export type BuiltInQuestion = | QuestionWithGetters<'list', Parameters[0], A> | QuestionWithGetters<'select', Parameters[0], A>; +export type DistinctQuestion = Prettify< + UnnamedDistinctQuestion & { + name: Extract; + } +>; + export type CustomQuestion< A extends Answers, Q extends Record>, @@ -92,10 +106,9 @@ export type CustomQuestion< [key in Extract]: Readonly>; }[Extract]; -export type PromptSession> = - | Q[] - | Record> - | Observable - | Q; +export type PromptSession< + A extends Answers = Answers, + Q extends Question = Question, +> = Q[] | Record> | Observable | Q; export type StreamOptions = Prettify; diff --git a/packages/inquirer/src/ui/prompt.mts b/packages/inquirer/src/ui/prompt.mts deleted file mode 100644 index b0bf282db..000000000 --- a/packages/inquirer/src/ui/prompt.mts +++ /dev/null @@ -1,384 +0,0 @@ -/* eslint-disable @typescript-eslint/no-explicit-any */ -import readline from 'node:readline'; -import { - defer, - EMPTY, - from, - of, - concatMap, - filter, - reduce, - isObservable, - Observable, - lastValueFrom, -} from 'rxjs'; -import runAsync from 'run-async'; -import MuteStream from 'mute-stream'; -import type { InquirerReadline } from '@inquirer/type'; -import ansiEscapes from 'ansi-escapes'; -import type { Answers, AnyQuestion, PromptSession, StreamOptions } from '../types.mjs'; - -export const _ = { - set: (obj: Record, path: string = '', value: unknown): void => { - let pointer = obj; - path.split('.').forEach((key, index, arr) => { - if (key === '__proto__' || key === 'constructor') return; - - if (index === arr.length - 1) { - pointer[key] = value; - } else if (!(key in pointer) || typeof pointer[key] !== 'object') { - pointer[key] = {}; - } - - pointer = pointer[key] as Record; - }); - }, - get: ( - obj: object, - path: string | number | symbol = '', - defaultValue?: unknown, - ): any => { - const travel = (regexp: RegExp) => - String.prototype.split - .call(path, regexp) - .filter(Boolean) - .reduce( - // @ts-expect-error implicit any on res[key] - // eslint-disable-next-line @typescript-eslint/no-unsafe-return - (res, key) => (res !== null && res !== undefined ? res[key] : res), - obj, - ); - const result = travel(/[,[\]]+?/) || travel(/[,.[\]]+?/); - return result === undefined || result === obj ? defaultValue : result; - }, -}; - -/** - * Resolve a question property value if it is passed as a function. - * This method will overwrite the property on the question object with the received value. - */ -function fetchAsyncQuestionProperty>( - question: Q, - prop: string, - answers: A, -): Observable> { - if (prop in question) { - const propGetter = question[prop as keyof Q]; - if (typeof propGetter === 'function') { - return from( - runAsync(propGetter as (...args: unknown[]) => unknown)(answers).then((value) => { - return Object.assign(question, { [prop]: value }); - }), - ); - } - } - return of(question); -} - -export interface PromptBase { - /** - * Runs the prompt. - * - * @returns - * The result of the prompt. - */ - run(): Promise; -} - -/** - * Provides the functionality to initialize new prompts. - */ -export interface LegacyPromptConstructor { - /** - * Initializes a new instance of a prompt. - * - * @param question - * The question to prompt. - * - * @param readLine - * An object for reading from the command-line. - * - * @param answers - * The answers provided by the user. - */ - new ( - question: any, - readLine: InquirerReadline, - answers: Record, - ): PromptBase; -} - -export type PromptFn = ( - config: Config, - context?: StreamOptions, -) => Promise; - -/** - * Provides a set of prompt-constructors. - */ -export type PromptCollection = Record; - -class TTYError extends Error { - override name = 'TTYError'; - isTtyError = true; -} - -function setupReadlineOptions(opt: StreamOptions) { - // Inquirer 8.x: - // opt.skipTTYChecks = opt.skipTTYChecks === undefined ? opt.input !== undefined : opt.skipTTYChecks; - opt.skipTTYChecks = opt.skipTTYChecks === undefined ? true : opt.skipTTYChecks; - - // Default `input` to stdin - const input = opt.input || process.stdin; - - // Check if prompt is being called in TTY environment - // If it isn't return a failed promise - // @ts-expect-error: ignore isTTY type error - if (!opt.skipTTYChecks && !input.isTTY) { - throw new TTYError( - 'Prompts can not be meaningfully rendered in non-TTY environments', - ); - } - - // Add mute capabilities to the output - const ms = new MuteStream(); - ms.pipe(opt.output || process.stdout); - const output = ms; - - return { - terminal: true, - ...opt, - input, - output, - }; -} - -function isQuestionArray( - questions: PromptSession>, -): questions is AnyQuestion[] { - return Array.isArray(questions); -} - -function isQuestionMap( - questions: PromptSession>, -): questions is Record, 'name'>> { - return Object.values(questions).every( - (maybeQuestion) => - typeof maybeQuestion === 'object' && - !Array.isArray(maybeQuestion) && - maybeQuestion != null, - ); -} - -function isPromptConstructor( - prompt: PromptFn | LegacyPromptConstructor, -): prompt is LegacyPromptConstructor { - return Boolean( - prompt.prototype && - 'run' in prompt.prototype && - // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access - typeof prompt.prototype.run === 'function', - ); -} - -/** - * Base interface class other can inherits from - */ -export default class PromptsRunner { - prompts: PromptCollection; - answers: Partial = {}; - process: Observable = EMPTY; - onClose?: () => void; - opt: StreamOptions; - rl?: InquirerReadline; - - constructor(prompts: PromptCollection, opt: StreamOptions = {}) { - this.opt = opt; - this.prompts = prompts; - } - - async run(questions: PromptSession>, answers?: Partial): Promise { - // Keep global reference to the answers - this.answers = typeof answers === 'object' ? { ...answers } : {}; - - let obs: Observable>; - if (isQuestionArray(questions)) { - obs = from(questions); - } else if (isObservable(questions)) { - obs = questions; - } else if (isQuestionMap(questions)) { - // Case: Called with a set of { name: question } - obs = from( - Object.entries(questions).map(([name, question]): AnyQuestion => { - return Object.assign({}, question, { name }); - }), - ); - } else { - // Case: Called with a single question config - obs = from([questions]); - } - - this.process = obs.pipe(concatMap((question) => this.processQuestion(question))); - - return lastValueFrom( - this.process.pipe( - reduce((answersObj, answer: { name: string; answer: unknown }) => { - _.set(answersObj, answer.name, answer.answer); - return answersObj; - }, this.answers), - ), - ) - .then(() => this.answers as A) - .finally(() => this.close()); - } - - processQuestion(question: AnyQuestion) { - question = { ...question }; - return defer(() => { - const obs = of(question); - - return obs.pipe( - concatMap(this.setDefaultType), - concatMap(this.filterIfRunnable), - concatMap((question) => - fetchAsyncQuestionProperty(question, 'message', this.answers), - ), - concatMap((question) => - fetchAsyncQuestionProperty(question, 'default', this.answers), - ), - concatMap((question) => - fetchAsyncQuestionProperty(question, 'choices', this.answers), - ), - concatMap((question) => { - if ('choices' in question && Array.isArray(question.choices)) { - const choices = question.choices.map( - (choice: string | number | { value?: string; name: string }) => { - if (typeof choice === 'string' || typeof choice === 'number') { - return { name: choice, value: choice }; - } else if (!('value' in choice)) { - return { ...choice, value: choice.name }; - } - return choice; - }, - ); - - return of({ ...question, choices }); - } - - return of(question); - }), - concatMap((question) => this.fetchAnswer(question)), - ); - }); - } - - fetchAnswer(question: AnyQuestion) { - const prompt = this.prompts[question.type]; - - if (prompt == null) { - throw new Error(`Prompt for type ${question.type} not found`); - } - - return isPromptConstructor(prompt) - ? defer(() => { - const rl = readline.createInterface( - setupReadlineOptions(this.opt), - ) as InquirerReadline; - rl.resume(); - - const onClose = () => { - rl.removeListener('SIGINT', this.onForceClose); - rl.setPrompt(''); - rl.output.unmute(); - rl.output.write(ansiEscapes.cursorShow); - rl.output.end(); - rl.close(); - }; - this.onClose = onClose; - this.rl = rl; - - // Make sure new prompt start on a newline when closing - process.on('exit', this.onForceClose); - rl.on('SIGINT', this.onForceClose); - - const activePrompt = new prompt(question, rl, this.answers); - - return from( - activePrompt.run().then((answer: unknown) => { - onClose(); - this.onClose = undefined; - this.rl = undefined; - - return { name: question.name, answer }; - }), - ); - }) - : defer(() => - from( - prompt(question, this.opt).then((answer: unknown) => ({ - name: question.name, - answer, - })), - ), - ); - } - - /** - * Handle the ^C exit - */ - onForceClose = () => { - this.close(); - process.kill(process.pid, 'SIGINT'); - console.log(''); - }; - - /** - * Close the interface and cleanup listeners - */ - close = () => { - // Remove events listeners - process.removeListener('exit', this.onForceClose); - - if (typeof this.onClose === 'function') { - this.onClose(); - } - }; - - setDefaultType = (question: AnyQuestion): Observable> => { - // Default type to input - if (!this.prompts[question.type]) { - question = Object.assign({}, question, { type: 'input' }); - } - - return defer(() => of(question)); - }; - - filterIfRunnable = (question: AnyQuestion): Observable> => { - if ( - question.askAnswered !== true && - _.get(this.answers, question.name) !== undefined - ) { - return EMPTY; - } - - const { when } = question; - if (when === false) { - return EMPTY; - } - - if (typeof when !== 'function') { - return of(question); - } - - return defer(() => - from( - runAsync(when)(this.answers).then((shouldRun: boolean | void) => { - if (shouldRun) { - return question; - } - return; - }), - ).pipe(filter((val) => val != null)), - ); - }; -} diff --git a/packages/inquirer/src/ui/prompt.ts b/packages/inquirer/src/ui/prompt.ts new file mode 100644 index 000000000..37ebc1871 --- /dev/null +++ b/packages/inquirer/src/ui/prompt.ts @@ -0,0 +1,417 @@ +/* eslint-disable @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-return, @typescript-eslint/no-unsafe-assignment */ +import readline from 'node:readline'; +import { + defer, + EMPTY, + from, + of, + concatMap, + filter, + reduce, + isObservable, + Observable, + lastValueFrom, +} from 'rxjs'; +import runAsync from 'run-async'; +import MuteStream from 'mute-stream'; +import { AbortPromptError } from '@inquirer/core'; +import type { InquirerReadline } from '@inquirer/type'; +import ansiEscapes from 'ansi-escapes'; +import type { + Answers, + Question, + AsyncGetterFunction, + PromptSession, + StreamOptions, +} from '../types.js'; + +export const _ = { + set: (obj: Record, path: string = '', value: unknown): void => { + let pointer = obj; + path.split('.').forEach((key, index, arr) => { + if (key === '__proto__' || key === 'constructor') return; + + if (index === arr.length - 1) { + pointer[key] = value; + } else if (!(key in pointer) || typeof pointer[key] !== 'object') { + pointer[key] = {}; + } + + pointer = pointer[key] as Record; + }); + }, + get: ( + obj: object, + path: string | number | symbol = '', + defaultValue?: unknown, + ): any => { + const travel = (regexp: RegExp) => + String.prototype.split + .call(path, regexp) + .filter(Boolean) + .reduce( + // @ts-expect-error implicit any on res[key] + (res: object | undefined, key) => (res == null ? res : res[key]), + obj, + ); + const result = travel(/[,[\]]+?/) || travel(/[,.[\]]+?/); + return result === undefined || result === obj ? defaultValue : result; + }, +}; + +/** + * Resolve a question property value if it is passed as a function. + * This method will overwrite the property on the question object with the received value. + */ +async function fetchAsyncQuestionProperty< + A extends Answers, + Prop extends keyof Q, + Q extends Question, +>( + question: Q, + prop: Prop, + answers: A, +): Promise>> { + type RawValue = Exclude>; + + const propGetter = question[prop]; + if (typeof propGetter === 'function') { + return runAsync(propGetter as (...args: unknown[]) => Promise)(answers); + } + + return propGetter as RawValue; +} + +export interface PromptBase { + /** + * Runs the prompt. + * + * @returns + * The result of the prompt. + */ + run(): Promise; +} + +/** + * Provides the functionality to initialize new prompts. + */ +export interface LegacyPromptConstructor { + /** + * Initializes a new instance of a prompt. + * + * @param question + * The question to prompt. + * + * @param readLine + * An object for reading from the command-line. + * + * @param answers + * The answers provided by the user. + */ + new ( + question: any, + readLine: InquirerReadline, + answers: Record, + ): PromptBase; +} + +export type PromptFn = ( + config: Config, + context: StreamOptions & { signal: AbortSignal }, +) => Promise; + +/** + * Provides a set of prompt-constructors. + */ +export type PromptCollection = Record; + +class TTYError extends Error { + override name = 'TTYError'; + isTtyError = true; +} + +function setupReadlineOptions(opt: StreamOptions) { + // Inquirer 8.x: + // opt.skipTTYChecks = opt.skipTTYChecks === undefined ? opt.input !== undefined : opt.skipTTYChecks; + opt.skipTTYChecks = opt.skipTTYChecks === undefined ? true : opt.skipTTYChecks; + + // Default `input` to stdin + const input = opt.input || process.stdin; + + // Check if prompt is being called in TTY environment + // If it isn't return a failed promise + // @ts-expect-error: ignore isTTY type error + if (!opt.skipTTYChecks && !input.isTTY) { + throw new TTYError( + 'Prompts can not be meaningfully rendered in non-TTY environments', + ); + } + + // Add mute capabilities to the output + const ms = new MuteStream(); + ms.pipe(opt.output || process.stdout); + const output = ms; + + return { + terminal: true, + ...opt, + input, + output, + }; +} + +function isQuestionArray( + questions: PromptSession, +): questions is Question[] { + return Array.isArray(questions); +} + +function isQuestionMap( + questions: PromptSession, +): questions is Record, 'name'>> { + return Object.values(questions).every( + (maybeQuestion) => + typeof maybeQuestion === 'object' && + !Array.isArray(maybeQuestion) && + maybeQuestion != null, + ); +} + +function isPromptConstructor( + prompt: PromptFn | LegacyPromptConstructor, +): prompt is LegacyPromptConstructor { + return Boolean( + prompt.prototype && + 'run' in prompt.prototype && + // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access + typeof prompt.prototype.run === 'function', + ); +} + +/** + * Base interface class other can inherits from + */ +export default class PromptsRunner { + private prompts: PromptCollection; + answers: Partial = {}; + process: Observable = EMPTY; + private abortController: AbortController = new AbortController(); + private opt: StreamOptions; + + constructor(prompts: PromptCollection, opt: StreamOptions = {}) { + this.opt = opt; + this.prompts = prompts; + } + + async run(questions: PromptSession, answers?: Partial): Promise { + this.abortController = new AbortController(); + + // Keep global reference to the answers + this.answers = typeof answers === 'object' ? { ...answers } : {}; + + let obs: Observable>; + if (isQuestionArray(questions)) { + obs = from(questions); + } else if (isObservable(questions)) { + obs = questions; + } else if (isQuestionMap(questions)) { + // Case: Called with a set of { name: question } + obs = from( + Object.entries(questions).map(([name, question]): Question => { + return Object.assign({}, question, { name }); + }), + ); + } else { + // Case: Called with a single question config + obs = from([questions]); + } + + this.process = obs.pipe( + concatMap((question) => + of(question).pipe( + concatMap((question) => + from( + this.shouldRun(question).then((shouldRun: boolean | void) => { + if (shouldRun) { + return question; + } + return; + }), + ).pipe(filter((val) => val != null)), + ), + concatMap((question) => defer(() => from(this.fetchAnswer(question)))), + ), + ), + ); + + return lastValueFrom( + this.process.pipe( + reduce((answersObj, answer: { name: string; answer: unknown }) => { + _.set(answersObj, answer.name, answer.answer); + return answersObj; + }, this.answers), + ), + ) + .then(() => this.answers as A) + .finally(() => this.close()); + } + + private prepareQuestion = async (question: Question) => { + const [message, defaultValue, resolvedChoices] = await Promise.all([ + fetchAsyncQuestionProperty(question, 'message', this.answers), + fetchAsyncQuestionProperty(question, 'default', this.answers), + fetchAsyncQuestionProperty(question, 'choices', this.answers), + ]); + + let choices; + if (Array.isArray(resolvedChoices)) { + choices = resolvedChoices.map((choice: unknown) => { + const choiceObj = + typeof choice !== 'object' || choice == null + ? { name: choice, value: choice } + : { + ...choice, + value: + 'value' in choice + ? choice.value + : 'name' in choice + ? choice.name + : undefined, + }; + + if ('value' in choiceObj && Array.isArray(defaultValue)) { + // Add checked to question for backward compatibility. default was supported as alternative of per choice checked. + return { + checked: defaultValue.includes(choiceObj.value), + ...choiceObj, + }; + } + + return choiceObj; + }); + } + + return Object.assign({}, question, { + message, + default: defaultValue, + choices, + type: question.type in this.prompts ? question.type : 'input', + }); + }; + + private fetchAnswer = async (rawQuestion: Question) => { + const question = await this.prepareQuestion(rawQuestion); + const prompt = this.prompts[question.type]; + + if (prompt == null) { + throw new Error(`Prompt for type ${question.type} not found`); + } + + let cleanupSignal: (() => void) | undefined; + + const promptFn: PromptFn = isPromptConstructor(prompt) + ? (q, opt) => + new Promise((resolve, reject) => { + const { signal } = opt; + if (signal.aborted) { + reject(new AbortPromptError({ cause: signal.reason })); + return; + } + + const rl = readline.createInterface( + setupReadlineOptions(opt), + ) as unknown as InquirerReadline; + + /** + * Handle the ^C exit + */ + const onForceClose = () => { + this.close(); + process.kill(process.pid, 'SIGINT'); + console.log(''); + }; + + const onClose = () => { + process.removeListener('exit', onForceClose); + rl.removeListener('SIGINT', onForceClose); + rl.setPrompt(''); + rl.output.unmute(); + rl.output.write(ansiEscapes.cursorShow); + rl.output.end(); + rl.close(); + }; + + // Make sure new prompt start on a newline when closing + process.on('exit', onForceClose); + rl.on('SIGINT', onForceClose); + + const activePrompt = new prompt(q, rl, this.answers); + + const cleanup = () => { + onClose(); + cleanupSignal?.(); + }; + + const abort = () => { + reject(new AbortPromptError({ cause: signal.reason })); + cleanup(); + }; + signal.addEventListener('abort', abort); + cleanupSignal = () => { + signal.removeEventListener('abort', abort); + cleanupSignal = undefined; + }; + + activePrompt.run().then(resolve, reject).finally(cleanup); + }) + : prompt; + + let cleanupModuleSignal: (() => void) | undefined; + const { signal: moduleSignal } = this.opt; + if (moduleSignal?.aborted) { + this.abortController.abort(moduleSignal.reason); + } else if (moduleSignal) { + const abort = () => this.abortController.abort(moduleSignal.reason); + moduleSignal.addEventListener('abort', abort); + cleanupModuleSignal = () => { + moduleSignal.removeEventListener('abort', abort); + }; + } + + const { filter = (value) => value } = question; + const { signal } = this.abortController; + return promptFn(question, { ...this.opt, signal }) + .then((answer: unknown) => ({ + name: question.name, + answer: filter(answer, this.answers), + })) + .finally(() => { + cleanupSignal?.(); + cleanupModuleSignal?.(); + }); + }; + + /** + * Close the interface and cleanup listeners + */ + close = () => { + this.abortController.abort(); + }; + + private shouldRun = async (question: Question): Promise => { + if ( + question.askAnswered !== true && + _.get(this.answers, question.name) !== undefined + ) { + return false; + } + + const { when } = question; + if (typeof when === 'function') { + const shouldRun = await runAsync(when)(this.answers); + return Boolean(shouldRun); + } + + return when !== false; + }; +} diff --git a/packages/inquirer/tsconfig.cjs.json b/packages/inquirer/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/inquirer/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/inquirer/tsconfig.json b/packages/inquirer/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/inquirer/tsconfig.json +++ b/packages/inquirer/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/number/.tshy/build.json b/packages/number/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/number/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/number/.tshy/commonjs.json b/packages/number/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/number/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/number/.tshy/esm.json b/packages/number/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/number/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/number/README.md b/packages/number/README.md index bdd9a0548..f303e367e 100644 --- a/packages/number/README.md +++ b/packages/number/README.md @@ -75,14 +75,14 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; defaultAnswer: (text: string) => string; }; diff --git a/packages/number/number.test.mts b/packages/number/number.test.ts similarity index 90% rename from packages/number/number.test.mts rename to packages/number/number.test.ts index 4ef7e16f9..f1aea4158 100644 --- a/packages/number/number.test.mts +++ b/packages/number/number.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { render } from '@inquirer/testing'; -import number from './src/index.mjs'; +import number from './src/index.js'; describe('number prompt', () => { it('handle simple use case', async () => { @@ -17,7 +17,7 @@ describe('number prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(42); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 42"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 42"`); }); it('handle non numeric input', async () => { @@ -48,7 +48,7 @@ describe('number prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(2); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 2"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 2"`); }); it('supports min/max options', async () => { @@ -84,7 +84,7 @@ describe('number prompt', () => { events.type('30'); events.keypress('enter'); await expect(answer).resolves.toEqual(30); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 30"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 30"`); }); it('supports step option', async () => { @@ -108,7 +108,7 @@ describe('number prompt', () => { events.type('15'); events.keypress('enter'); await expect(answer).resolves.toEqual(15); - expect(getScreen()).toMatchInlineSnapshot(`"? Enter an increment of 5 15"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Enter an increment of 5 15"`); }); it('supports step option from min', async () => { @@ -134,7 +134,7 @@ describe('number prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(13); - expect(getScreen()).toMatchInlineSnapshot(`"? Enter an increment of 5 13"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Enter an increment of 5 13"`); }); it('drops invalid default', async () => { @@ -150,7 +150,7 @@ describe('number prompt', () => { events.type('22'); events.keypress('enter'); await expect(answer).resolves.toEqual(22); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 22"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 22"`); }); it('handle synchronous validation', async () => { @@ -223,7 +223,7 @@ describe('number prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(35); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 35"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 35"`); }); it('handle overwriting the default option', async () => { @@ -237,7 +237,7 @@ describe('number prompt', () => { events.type('37'); events.keypress('enter'); await expect(answer).resolves.toEqual(37); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 37"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 37"`); }); it('handle removing the default option', async () => { @@ -251,7 +251,7 @@ describe('number prompt', () => { events.keypress('backspace'); events.keypress('enter'); await expect(answer).resolves.toEqual(undefined); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age"`); }); it('handle removing the default option with required prompt', async () => { @@ -274,7 +274,7 @@ describe('number prompt', () => { events.type('1'); events.keypress('enter'); await expect(answer).resolves.toEqual(1); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 1"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 1"`); }); it('handle editing the default option', async () => { @@ -291,7 +291,7 @@ describe('number prompt', () => { events.type('1'); events.keypress('enter'); await expect(answer).resolves.toEqual(351); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 351"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 351"`); }); it('handle editing the answer (properly tracks cursor position)', async () => { @@ -314,7 +314,7 @@ describe('number prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(312); - expect(getScreen()).toMatchInlineSnapshot(`"? What is your age 312"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ What is your age 312"`); }); it('is theme-able', async () => { @@ -364,6 +364,6 @@ describe('number prompt', () => { events.type('10.01'); events.keypress('enter'); await expect(answer).resolves.toEqual(10.01); - expect(getScreen()).toMatchInlineSnapshot(`"? Enter a decimal number 10.01"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Enter a decimal number 10.01"`); }); }); diff --git a/packages/number/package.json b/packages/number/package.json index ce6911e57..de94086e7 100644 --- a/packages/number/package.json +++ b/packages/number/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/number", - "version": "1.1.0", + "version": "3.0.11", "description": "Inquirer number prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -50,39 +41,69 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/number/README.md", - "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3" + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" }, - "devDependencies": { - "@inquirer/testing": "^2.1.32" + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "attw": "attw --pack", + "tsc": "tshy" }, - "publishConfig": { - "access": "public" + "dependencies": { + "@inquirer/core": "^10.1.9", + "@inquirer/type": "^3.0.5" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, "engines": { "node": ">=18" }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "publishConfig": { + "access": "public" + }, + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/number/src/index.mts b/packages/number/src/index.ts similarity index 93% rename from packages/number/src/index.mts rename to packages/number/src/index.ts index f75e3d1fd..44334e4d6 100644 --- a/packages/number/src/index.mts +++ b/packages/number/src/index.ts @@ -7,6 +7,7 @@ import { isBackspaceKey, makeTheme, type Theme, + type Status, } from '@inquirer/core'; import type { PartialDeep } from '@inquirer/type'; @@ -61,7 +62,7 @@ export default createPrompt((config, done) => required = false, } = config; const theme = makeTheme(config.theme); - const [status, setStatus] = useState('pending'); + const [status, setStatus] = useState('idle'); const [value, setValue] = useState(''); // store the input value as string and convert to number on "Enter" // Ignore default if not valid. @@ -72,12 +73,11 @@ export default createPrompt((config, done) => const [defaultValue = '', setDefaultValue] = useState(validDefault); const [errorMsg, setError] = useState(); - const isLoading = status === 'loading'; - const prefix = usePrefix({ isLoading, theme }); + const prefix = usePrefix({ status, theme }); useKeypress(async (key, rl) => { // Ignore keypress while our prompt is doing other processing. - if (status !== 'pending') { + if (status !== 'idle') { return; } @@ -103,7 +103,7 @@ export default createPrompt((config, done) => // get cleared, forcing the user to re-enter the value instead of fixing it. rl.write(value); setError(isValid || 'You must provide a valid numeric value'); - setStatus('pending'); + setStatus('idle'); } } else if (isBackspaceKey(key) && !value) { setDefaultValue(undefined); @@ -118,7 +118,7 @@ export default createPrompt((config, done) => } }); - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); let formattedValue = value; if (status === 'done') { formattedValue = theme.style.answer(value); diff --git a/packages/number/tsconfig.cjs.json b/packages/number/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/number/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/number/tsconfig.json b/packages/number/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/number/tsconfig.json +++ b/packages/number/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/password/.tshy/build.json b/packages/password/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/password/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/password/.tshy/commonjs.json b/packages/password/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/password/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/password/.tshy/esm.json b/packages/password/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/password/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/password/README.md b/packages/password/README.md index b42199743..b265ad5f8 100644 --- a/packages/password/README.md +++ b/packages/password/README.md @@ -73,14 +73,14 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; help: (text: string) => string; }; diff --git a/packages/password/package.json b/packages/password/package.json index 2c63eeaa9..4d20db591 100644 --- a/packages/password/package.json +++ b/packages/password/package.json @@ -1,19 +1,7 @@ { "name": "@inquirer/password", - "version": "2.2.0", - "engines": { - "node": ">=18" - }, + "version": "4.0.11", "description": "Inquirer password prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -53,37 +41,70 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/password/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", + "@inquirer/core": "^10.1.9", + "@inquirer/type": "^3.0.5", "ansi-escapes": "^4.3.2" }, "devDependencies": { - "@inquirer/testing": "^2.1.32" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "engines": { + "node": ">=18" }, "publishConfig": { "access": "public" }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/password/password.test.mts b/packages/password/password.test.ts similarity index 89% rename from packages/password/password.test.mts rename to packages/password/password.test.ts index 7a1093ec6..351917f43 100644 --- a/packages/password/password.test.mts +++ b/packages/password/password.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { render } from '@inquirer/testing'; -import password from './src/index.mjs'; +import password from './src/index.js'; describe('password prompt', () => { it('handle muted input', async () => { @@ -21,7 +21,7 @@ describe('password prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('John'); - expect(getScreen()).toMatchInlineSnapshot('"? Enter your password"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Enter your password"'); }); it('handle masked input', async () => { @@ -39,7 +39,7 @@ describe('password prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('John'); - expect(getScreen()).toMatchInlineSnapshot('"? Enter your password ****"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Enter your password ****"'); }); it('handle custom masked input', async () => { @@ -57,7 +57,7 @@ describe('password prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('John'); - expect(getScreen()).toMatchInlineSnapshot('"? Enter your password %%%%"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Enter your password %%%%"'); }); it('handle synchronous validation', async () => { diff --git a/packages/password/src/index.mts b/packages/password/src/index.ts similarity index 87% rename from packages/password/src/index.mts rename to packages/password/src/index.ts index 8a4b627ef..989daf244 100644 --- a/packages/password/src/index.mts +++ b/packages/password/src/index.ts @@ -6,6 +6,7 @@ import { isEnterKey, makeTheme, type Theme, + type Status, } from '@inquirer/core'; import ansiEscapes from 'ansi-escapes'; import type { PartialDeep } from '@inquirer/type'; @@ -21,16 +22,15 @@ export default createPrompt((config, done) => { const { validate = () => true } = config; const theme = makeTheme(config.theme); - const [status, setStatus] = useState('pending'); + const [status, setStatus] = useState('idle'); const [errorMsg, setError] = useState(); const [value, setValue] = useState(''); - const isLoading = status === 'loading'; - const prefix = usePrefix({ isLoading, theme }); + const prefix = usePrefix({ status, theme }); useKeypress(async (key, rl) => { // Ignore keypress while our prompt is doing other processing. - if (status !== 'pending') { + if (status !== 'idle') { return; } @@ -47,7 +47,7 @@ export default createPrompt((config, done) => { // get cleared, forcing the user to re-enter the value instead of fixing it. rl.write(value); setError(isValid || 'You must provide a valid value'); - setStatus('pending'); + setStatus('idle'); } } else { setValue(rl.line); @@ -55,7 +55,7 @@ export default createPrompt((config, done) => { } }); - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); let formattedValue = ''; let helpTip; diff --git a/packages/password/tsconfig.cjs.json b/packages/password/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/password/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/password/tsconfig.json b/packages/password/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/password/tsconfig.json +++ b/packages/password/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/prompts/.tshy/build.json b/packages/prompts/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/prompts/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/prompts/.tshy/commonjs.json b/packages/prompts/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/prompts/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/prompts/.tshy/esm.json b/packages/prompts/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/prompts/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/prompts/README.md b/packages/prompts/README.md index 6c07179a2..f54c9e072 100644 --- a/packages/prompts/README.md +++ b/packages/prompts/README.md @@ -192,7 +192,7 @@ const allowEmail = await confirm( ## Canceling prompt -This can preferably be done with either an `AbortController` or `AbortSignal`. +This can be done with either an `AbortController` or `AbortSignal`. ```js // Example 1: using built-in AbortSignal utilities @@ -202,7 +202,7 @@ const answer = await confirm({ ... }, { signal: AbortSignal.timeout(5000) }); ``` ```js -// Example 1: implementing custom cancellation logic +// Example 2: implementing custom cancellation with an AbortController import { confirm } from '@inquirer/prompts'; const controller = new AbortController(); @@ -213,19 +213,37 @@ setTimeout(() => { const answer = await confirm({ ... }, { signal: controller.signal }); ``` -Alternatively, all prompt functions are returning a cancelable promise. This special promise type has a `cancel` method that'll cancel and cleanup the prompt. - -On calling `cancel`, the answer promise will become rejected. +# Recipes -```js -import { confirm } from '@inquirer/prompts'; +## Handling `ctrl+c` gracefully -const promise = confirm(...); // Warning: for this pattern to work, `await` cannot be used. +When a user press `ctrl+c` to exit a prompt, Inquirer rejects the prompt promise. This is the expected behavior in order to allow your program to teardown/cleanup its environment. When using `async/await`, rejected promises throw their error. When unhandled, those errors print their stack trace in your user's terminal. -promise.cancel(); +``` +ExitPromptError: User force closed the prompt with 0 null + at file://example/packages/core/dist/esm/lib/create-prompt.js:55:20 + at Emitter.emit (file://example/node_modules/signal-exit/dist/mjs/index.js:67:19) + at #processEmit (file://example/node_modules/signal-exit/dist/mjs/index.js:236:27) + at #process.emit (file://example/node_modules/signal-exit/dist/mjs/index.js:187:37) + at process.callbackTrampoline (node:internal/async_hooks:130:17) ``` -# Recipes +This isn't a great UX, which is why we highly recommend you to handle those errors gracefully. + +First option is to wrap your scripts in `try/catch`; like [we do in our demo program](https://github.com/SBoudrias/Inquirer.js/blob/649e78147cbb6390a162ff842d4b21d53a233472/packages/demo/src/index.ts#L89-L95). Or handle the error in your CLI framework mechanism; for example [`Clipanion catch` method](https://mael.dev/clipanion/docs/errors#custom-error-handling). + +Lastly, you could handle the error globally with an event listener and silence it. + +```ts +process.on('uncaughtException', (error) => { + if (error instanceof Error && error.name === 'ExitPromptError') { + console.log('👋 until next time!'); + } else { + // Rethrow unknown errors + throw error; + } +}); +``` ## Get answers in an object @@ -295,6 +313,22 @@ exec < /dev/tty node my-script.js ``` +## Using with nodemon + +When using inquirer prompts with nodemon, you need to pass the `--no-stdin` flag for everything to work as expected. + +```sh +npx nodemon ./packages/demo/demos/password.mjs --no-stdin +``` + +Note that for most of you, you'll be able to use the new watch-mode built-in Node. This mode works out of the box with inquirer. + +```sh +# One of depending on your need +node --watch script.js +node --watch-path=packages/ packages/demo/ +``` + ## Wait for config Maybe some question configuration require to await a value. diff --git a/packages/prompts/package.json b/packages/prompts/package.json index f96e12b04..695605415 100644 --- a/packages/prompts/package.json +++ b/packages/prompts/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/prompts", - "version": "5.4.0", + "version": "7.4.0", "description": "Inquirer prompts, combined in a single package", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -52,44 +43,74 @@ "types", "typescript" ], - "author": "Simon Boudrias ", - "license": "MIT", - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" - }, - "engines": { - "node": ">=18" + "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/prompts/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", "exports": { + "./package.json": "./package.json", ".": { "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" }, "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" } } }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/checkbox": "^2.5.0", - "@inquirer/confirm": "^3.2.0", - "@inquirer/editor": "^2.2.0", - "@inquirer/expand": "^2.2.0", - "@inquirer/input": "^2.3.0", - "@inquirer/number": "^1.1.0", - "@inquirer/password": "^2.2.0", - "@inquirer/rawlist": "^2.3.0", - "@inquirer/search": "^1.1.0", - "@inquirer/select": "^2.5.0" + "@inquirer/checkbox": "^4.1.4", + "@inquirer/confirm": "^5.1.8", + "@inquirer/editor": "^4.2.9", + "@inquirer/expand": "^4.0.11", + "@inquirer/input": "^4.1.8", + "@inquirer/number": "^3.0.11", + "@inquirer/password": "^4.0.11", + "@inquirer/rawlist": "^4.0.11", + "@inquirer/search": "^3.0.11", + "@inquirer/select": "^4.1.0" }, "devDependencies": { - "@inquirer/type": "^1.5.3" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/type": "^3.0.5", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, - "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/prompts/README.md", - "sideEffects": false + "engines": { + "node": ">=18" + }, + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/prompts/prompts.test.mts b/packages/prompts/prompts.test.ts similarity index 98% rename from packages/prompts/prompts.test.mts rename to packages/prompts/prompts.test.ts index 7b97e827f..cd69f9008 100644 --- a/packages/prompts/prompts.test.mts +++ b/packages/prompts/prompts.test.ts @@ -10,7 +10,7 @@ import { search, select, Separator, -} from './src/index.mjs'; +} from './src/index.js'; describe('@inquirer/prompts', () => { it('export prompt functions', () => { diff --git a/packages/prompts/src/index.mts b/packages/prompts/src/index.ts similarity index 100% rename from packages/prompts/src/index.mts rename to packages/prompts/src/index.ts diff --git a/packages/prompts/tsconfig.cjs.json b/packages/prompts/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/prompts/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/prompts/tsconfig.json b/packages/prompts/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/prompts/tsconfig.json +++ b/packages/prompts/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/rawlist/.tshy/build.json b/packages/rawlist/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/rawlist/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/rawlist/.tshy/commonjs.json b/packages/rawlist/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/rawlist/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/rawlist/.tshy/esm.json b/packages/rawlist/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/rawlist/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/rawlist/README.md b/packages/rawlist/README.md index 48599f0a8..5565bc92f 100644 --- a/packages/rawlist/README.md +++ b/packages/rawlist/README.md @@ -103,14 +103,14 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; highlight: (text: string) => string; }; diff --git a/packages/rawlist/package.json b/packages/rawlist/package.json index 06797acc0..2e94d8fd5 100644 --- a/packages/rawlist/package.json +++ b/packages/rawlist/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/rawlist", - "version": "2.3.0", + "version": "4.0.11", "description": "Inquirer rawlist prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -50,40 +41,70 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/rawlist/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/type": "^1.5.3", + "@inquirer/core": "^10.1.9", + "@inquirer/type": "^3.0.5", "yoctocolors-cjs": "^2.1.2" }, "devDependencies": { - "@inquirer/testing": "^2.1.32" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "engines": { + "node": ">=18" }, "publishConfig": { "access": "public" }, - "engines": { - "node": ">=18" - }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/rawlist/rawlist.test.mts b/packages/rawlist/rawlist.test.ts similarity index 80% rename from packages/rawlist/rawlist.test.mts rename to packages/rawlist/rawlist.test.ts index d29876df6..0849f6b94 100644 --- a/packages/rawlist/rawlist.test.mts +++ b/packages/rawlist/rawlist.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect } from 'vitest'; import { render } from '@inquirer/testing'; -import rawlist, { Separator } from './src/index.mjs'; +import rawlist, { Separator } from './src/index.js'; const numberedChoices = [ { value: 1 }, @@ -28,7 +28,7 @@ describe('rawlist prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 4"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 4"'); await expect(answer).resolves.toEqual(4); }); @@ -50,7 +50,7 @@ describe('rawlist prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 4"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 4"'); await expect(answer).resolves.toEqual('4'); }); @@ -82,7 +82,7 @@ describe('rawlist prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('MX'); - expect(getScreen()).toMatchInlineSnapshot(`"? Select a country Mex"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Select a country Mex"`); }); it('skip separator by number key', async () => { @@ -111,16 +111,21 @@ describe('rawlist prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping Pepperoni"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping Pepperoni"'); await expect(answer).resolves.toEqual('pepperoni'); }); it('errors when no selected options', async () => { - const { answer, events, getScreen } = await render(rawlist, { - message: 'Select a number', - choices: numberedChoices, - }); + const abortController = new AbortController(); + const { answer, events, getScreen } = await render( + rawlist, + { + message: 'Select a number', + choices: numberedChoices, + }, + { signal: abortController.signal }, + ); expect(getScreen()).toMatchInlineSnapshot(` "? Select a number @@ -142,15 +147,20 @@ describe('rawlist prompt', () => { > Please input a value" `); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toThrow(); }); it('errors when selecting invalid option', async () => { - const { answer, events, getScreen } = await render(rawlist, { - message: 'Select a number', - choices: numberedChoices, - }); + const abortController = new AbortController(); + const { answer, events, getScreen } = await render( + rawlist, + { + message: 'Select a number', + choices: numberedChoices, + }, + { signal: abortController.signal }, + ); events.type('A'); expect(getScreen()).toMatchInlineSnapshot(` @@ -173,7 +183,7 @@ describe('rawlist prompt', () => { > "A" isn't an available option" `); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toThrow(); }); @@ -202,7 +212,7 @@ describe('rawlist prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number No"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number No"'); await expect(answer).resolves.toEqual('no'); }); diff --git a/packages/rawlist/src/index.mts b/packages/rawlist/src/index.ts similarity index 90% rename from packages/rawlist/src/index.mts rename to packages/rawlist/src/index.ts index 4744cc44f..d767c0e67 100644 --- a/packages/rawlist/src/index.mts +++ b/packages/rawlist/src/index.ts @@ -8,6 +8,7 @@ import { Separator, makeTheme, type Theme, + type Status, } from '@inquirer/core'; import type { PartialDeep } from '@inquirer/type'; import colors from 'yoctocolors-cjs'; @@ -75,13 +76,13 @@ function normalizeChoices( } export default createPrompt( - (config: RawlistConfig, done: (value: Value) => void) => { + (config: RawlistConfig, done: (value: Value) => void) => { const choices = useMemo(() => normalizeChoices(config.choices), [config.choices]); - const [status, setStatus] = useState('pending'); + const [status, setStatus] = useState('idle'); const [value, setValue] = useState(''); const [errorMsg, setError] = useState(); const theme = makeTheme(config.theme); - const prefix = usePrefix({ theme }); + const prefix = usePrefix({ status, theme }); useKeypress((key, rl) => { if (isEnterKey(key)) { @@ -96,9 +97,7 @@ export default createPrompt( } if (isSelectableChoice(selectedChoice)) { - setValue( - selectedChoice.short ?? selectedChoice.name ?? String(selectedChoice.value), - ); + setValue(selectedChoice.short); setStatus('done'); done(selectedChoice.value); } else if (value === '') { @@ -112,7 +111,7 @@ export default createPrompt( } }); - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); if (status === 'done') { return `${prefix} ${message} ${theme.style.answer(value)}`; diff --git a/packages/rawlist/tsconfig.cjs.json b/packages/rawlist/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/rawlist/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/rawlist/tsconfig.json b/packages/rawlist/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/rawlist/tsconfig.json +++ b/packages/rawlist/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/search/.tshy/build.json b/packages/search/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/search/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/search/.tshy/commonjs.json b/packages/search/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/search/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/search/.tshy/esm.json b/packages/search/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/search/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/search/README.md b/packages/search/README.md index ce70ee44d..8eed511da 100644 --- a/packages/search/README.md +++ b/packages/search/README.md @@ -144,14 +144,14 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; help: (text: string) => string; highlight: (text: string) => string; diff --git a/packages/search/package.json b/packages/search/package.json index c6a452cfe..83699c44e 100644 --- a/packages/search/package.json +++ b/packages/search/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/search", - "version": "1.1.0", + "version": "3.0.11", "description": "Inquirer search prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -50,41 +41,71 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/search/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", + "@inquirer/core": "^10.1.9", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.5", "yoctocolors-cjs": "^2.1.2" }, "devDependencies": { - "@inquirer/testing": "^2.1.32" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "engines": { + "node": ">=18" }, "publishConfig": { "access": "public" }, - "engines": { - "node": ">=18" - }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/search/search.test.mts b/packages/search/search.test.ts similarity index 90% rename from packages/search/search.test.mts rename to packages/search/search.test.ts index 403b051dc..dfa1c67bd 100644 --- a/packages/search/search.test.mts +++ b/packages/search/search.test.ts @@ -1,6 +1,6 @@ import { describe, it, expect, expectTypeOf } from 'vitest'; import { render } from '@inquirer/testing'; -import search, { Separator } from './src/index.mjs'; +import search, { Separator } from './src/index.js'; // Array of all countries names as string const PROVINCES = [ @@ -69,7 +69,7 @@ describe('search prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('NB'); expect(getScreen()).toMatchInlineSnapshot( - `"? Select a Canadian province New Brunswick"`, + `"✔ Select a Canadian province New Brunswick"`, ); }); @@ -176,7 +176,7 @@ describe('search prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('NL'); expect(getScreen()).toMatchInlineSnapshot( - `"? Select a Canadian province Newfoundland and Labrador"`, + `"✔ Select a Canadian province Newfoundland and Labrador"`, ); }); @@ -222,19 +222,24 @@ describe('search prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('NB'); expect(getScreen()).toMatchInlineSnapshot( - `"? Select a Canadian province New Brunswick"`, + `"✔ Select a Canadian province New Brunswick"`, ); }); it('handles search errors', async () => { - const { answer, events, getScreen } = await render(search, { - message: 'Select a Canadian province', - source: (term: string | void) => { - if (!term) return Promise.resolve([]); - - throw new Error("You're being rate limited"); + const abortController = new AbortController(); + const { answer, events, getScreen } = await render( + search, + { + message: 'Select a Canadian province', + source: (term: string | void) => { + if (!term) return Promise.resolve([]); + + throw new Error("You're being rate limited"); + }, }, - }); + { signal: abortController.signal }, + ); expect(getScreen()).toMatchInlineSnapshot(`"? Select a Canadian province"`); @@ -245,15 +250,20 @@ describe('search prompt', () => { > You're being rate limited" `); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toThrow(); }); it('handles empty results', async () => { - const { answer, events, getScreen } = await render(search, { - message: 'Select a Canadian province', - source: () => [], - }); + const abortController = new AbortController(); + const { answer, events, getScreen } = await render( + search, + { + message: 'Select a Canadian province', + source: () => [], + }, + { signal: abortController.signal }, + ); expect(getScreen()).toMatchInlineSnapshot(`"? Select a Canadian province"`); @@ -267,7 +277,7 @@ describe('search prompt', () => { events.keypress('backspace'); expect(getScreen()).toMatchInlineSnapshot(`"? Select a Canadian province"`); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toThrow(); }); @@ -328,7 +338,7 @@ describe('search prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('United States'); - expect(getScreen()).toMatchInlineSnapshot(`"? Select a country United States"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Select a country United States"`); }); it('handles choices with descriptions', async () => { @@ -374,15 +384,20 @@ describe('search prompt', () => { }); it('allows default parameters to be used as source function parameters', async () => { - const { answer } = await render(search, { - message: 'Select a family', - source: (term: string = '') => { - expectTypeOf(term).toEqualTypeOf(); - return []; + const abortController = new AbortController(); + const { answer } = await render( + search, + { + message: 'Select a family', + source: (term: string = '') => { + expectTypeOf(term).toEqualTypeOf(); + return []; + }, }, - }); + { signal: abortController.signal }, + ); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toThrow(); }); diff --git a/packages/search/src/index.mts b/packages/search/src/index.ts similarity index 92% rename from packages/search/src/index.mts rename to packages/search/src/index.ts index 879caf17c..3c3db6062 100644 --- a/packages/search/src/index.mts +++ b/packages/search/src/index.ts @@ -11,6 +11,7 @@ import { Separator, makeTheme, type Theme, + type Status, } from '@inquirer/core'; import colors from 'yoctocolors-cjs'; import figures from '@inquirer/figures'; @@ -106,18 +107,17 @@ function normalizeChoices( } export default createPrompt( - (config: SearchConfig, done: (value: Value) => void) => { + (config: SearchConfig, done: (value: Value) => void) => { const { pageSize = 7, validate = () => true } = config; const theme = makeTheme(searchTheme, config.theme); const firstRender = useRef(true); - const [status, setStatus] = useState('searching'); + const [status, setStatus] = useState('loading'); const [searchTerm, setSearchTerm] = useState(''); const [searchResults, setSearchResults] = useState>>([]); const [searchError, setSearchError] = useState(); - const isLoading = status === 'loading' || status === 'searching'; - const prefix = usePrefix({ isLoading, theme }); + const prefix = usePrefix({ status, theme }); const bounds = useMemo(() => { const first = searchResults.findIndex(isSelectable); @@ -131,7 +131,7 @@ export default createPrompt( useEffect(() => { const controller = new AbortController(); - setStatus('searching'); + setStatus('loading'); setSearchError(undefined); const fetchResults = async () => { @@ -145,7 +145,7 @@ export default createPrompt( setActive(undefined); setSearchError(undefined); setSearchResults(normalizeChoices(results)); - setStatus('pending'); + setStatus('idle'); } } catch (error: unknown) { if (!controller.signal.aborted && error instanceof Error) { @@ -169,7 +169,7 @@ export default createPrompt( if (selectedChoice) { setStatus('loading'); const isValid = await validate(selectedChoice.value); - setStatus('pending'); + setStatus('idle'); if (isValid === true) { setStatus('done'); @@ -190,7 +190,7 @@ export default createPrompt( rl.clearLine(0); // Remove the tab character. rl.write(selectedChoice.name); setSearchTerm(selectedChoice.name); - } else if (status !== 'searching' && (key.name === 'up' || key.name === 'down')) { + } else if (status !== 'loading' && (key.name === 'up' || key.name === 'down')) { rl.clearLine(0); if ( (key.name === 'up' && active !== bounds.first) || @@ -208,7 +208,7 @@ export default createPrompt( } }); - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); if (active > 0) { firstRender.current = false; @@ -251,13 +251,13 @@ export default createPrompt( let error; if (searchError) { error = theme.style.error(searchError); - } else if (searchResults.length === 0 && searchTerm !== '' && status === 'pending') { + } else if (searchResults.length === 0 && searchTerm !== '' && status === 'idle') { error = theme.style.error('No results found'); } let searchStr; if (status === 'done' && selectedChoice) { - const answer = selectedChoice.short ?? selectedChoice.name; + const answer = selectedChoice.short; return `${prefix} ${message} ${theme.style.answer(answer)}`; } else { searchStr = theme.style.searchTerm(searchTerm); diff --git a/packages/search/tsconfig.cjs.json b/packages/search/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/search/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/search/tsconfig.json b/packages/search/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/search/tsconfig.json +++ b/packages/search/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/select/.tshy/build.json b/packages/select/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/select/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/select/.tshy/commonjs.json b/packages/select/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/select/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/select/.tshy/esm.json b/packages/select/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/select/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/select/README.md b/packages/select/README.md index fae706983..0c7067e68 100644 --- a/packages/select/README.md +++ b/packages/select/README.md @@ -126,14 +126,14 @@ You can theme a prompt by passing a `theme` object option. The theme object only ```ts type Theme = { - prefix: string; + prefix: string | { idle: string; done: string }; spinner: { interval: number; frames: string[]; }; style: { answer: (text: string) => string; - message: (text: string) => string; + message: (text: string, status: 'idle' | 'done' | 'loading') => string; error: (text: string) => string; help: (text: string) => string; highlight: (text: string) => string; @@ -144,6 +144,7 @@ type Theme = { cursor: string; }; helpMode: 'always' | 'never' | 'auto'; + indexMode: 'hidden' | 'number'; }; ``` @@ -153,6 +154,13 @@ type Theme = { - `always`: The help tips will always show and never hide. - `never`: The help tips will never show. +### `theme.indexMode` + +Controls how indices are displayed before each choice: + +- `hidden` (default): No indices are shown +- `number`: Display a number before each choice (e.g. "1. Option A") + # License Copyright (c) 2023 Simon Boudrias (twitter: [@vaxilart](https://twitter.com/Vaxilart))
diff --git a/packages/select/package.json b/packages/select/package.json index ae936d4d6..9050bbbcc 100644 --- a/packages/select/package.json +++ b/packages/select/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/select", - "version": "2.5.0", + "version": "4.1.0", "description": "Inquirer select/list prompt", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -50,42 +41,72 @@ "yo", "zsh" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/select/README.md", + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" + }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", + "exports": { + "./package.json": "./package.json", + ".": { + "import": { + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" + }, + "require": { + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" + } + } + }, + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, "dependencies": { - "@inquirer/core": "^9.1.0", - "@inquirer/figures": "^1.0.5", - "@inquirer/type": "^1.5.3", + "@inquirer/core": "^10.1.9", + "@inquirer/figures": "^1.0.11", + "@inquirer/type": "^3.0.5", "ansi-escapes": "^4.3.2", "yoctocolors-cjs": "^2.1.2" }, "devDependencies": { - "@inquirer/testing": "^2.1.32" + "@arethetypeswrong/cli": "^0.17.4", + "@inquirer/testing": "^2.1.45", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "engines": { + "node": ">=18" }, "publishConfig": { "access": "public" }, - "engines": { - "node": ">=18" - }, - "exports": { - ".": { - "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" - }, - "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" - } + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" } }, - "sideEffects": false + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/select/select.test.mts b/packages/select/select.test.ts similarity index 80% rename from packages/select/select.test.mts rename to packages/select/select.test.ts index d5bd2a44d..0ba77f1e3 100644 --- a/packages/select/select.test.mts +++ b/packages/select/select.test.ts @@ -1,7 +1,7 @@ import { describe, it, expect, vi, afterEach } from 'vitest'; import { render } from '@inquirer/testing'; import { ValidationError } from '@inquirer/core'; -import select, { Separator } from './src/index.mjs'; +import select, { Separator } from './src/index.js'; const numberedChoices = [ { value: 1 }, @@ -18,6 +18,21 @@ const numberedChoices = [ { value: 12 }, ] as const; +const complexStringChoices = [ + { name: '1 a', value: '1 a' }, + { name: '1 b', value: '1 b' }, + { name: '2', value: '2' }, + { name: '3', value: '3' }, + { name: '4 a', value: '4 a' }, + { name: '4 b', value: '4 b' }, + { name: '4 c', value: '4 c' }, + { name: '5', value: '5' }, + { name: '6', value: '6' }, + { name: '7.1', value: '7.1' }, + { name: '7.2', value: '7.2' }, + { name: '8', value: '8' }, +] as const; + afterEach(() => { vi.useRealTimers(); }); @@ -55,7 +70,7 @@ describe('select prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 3"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 3"'); await expect(answer).resolves.toEqual(3); }); @@ -76,7 +91,7 @@ describe('select prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(1); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 1"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 1"'); }); it('allow passing strings as choices', async () => { @@ -93,7 +108,7 @@ describe('select prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot(`"? Select one Option A"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Select one Option A"`); await expect(answer).resolves.toEqual('Option A'); }); @@ -104,7 +119,7 @@ describe('select prompt', () => { choices: numberedChoices, }); - events.keypress('4'); + events.type('4'); expect(getScreen()).toMatchInlineSnapshot(` "? Select a number 1 @@ -117,11 +132,83 @@ describe('select prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 4"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 4"'); await expect(answer).resolves.toEqual(4); }); + it('use 2-digits number to select an option', async () => { + const { answer, events, getScreen } = await render(select, { + message: 'Select a number', + choices: numberedChoices, + }); + + events.type('12'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number + ❯ 12 + 1 + 2 + 3 + 4 + 5 + 6" + `); + + events.keypress('enter'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 12"'); + + await expect(answer).resolves.toEqual(12); + }); + + it('select an option with a mix of letters and digits by index (7th option)', async () => { + const { answer, events, getScreen } = await render(select, { + message: 'Select an option', + choices: complexStringChoices, + }); + + events.type('7'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Select an option + 3 + 4 a + 4 b + ❯ 4 c + 5 + 6 + 7.1" + `); + + events.keypress('enter'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select an option 4 c"'); + + await expect(answer).resolves.toEqual('4 c'); + }); + + it('select an option with a mix of letters and digits by text starting with a number (7.)', async () => { + const { answer, events, getScreen } = await render(select, { + message: 'Select an option', + choices: complexStringChoices, + }); + + events.type('7.'); + expect(getScreen()).toMatchInlineSnapshot(` + "? Select an option + 4 c + 5 + 6 + ❯ 7.1 + 7.2 + 8 + 1 a" + `); + + events.keypress('enter'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select an option 7.1"'); + + await expect(answer).resolves.toEqual('7.1'); + }); + it('allow setting a smaller page size', async () => { const { answer, events, getScreen } = await render(select, { message: 'Select a number', @@ -330,7 +417,7 @@ describe('select prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping Pepperoni"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping Pepperoni"'); await expect(answer).resolves.toEqual('pepperoni'); }); @@ -361,19 +448,24 @@ describe('select prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping Ham"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping Ham"'); await expect(answer).resolves.toEqual('ham'); }); it('allow customizing disabled label', async () => { - const { answer, getScreen } = await render(select, { - message: 'Select a topping', - choices: [ - { name: 'Ham', value: 'ham' }, - { name: 'Pineapple', value: 'pineapple', disabled: '*premium*' }, - ], - }); + const abortController = new AbortController(); + const { answer, getScreen } = await render( + select, + { + message: 'Select a topping', + choices: [ + { name: 'Ham', value: 'ham' }, + { name: 'Pineapple', value: 'pineapple', disabled: '*premium*' }, + ], + }, + { signal: abortController.signal }, + ); expect(getScreen()).toMatchInlineSnapshot(` "? Select a topping (Use arrow keys) @@ -381,7 +473,7 @@ describe('select prompt', () => { - Pineapple *premium*" `); - answer.cancel(); + abortController.abort(); await expect(answer).rejects.toBeInstanceOf(Error); }); @@ -416,7 +508,7 @@ describe('select prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual('2cc9e311'); - expect(getScreen()).toMatchInlineSnapshot(`"? Select a commit 2cc9e311"`); + expect(getScreen()).toMatchInlineSnapshot(`"✔ Select a commit 2cc9e311"`); }); it('throws if all choices are disabled', async () => { @@ -460,7 +552,7 @@ describe('select prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping Pepperoni"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping Pepperoni"'); await expect(answer).resolves.toEqual('pepperoni'); }); @@ -491,7 +583,7 @@ describe('select prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping Ham"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping Ham"'); await expect(answer).resolves.toEqual('ham'); }); @@ -521,7 +613,7 @@ describe('select prompt', () => { `); events.keypress('enter'); - expect(getScreen()).toMatchInlineSnapshot('"? Select a topping Pineapple"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a topping Pineapple"'); await expect(answer).resolves.toEqual('pineapple'); }); @@ -651,7 +743,7 @@ describe('select prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(2); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 2"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 2"'); }); it('helpMode: always', async () => { @@ -690,7 +782,7 @@ describe('select prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(2); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 2"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 2"'); }); it('helpMode: never', async () => { @@ -727,7 +819,30 @@ describe('select prompt', () => { events.keypress('enter'); await expect(answer).resolves.toEqual(2); - expect(getScreen()).toMatchInlineSnapshot('"? Select a number 2"'); + expect(getScreen()).toMatchInlineSnapshot('"✔ Select a number 2"'); + }); + }); + + it('Displays the element index', async () => { + const { answer, events, getScreen } = await render(select, { + message: 'Select a number', + choices: numberedChoices, + theme: { indexMode: 'number' }, }); + + expect(getScreen()).toMatchInlineSnapshot(` + "? Select a number + ❯ 1. 1 + 2. 2 + 3. 3 + 4. 4 + 5. 5 + 6. 6 + 7. 7 + (Use arrow keys to reveal more choices)" + `); + + events.keypress('enter'); + await expect(answer).resolves.toEqual(1); }); }); diff --git a/packages/select/src/index.mts b/packages/select/src/index.ts similarity index 87% rename from packages/select/src/index.mts rename to packages/select/src/index.ts index 4a3959c1e..c7e613b66 100644 --- a/packages/select/src/index.mts +++ b/packages/select/src/index.ts @@ -16,6 +16,7 @@ import { ValidationError, makeTheme, type Theme, + type Status, } from '@inquirer/core'; import type { PartialDeep } from '@inquirer/type'; import colors from 'yoctocolors-cjs'; @@ -29,6 +30,7 @@ type SelectTheme = { description: (text: string) => string; }; helpMode: 'always' | 'never' | 'auto'; + indexMode: 'hidden' | 'number'; }; const selectTheme: SelectTheme = { @@ -38,6 +40,7 @@ const selectTheme: SelectTheme = { description: (text: string) => colors.cyan(text), }, helpMode: 'auto', + indexMode: 'hidden', }; type Choice = { @@ -106,12 +109,12 @@ function normalizeChoices( } export default createPrompt( - (config: SelectConfig, done: (value: Value) => void) => { + (config: SelectConfig, done: (value: Value) => void) => { const { loop = true, pageSize = 7 } = config; const firstRender = useRef(true); const theme = makeTheme(selectTheme, config.theme); - const prefix = usePrefix({ theme }); - const [status, setStatus] = useState('pending'); + const [status, setStatus] = useState('idle'); + const prefix = usePrefix({ status, theme }); const searchTimeoutRef = useRef>(); const items = useMemo(() => normalizeChoices(config.choices), [config.choices]); @@ -120,7 +123,7 @@ export default createPrompt( const first = items.findIndex(isSelectable); const last = items.findLastIndex(isSelectable); - if (first < 0) { + if (first === -1) { throw new ValidationError( '[select prompt] No selectable choices. All choices are disabled.', ); @@ -163,13 +166,16 @@ export default createPrompt( } while (!isSelectable(items[next]!)); setActive(next); } - } else if (isNumberKey(key)) { - rl.clearLine(0); - const position = Number(key.name) - 1; + } else if (isNumberKey(key) && !Number.isNaN(Number(rl.line))) { + const position = Number(rl.line) - 1; const item = items[position]; if (item != null && isSelectable(item)) { setActive(position); } + + searchTimeoutRef.current = setTimeout(() => { + rl.clearLine(0); + }, 700); } else if (isBackspaceKey(key)) { rl.clearLine(0); } else { @@ -181,7 +187,7 @@ export default createPrompt( return item.name.toLowerCase().startsWith(searchTerm); }); - if (matchIndex >= 0) { + if (matchIndex !== -1) { setActive(matchIndex); } @@ -198,7 +204,7 @@ export default createPrompt( [], ); - const message = theme.style.message(config.message); + const message = theme.style.message(config.message, status); let helpTipTop = ''; let helpTipBottom = ''; @@ -218,20 +224,21 @@ export default createPrompt( const page = usePagination({ items, active, - renderItem({ item, isActive }) { + renderItem({ item, isActive, index }) { if (Separator.isSeparator(item)) { return ` ${item.separator}`; } + const indexLabel = theme.indexMode === 'number' ? `${index + 1}. ` : ''; if (item.disabled) { const disabledLabel = typeof item.disabled === 'string' ? item.disabled : '(disabled)'; - return theme.style.disabled(`${item.name} ${disabledLabel}`); + return theme.style.disabled(`${indexLabel}${item.name} ${disabledLabel}`); } const color = isActive ? theme.style.highlight : (x: string) => x; const cursor = isActive ? theme.icon.cursor : ` `; - return color(`${cursor} ${item.name}`); + return color(`${cursor} ${indexLabel}${item.name}`); }, pageSize, loop, diff --git a/packages/select/tsconfig.cjs.json b/packages/select/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/select/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/select/tsconfig.json b/packages/select/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/select/tsconfig.json +++ b/packages/select/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/testing/.tshy/build.json b/packages/testing/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/testing/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/testing/.tshy/commonjs.json b/packages/testing/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/testing/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/testing/.tshy/esm.json b/packages/testing/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/testing/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/testing/README.md b/packages/testing/README.md index d9fba89ed..662c2e13d 100644 --- a/packages/testing/README.md +++ b/packages/testing/README.md @@ -72,7 +72,7 @@ The core utility of `@inquirer/testing` is the `render()` function. This `render 3. `events` (`{ keypress: (name | Key) => void, type: (string) => void }`) Is the utilities allowing you to interact with the prompt. Use it to trigger keypress events, or typing any input. 4. `getFullOutput` (`() => string`) Return a raw dump of everything that got sent on the output stream. -You can refer to [the `@inquirer/input` prompt test suite](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/input/input.test.mts) as a practical example. +You can refer to [the `@inquirer/input` prompt test suite](https://github.com/SBoudrias/Inquirer.js/blob/main/packages/input/input.test.ts) as a practical example. # License diff --git a/packages/testing/package.json b/packages/testing/package.json index 53aa85150..b9cb18098 100644 --- a/packages/testing/package.json +++ b/packages/testing/package.json @@ -1,19 +1,7 @@ { "name": "@inquirer/testing", - "version": "2.1.32", - "engines": { - "node": ">=18" - }, + "version": "2.1.45", "description": "Inquirer testing utilities", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -56,34 +44,68 @@ "testing", "unit-test" ], - "author": "Simon Boudrias ", - "license": "MIT", "homepage": "https://github.com/SBoudrias/Inquirer.js/blob/main/packages/testing/README.md", - "dependencies": { - "@inquirer/type": "^1.5.3", - "@types/mute-stream": "^0.0.4", - "@types/node": "^22.5.2", - "ansi-escapes": "^4.3.2", - "mute-stream": "^1.0.0", - "strip-ansi": "^6.0.1" - }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", "exports": { + "./package.json": "./package.json", ".": { "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" }, "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" } } }, - "sideEffects": false + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, + "dependencies": { + "@inquirer/type": "^3.0.5", + "ansi-escapes": "^4.3.2", + "mute-stream": "^2.0.0" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@repo/tsconfig": "workspace:*", + "@types/mute-stream": "^0.0.4", + "@types/node": "^22.13.10", + "tshy": "^3.0.2" + }, + "engines": { + "node": ">=18" + }, + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } } diff --git a/packages/testing/src/index.mts b/packages/testing/src/index.ts similarity index 88% rename from packages/testing/src/index.mts rename to packages/testing/src/index.ts index 340478c6b..dc1ecb82b 100644 --- a/packages/testing/src/index.mts +++ b/packages/testing/src/index.ts @@ -1,6 +1,6 @@ import { Stream } from 'node:stream'; +import { stripVTControlCharacters } from 'node:util'; import MuteStream from 'mute-stream'; -import stripAnsi from 'strip-ansi'; import ansiEscapes from 'ansi-escapes'; import type { Prompt, Context } from '@inquirer/type'; @@ -25,7 +25,7 @@ class BufferedStream extends Stream.Writable { // Stripping the ANSI codes here because Inquirer will push commands ANSI (like cursor move.) // This is probably fine since we don't care about those for testing; but this could become // an issue if we ever want to test for those. - if (stripAnsi(str).trim().length > 0) { + if (stripVTControlCharacters(str).trim().length > 0) { this.#_chunks.push(str); } callback(); @@ -42,11 +42,11 @@ class BufferedStream extends Stream.Writable { } } -export async function render< - const Props, - const Value, - const TestedPrompt extends Prompt, ->(prompt: TestedPrompt, props: Props, options?: Context) { +export async function render( + prompt: Prompt, + props: Props, + options?: Context, +) { const input = new MuteStream(); input.unmute(); @@ -89,7 +89,7 @@ export async function render< events, getScreen: ({ raw }: { raw?: boolean } = {}): string => { const lastScreen = output.getLastChunk({ raw }); - return raw ? lastScreen : stripAnsi(lastScreen).trim(); + return raw ? lastScreen : stripVTControlCharacters(lastScreen).trim(); }, getFullOutput: (): string => { return output.getFullOutput(); diff --git a/packages/testing/tsconfig.cjs.json b/packages/testing/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/testing/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/testing/tsconfig.json b/packages/testing/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/testing/tsconfig.json +++ b/packages/testing/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/type/.tshy/build.json b/packages/type/.tshy/build.json new file mode 100644 index 000000000..aea1a9e93 --- /dev/null +++ b/packages/type/.tshy/build.json @@ -0,0 +1,8 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "rootDir": "../src", + "module": "nodenext", + "moduleResolution": "nodenext" + } +} diff --git a/packages/type/.tshy/commonjs.json b/packages/type/.tshy/commonjs.json new file mode 100644 index 000000000..a47859b9a --- /dev/null +++ b/packages/type/.tshy/commonjs.json @@ -0,0 +1,17 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.cts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/**/*.mts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/commonjs" + } +} diff --git a/packages/type/.tshy/esm.json b/packages/type/.tshy/esm.json new file mode 100644 index 000000000..77ba0dcb3 --- /dev/null +++ b/packages/type/.tshy/esm.json @@ -0,0 +1,16 @@ +{ + "extends": "./build.json", + "include": [ + "../src/**/*.ts", + "../src/**/*.mts", + "../src/**/*.tsx", + "../src/**/*.json" + ], + "exclude": [ + "../src/**/*.test.ts", + "../src/package.json" + ], + "compilerOptions": { + "outDir": "../.tshy-build/esm" + } +} diff --git a/packages/type/package.json b/packages/type/package.json index 591091ada..0620ec795 100644 --- a/packages/type/package.json +++ b/packages/type/package.json @@ -1,16 +1,7 @@ { "name": "@inquirer/type", - "version": "1.5.3", + "version": "3.0.5", "description": "Inquirer core TS types", - "main": "./dist/cjs/index.js", - "typings": "./dist/cjs/types/index.d.ts", - "files": [ - "dist/**/*" - ], - "repository": { - "type": "git", - "url": "https://github.com/SBoudrias/Inquirer.js.git" - }, "keywords": [ "answer", "answers", @@ -52,31 +43,60 @@ "types", "typescript" ], - "author": "Simon Boudrias ", - "license": "MIT", - "dependencies": { - "mute-stream": "^1.0.0" - }, - "scripts": { - "tsc": "yarn run tsc:esm && yarn run tsc:cjs", - "tsc:esm": "rm -rf dist/esm && tsc -p ./tsconfig.json", - "tsc:cjs": "rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs", - "attw": "attw --pack" - }, - "engines": { - "node": ">=18" + "repository": { + "type": "git", + "url": "https://github.com/SBoudrias/Inquirer.js.git" }, + "license": "MIT", + "author": "Simon Boudrias ", + "sideEffects": false, + "type": "module", "exports": { + "./package.json": "./package.json", ".": { "import": { - "types": "./dist/esm/types/index.d.mts", - "default": "./dist/esm/index.mjs" + "types": "./dist/esm/index.d.ts", + "default": "./dist/esm/index.js" }, "require": { - "types": "./dist/cjs/types/index.d.ts", - "default": "./dist/cjs/index.js" + "types": "./dist/commonjs/index.d.ts", + "default": "./dist/commonjs/index.js" } } }, - "sideEffects": false + "main": "./dist/commonjs/index.js", + "module": "./dist/esm/index.js", + "types": "./dist/commonjs/index.d.ts", + "files": [ + "dist" + ], + "scripts": { + "attw": "attw --pack", + "tsc": "tshy" + }, + "devDependencies": { + "@arethetypeswrong/cli": "^0.17.4", + "@repo/tsconfig": "workspace:*", + "tshy": "^3.0.2" + }, + "peerDependencies": { + "@types/node": ">=18" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + }, + "engines": { + "node": ">=18" + }, + "tshy": { + "exclude": [ + "src/**/*.test.ts" + ], + "exports": { + "./package.json": "./package.json", + ".": "./src/index.ts" + } + } } diff --git a/packages/type/src/index.mts b/packages/type/src/index.mts deleted file mode 100644 index 746fd1ca2..000000000 --- a/packages/type/src/index.mts +++ /dev/null @@ -1,2 +0,0 @@ -export * from './inquirer.mjs'; -export * from './utils.mjs'; diff --git a/packages/type/src/index.ts b/packages/type/src/index.ts new file mode 100644 index 000000000..009eb3753 --- /dev/null +++ b/packages/type/src/index.ts @@ -0,0 +1,2 @@ +export * from './inquirer.js'; +export * from './utils.js'; diff --git a/packages/type/src/inquirer.mts b/packages/type/src/inquirer.mts deleted file mode 100644 index 282fada41..000000000 --- a/packages/type/src/inquirer.mts +++ /dev/null @@ -1,35 +0,0 @@ -import * as readline from 'node:readline'; -import MuteStream from 'mute-stream'; - -export class CancelablePromise extends Promise { - public cancel: () => void = () => {}; - - static withResolver() { - let resolve: (value: T) => void; - let reject: (error: unknown) => void; - const promise = new CancelablePromise((res, rej) => { - resolve = res; - reject = rej; - }); - - return { promise, resolve: resolve!, reject: reject! }; - } -} - -export type InquirerReadline = readline.ReadLine & { - output: MuteStream; - input: NodeJS.ReadableStream; - clearLine: (dir: 0 | 1 | -1) => void; // https://nodejs.org/api/readline.html#rlclearlinedir -}; - -export type Context = { - input?: NodeJS.ReadableStream; - output?: NodeJS.WritableStream; - clearPromptOnDone?: boolean; - signal?: AbortSignal; -}; - -export type Prompt = ( - config: Config, - context?: Context, -) => CancelablePromise; diff --git a/packages/type/src/inquirer.ts b/packages/type/src/inquirer.ts new file mode 100644 index 000000000..12eadbe2e --- /dev/null +++ b/packages/type/src/inquirer.ts @@ -0,0 +1,38 @@ +/// +import { Duplex } from 'node:stream'; +/** + * `InquirerReadline` is a re-implementation of `readline.Interface` from Node.js. + * We're reimplementing it because of 3 reasons: + * 1. The `readline.Interface` API is not complete; it's missing for example `clearLine`. + * 2. The input/output streams are not generics, meaning they're inexact. + * 3. Since ReadLine isn't built-in Typescript Global NodeJS type, it'd force us to ship `@types/node` as a dependency to all users. + */ +export type InquirerReadline = { + output: Duplex & { mute: () => void; unmute: () => void }; + input: NodeJS.ReadableStream; + clearLine: (dir: 0 | 1 | -1) => void; // https://nodejs.org/api/readline.html#rlclearlinedir + getCursorPos: () => { rows: number; cols: number }; + setPrompt: (prompt: string) => void; + line: string; + write: (data: string) => void; + on: (event: string, listener: (...args: unknown[]) => void) => void; + removeListener: (event: string, listener: (...args: unknown[]) => void) => void; + pause: () => void; + resume: () => void; + close: () => void; +}; + +export type Context = { + input?: NodeJS.ReadableStream; + output?: NodeJS.WritableStream; + clearPromptOnDone?: boolean; + signal?: AbortSignal; +}; + +export type Prompt = ( + config: Config, + context?: Context, +) => Promise & { + /** @deprecated pass an AbortSignal in the context options instead. See {@link https://github.com/SBoudrias/Inquirer.js#canceling-prompt} */ + cancel: () => void; +}; diff --git a/packages/type/src/utils.mts b/packages/type/src/utils.ts similarity index 100% rename from packages/type/src/utils.mts rename to packages/type/src/utils.ts diff --git a/packages/type/tsconfig.cjs.json b/packages/type/tsconfig.cjs.json deleted file mode 100644 index 7db14bcd2..000000000 --- a/packages/type/tsconfig.cjs.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./tsconfig.json", - "compilerOptions": { - "lib": ["es2023"], - "target": "es6", - "module": "commonjs", - "moduleResolution": "node10", - "outDir": "dist/cjs", - "declarationDir": "dist/cjs/types" - } -} diff --git a/packages/type/tsconfig.json b/packages/type/tsconfig.json index 907051c16..1747264e5 100644 --- a/packages/type/tsconfig.json +++ b/packages/type/tsconfig.json @@ -1,13 +1,3 @@ { - "extends": "../../tsconfig.json", - "include": ["./src"], - "exclude": ["**/*.test.mts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "outDir": "dist/esm", - "declarationDir": "dist/esm/types" - } + "extends": "@repo/tsconfig" } diff --git a/packages/type/type.test.mts b/packages/type/type.test.ts similarity index 85% rename from packages/type/type.test.mts rename to packages/type/type.test.ts index a67a455dc..69713ed0d 100644 --- a/packages/type/type.test.mts +++ b/packages/type/type.test.ts @@ -1,9 +1,5 @@ import { test, expectTypeOf } from 'vitest'; -import type { - DistributiveMerge, - PartialDeep, - UnionToIntersection, -} from './src/index.mjs'; +import type { DistributiveMerge, PartialDeep, UnionToIntersection } from './src/index.js'; test('DistributiveMerge', () => { expectTypeOf< diff --git a/tools/fix-ext.mjs b/tools/fix-ext.mjs deleted file mode 100644 index ba75ff9d8..000000000 --- a/tools/fix-ext.mjs +++ /dev/null @@ -1,47 +0,0 @@ -import path from 'node:path'; -import fs from 'node:fs/promises'; -import { globby } from 'globby'; - -// Because we're using .mts files, TS compiles to .mjs files disregarding the target. So here we -// manually rename the common.js files and their imports to .js -const mjsFiles = await globby(['dist/cjs/**/*.mjs', '!**/node_modules']); -mjsFiles.forEach(async (pathname) => { - // 1. Rename imports - const fileContent = await fs.readFile(pathname, 'utf8'); - await fs.writeFile( - pathname, - fileContent.replaceAll(/require\(["']([^"']*)\.mjs["']\)/g, "require('$1.js')"), - ); - - // 2. Rename files - const newPath = path.format({ - ...path.parse(pathname), - base: '', - ext: '.js', - }); - - console.log(`Renaming ${pathname} to ${newPath}...`); - await fs.rename(pathname, newPath); -}); - -// Similarly, we rename the .d.mts files to .d.ts. This is because Typescript `node16` target will -// masquerade as ESM otherwise. -const dmtsFiles = await globby(['dist/cjs/**/*.d.mts', '!**/node_modules']); -dmtsFiles.forEach(async (pathname) => { - // 1. Rename imports from `.mjs` to `.js` - const fileContent = await fs.readFile(pathname, 'utf8'); - await fs.writeFile( - pathname, - fileContent.replaceAll(/from '([^']*)\.mjs'/g, "from '$1.js'"), - ); - - // 2. Rename files - const newPath = path.format({ - ...path.parse(pathname), - base: '', - ext: '.ts', - }); - - console.log(`Renaming ${pathname} to ${newPath}...`); - await fs.rename(pathname, newPath); -}); diff --git a/tools/setup-packages.mjs b/tools/setup-packages.mjs index 62bcadc2d..ee2e43148 100644 --- a/tools/setup-packages.mjs +++ b/tools/setup-packages.mjs @@ -1,7 +1,7 @@ import path from 'node:path'; import fs from 'node:fs/promises'; import { globby } from 'globby'; -import prettier from 'prettier'; +import { fixPeerDeps } from '@repo/hoist-peer-dependencies'; function readFile(filepath) { return fs.readFile(filepath, 'utf8'); @@ -24,111 +24,73 @@ async function writeFile(filepath, content) { } } -const prettierJsonOption = await prettier.resolveConfig('tsconfig.json'); -const formatJSON = (content) => - prettier.format(JSON.stringify(content), { ...prettierJsonOption, parser: 'json' }); - +const versions = {}; const rootPkg = await readJSONFile(path.join(import.meta.dirname, '../package.json')); const paths = await globby(['packages/**/package.json', '!**/node_modules']); -paths.forEach(async (pkgPath) => { - const dir = path.dirname(pkgPath); - const tsconfigPath = path.join(dir, 'tsconfig.json'); - - // Set multi-module system builds exports - const pkg = await readJSONFile(pkgPath); - const isTS = await fileExists(tsconfigPath); - const hasReadme = await fileExists(path.join(dir, 'README.md')); - - // Replicate configs that should always be the same. - pkg.engines = rootPkg.engines; - pkg.author = rootPkg.author; - pkg.license = rootPkg.license; - pkg.repository = rootPkg.repository; - pkg.keywords = [...new Set([...rootPkg.keywords, ...(pkg.keywords ?? [])])]; - - if (hasReadme) { - const repoPath = dir.split('/').slice(-2).join('/'); - pkg.homepage = `https://github.com/SBoudrias/Inquirer.js/blob/main/${repoPath}/README.md`; - } +Promise.all( + paths.map(async (pkgPath) => { + const pkg = await readJSONFile(pkgPath); + + // Collect all dependencies versions + Object.assign(versions, pkg.devDependencies, pkg.dependencies); + + return [pkgPath, pkg]; + }), +).then((packages) => + packages.forEach(async ([pkgPath, pkg]) => { + const dir = path.dirname(pkgPath); + fixPeerDeps(path.resolve(path.join(dir))); + + const isTS = await fileExists(path.join(dir, 'src/index.ts')); + const hasReadme = await fileExists(path.join(dir, 'README.md')); + + // Replicate configs that should always be the same. + pkg.engines = rootPkg.engines; + pkg.author = rootPkg.author; + pkg.license = rootPkg.license; + pkg.repository = rootPkg.repository; + pkg.keywords = [...new Set([...rootPkg.keywords, ...(pkg.keywords ?? [])])]; + pkg.sideEffects = pkg.sideEffects ?? false; + + if (hasReadme) { + const repoPath = dir.split('/').slice(-2).join('/'); + pkg.homepage = `https://github.com/SBoudrias/Inquirer.js/blob/main/${repoPath}/README.md`; + } - if (!('sideEffects' in pkg)) { - pkg.sideEffects = false; - } + if (isTS) { + pkg.files = ['dist']; + + pkg.devDependencies = pkg.devDependencies ?? {}; + pkg.devDependencies['tshy'] = versions['tshy']; - if (isTS) { - const tsconfig = await readJSONFile(tsconfigPath); - const emitDeclaration = tsconfig?.compilerOptions?.declaration !== false; + pkg.tshy = pkg.tshy ?? {}; + pkg.tshy.exclude = ['src/**/*.test.ts']; - delete pkg.type; - pkg.scripts = pkg.scripts ?? {}; - pkg.files = ['dist/**/*']; + pkg.scripts = pkg.scripts ?? {}; + pkg.scripts.tsc = 'tshy'; - function exportDef(defaultPath, types) { - if (emitDeclaration) { - return { types, default: defaultPath }; + // Only set attw if the package is using commonjs + const shouldUseAttw = + !Array.isArray(pkg.tshy.dialects) || pkg.tshy.dialects.includes('commonjs'); + pkg.scripts.attw = shouldUseAttw ? 'attw --pack' : undefined; + if (shouldUseAttw) { + pkg.devDependencies['@arethetypeswrong/cli'] = versions['@arethetypeswrong/cli']; } - return defaultPath; - } - // If the package supports Typescript, then apply the configs. - delete pkg.exports['.']; - pkg.exports = { - '.': { - import: exportDef('./dist/esm/index.mjs', './dist/esm/types/index.d.mts'), - require: exportDef('./dist/cjs/index.js', './dist/cjs/types/index.d.ts'), - }, - ...pkg.exports, - }; - - if (emitDeclaration) { - pkg.main = pkg.exports['.'].require.default; - pkg.typings = pkg.exports['.'].require.types; - } else { - pkg.main = pkg.exports['.'].require; - pkg.typings = undefined; - } + const tsconfig = (await fileExists(path.join(dir, 'tsconfig.json'))) + ? await readJSONFile(path.join(dir, 'tsconfig.json')) + : { extends: '@repo/tsconfig' }; + writeFile( + path.join(dir, 'tsconfig.json'), + JSON.stringify(tsconfig, null, 2) + '\n', + ); - pkg.scripts = { - tsc: 'yarn run tsc:esm && yarn run tsc:cjs', - 'tsc:esm': 'rm -rf dist/esm && tsc -p ./tsconfig.json', - 'tsc:cjs': - 'rm -rf dist/cjs && tsc -p ./tsconfig.cjs.json && node ../../tools/fix-ext.mjs', - attw: emitDeclaration ? 'attw --pack' : undefined, - }; - - // Set ESM tsconfig - const esmTsconfig = { - extends: '../../tsconfig.json', - include: ['./src'], - exclude: ['**/*.test.mts'], - compilerOptions: { - ...tsconfig.compilerOptions, - lib: ['es2023'], - target: 'es2022', - module: 'NodeNext', - moduleResolution: 'nodenext', - outDir: 'dist/esm', - declarationDir: emitDeclaration ? 'dist/esm/types' : undefined, - }, - }; - - // Set CJS tsconfig - const cjsTsconfig = { - extends: './tsconfig.json', - compilerOptions: { - lib: ['es2023'], - target: 'es6', - module: 'commonjs', - moduleResolution: 'node10', - outDir: 'dist/cjs', - declarationDir: emitDeclaration ? 'dist/cjs/types' : undefined, - }, - }; - - writeFile(tsconfigPath, await formatJSON(esmTsconfig)); - writeFile(path.join(dir, 'tsconfig.cjs.json'), await formatJSON(cjsTsconfig)); - } + if (tsconfig.extends === '@repo/tsconfig') { + pkg.devDependencies['@repo/tsconfig'] = 'workspace:*'; + } + } - writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n'); -}); + writeFile(pkgPath, JSON.stringify(pkg, null, 2) + '\n'); + }), +); diff --git a/tsconfig.json b/tsconfig.json index da3ea32f9..6d9586937 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,10 +1,9 @@ { - "extends": "@sindresorhus/tsconfig", - "ts-node": { - "esm": true - }, + "extends": "@repo/tsconfig", + "include": ["vitest.*.ts", "**/*.test.ts", "**/*.d.ts"], "compilerOptions": { - "skipLibCheck": false, - "esModuleInterop": true + "erasableSyntaxOnly": true, + "skipLibCheck": true, + "noEmit": true } } diff --git a/tsconfig.test.json b/tsconfig.test.json deleted file mode 100644 index 84ce79165..000000000 --- a/tsconfig.test.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "extends": "./tsconfig.json", - "include": ["**/*.test.mts", "**/*.d.ts"], - "compilerOptions": { - "lib": ["es2023"], - "target": "es2022", - "module": "NodeNext", - "moduleResolution": "nodenext", - "skipLibCheck": true, - "noEmit": true - } -} diff --git a/turbo.json b/turbo.json index c7c97f3f2..296e653e6 100644 --- a/turbo.json +++ b/turbo.json @@ -8,7 +8,7 @@ "tsc": { "dependsOn": ["^tsc"], "outputs": ["dist/**"], - "inputs": ["$TURBO_DEFAULT$", "../../tools/fix-ext.mjs", "../../tsconfig.json"] + "inputs": ["$TURBO_DEFAULT$", "../../package.json"] } } } diff --git a/vitest.config.ts b/vitest.config.ts index d4bdaff78..5a682fe12 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -10,10 +10,11 @@ export default defineConfig({ exclude: [ ...coverageConfigDefaults.exclude, 'tools/**', + 'internals/**', + 'packages/*/dist/**', 'packages/inquirer/examples/**', 'packages/demo/**', '.yarn/**', - '**/*.type.mts', ], }, testTimeout: 300, diff --git a/yarn.lock b/yarn.lock index d4f2e643f..9553b5d64 100644 --- a/yarn.lock +++ b/yarn.lock @@ -29,11 +29,11 @@ __metadata: languageName: node linkType: hard -"@arethetypeswrong/cli@npm:^0.15.4": - version: 0.15.4 - resolution: "@arethetypeswrong/cli@npm:0.15.4" +"@arethetypeswrong/cli@npm:^0.17.4": + version: 0.17.4 + resolution: "@arethetypeswrong/cli@npm:0.17.4" dependencies: - "@arethetypeswrong/core": "npm:0.15.1" + "@arethetypeswrong/core": "npm:0.17.4" chalk: "npm:^4.1.2" cli-table3: "npm:^0.6.3" commander: "npm:^10.0.1" @@ -42,21 +42,23 @@ __metadata: semver: "npm:^7.5.4" bin: attw: dist/index.js - checksum: 10/3ae2a01e269300b3528a7963b36d53324f140e709c5e08da6e8c118b84607859dfef9236059ffb18b5eefe88c0df858989522f943c0a7bdcdb78f43513d57005 + checksum: 10/5309b7f0a35d8d9118f0bc658448112bfcc76e36a5bf1f237acc492cab56446902b3bdbb2f7b37506521edc722ac2a3c4e16227c8e4eece7c837573122f6c4bb languageName: node linkType: hard -"@arethetypeswrong/core@npm:0.15.1": - version: 0.15.1 - resolution: "@arethetypeswrong/core@npm:0.15.1" +"@arethetypeswrong/core@npm:0.17.4": + version: 0.17.4 + resolution: "@arethetypeswrong/core@npm:0.17.4" dependencies: "@andrewbranch/untar.js": "npm:^1.0.3" + "@loaderkit/resolve": "npm:^1.0.2" + cjs-module-lexer: "npm:^1.2.3" fflate: "npm:^0.8.2" + lru-cache: "npm:^10.4.3" semver: "npm:^7.5.4" - ts-expose-internals-conditionally: "npm:1.0.0-empty.0" - typescript: "npm:5.3.3" + typescript: "npm:5.6.1-rc" validate-npm-package-name: "npm:^5.0.0" - checksum: 10/af07d7d0d93926b019d8dc412cee251db972e443be181ef4ef79d28d61f76542b2911a381397ab3ddc23d9a669d830994b4f3b0033f8244f3750027f319595af + checksum: 10/0aa5d8c21de977fdca3b79d25b07e9346b4b8f45ea95146c2b08961c8e0842326fb8879e9e1f001fadf132d9bede78a13df7974ca15cfb0a2e08000369b75c43 languageName: node linkType: hard @@ -69,31 +71,28 @@ __metadata: languageName: node linkType: hard -"@babel/helper-string-parser@npm:^7.23.4": - version: 7.23.4 - resolution: "@babel/helper-string-parser@npm:7.23.4" - checksum: 10/c352082474a2ee1d2b812bd116a56b2e8b38065df9678a32a535f151ec6f58e54633cc778778374f10544b930703cca6ddf998803888a636afa27e2658068a9c - languageName: node - linkType: hard - -"@babel/helper-string-parser@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-string-parser@npm:7.24.7" - checksum: 10/603d8d962bbe89907aa99a8f19a006759ab7b2464615f20a6a22e3e2e8375af37ddd0e5175c9e622e1c4b2d83607ffb41055a59d0ce34404502af30fde573a5c +"@babel/code-frame@npm:^7.22.13": + version: 7.26.2 + resolution: "@babel/code-frame@npm:7.26.2" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.25.9" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.0.0" + checksum: 10/db2c2122af79d31ca916755331bb4bac96feb2b334cdaca5097a6b467fdd41963b89b14b6836a14f083de7ff887fc78fa1b3c10b14e743d33e12dbfe5ee3d223 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.22.20, @babel/helper-validator-identifier@npm:^7.22.5, @babel/helper-validator-identifier@npm:^7.24.5": - version: 7.24.5 - resolution: "@babel/helper-validator-identifier@npm:7.24.5" - checksum: 10/38aaf6a64a0ea2e84766165b461deda3c24fd2173dff18419a2cc9e1ea1d3e709039aee94db29433a07011492717c80900a5eb564cdca7d137757c3c69e26898 +"@babel/helper-string-parser@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-string-parser@npm:7.25.9" + checksum: 10/c28656c52bd48e8c1d9f3e8e68ecafd09d949c57755b0d353739eb4eae7ba4f7e67e92e4036f1cd43378cc1397a2c943ed7bcaf5949b04ab48607def0258b775 languageName: node linkType: hard -"@babel/helper-validator-identifier@npm:^7.24.7": - version: 7.24.7 - resolution: "@babel/helper-validator-identifier@npm:7.24.7" - checksum: 10/86875063f57361471b531dbc2ea10bbf5406e12b06d249b03827d361db4cad2388c6f00936bcd9dc86479f7e2c69ea21412c2228d4b3672588b754b70a449d4b +"@babel/helper-validator-identifier@npm:^7.22.5, @babel/helper-validator-identifier@npm:^7.25.9": + version: 7.25.9 + resolution: "@babel/helper-validator-identifier@npm:7.25.9" + checksum: 10/3f9b649be0c2fd457fa1957b694b4e69532a668866b8a0d81eabfa34ba16dbf3107b39e0e7144c55c3c652bf773ec816af8df4a61273a2bb4eb3145ca9cf478e languageName: node linkType: hard @@ -108,41 +107,38 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.24.4": - version: 7.24.7 - resolution: "@babel/parser@npm:7.24.7" +"@babel/parser@npm:^7.25.4": + version: 7.26.2 + resolution: "@babel/parser@npm:7.26.2" + dependencies: + "@babel/types": "npm:^7.26.0" bin: parser: ./bin/babel-parser.js - checksum: 10/ef9ebce60e13db560ccc7af9235d460f6726bb7e23ae2d675098c1fc43d5249067be60d4118889dad33b1d4f85162cf66baf554719e1669f29bb20e71322568e + checksum: 10/8baee43752a3678ad9f9e360ec845065eeee806f1fdc8e0f348a8a0e13eef0959dabed4a197c978896c493ea205c804d0a1187cc52e4a1ba017c7935bab4983d languageName: node linkType: hard -"@babel/types@npm:^7.24.0": - version: 7.24.7 - resolution: "@babel/types@npm:7.24.7" +"@babel/types@npm:^7.25.4, @babel/types@npm:^7.26.0": + version: 7.26.0 + resolution: "@babel/types@npm:7.26.0" dependencies: - "@babel/helper-string-parser": "npm:^7.24.7" - "@babel/helper-validator-identifier": "npm:^7.24.7" - to-fast-properties: "npm:^2.0.0" - checksum: 10/ad3c8c0d6fb4acb0bb74bb5b4bb849b181bf6185677ef9c59c18856c81e43628d0858253cf232f0eca806f02e08eff85a1d3e636a3e94daea737597796b0b430 + "@babel/helper-string-parser": "npm:^7.25.9" + "@babel/helper-validator-identifier": "npm:^7.25.9" + checksum: 10/40780741ecec886ed9edae234b5eb4976968cc70d72b4e5a40d55f83ff2cc457de20f9b0f4fe9d858350e43dab0ea496e7ef62e2b2f08df699481a76df02cd6e languageName: node linkType: hard -"@babel/types@npm:^7.8.3": - version: 7.23.9 - resolution: "@babel/types@npm:7.23.9" - dependencies: - "@babel/helper-string-parser": "npm:^7.23.4" - "@babel/helper-validator-identifier": "npm:^7.22.20" - to-fast-properties: "npm:^2.0.0" - checksum: 10/bed9634e5fd0f9dc63c84cfa83316c4cb617192db9fedfea464fca743affe93736d7bf2ebf418ee8358751a9d388e303af87a0c050cb5d87d5870c1b0154f6cb +"@bcoe/v8-coverage@npm:^1.0.2": + version: 1.0.2 + resolution: "@bcoe/v8-coverage@npm:1.0.2" + checksum: 10/46600b2dde460269b07a8e4f12b72e418eae1337b85c979f43af3336c9a1c65b04e42508ab6b245f1e0e3c64328e1c38d8cd733e4a7cebc4fbf9cf65c6e59937 languageName: node linkType: hard -"@bcoe/v8-coverage@npm:^0.2.3": - version: 0.2.3 - resolution: "@bcoe/v8-coverage@npm:0.2.3" - checksum: 10/1a1f0e356a3bb30b5f1ced6f79c413e6ebacf130421f15fac5fcd8be5ddf98aedb4404d7f5624e3285b700e041f9ef938321f3ca4d359d5b716f96afa120d88d +"@braidai/lang@npm:^1.0.0": + version: 1.1.0 + resolution: "@braidai/lang@npm:1.1.0" + checksum: 10/e6fde83701da73aefadf2a7a5d1906348203ae6a913764f72895d0f98093da2a58ac4b9a71d0058c38869f9ce630e362168b8a6708da051a9b92f80ca7b0b686 languageName: node linkType: hard @@ -162,206 +158,257 @@ __metadata: languageName: node linkType: hard -"@esbuild/aix-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/aix-ppc64@npm:0.20.2" +"@emnapi/core@npm:^1.1.0": + version: 1.3.1 + resolution: "@emnapi/core@npm:1.3.1" + dependencies: + "@emnapi/wasi-threads": "npm:1.0.1" + tslib: "npm:^2.4.0" + checksum: 10/00dbc2ae1b9682c3afadb39e0de4e69c7223b06df59b975c2a2ef58d6cbd91f5a7cfd666a97831c958737c5ec110735c6164bf0ac6f56b60477a933bd9ce793c + languageName: node + linkType: hard + +"@emnapi/runtime@npm:^1.1.0": + version: 1.3.1 + resolution: "@emnapi/runtime@npm:1.3.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/619915ee44682356f77f60455025e667b0b04ad3c95ced36c03782aea9ebc066fa73e86c4a59d221177eba5e5533d40b3a6dbff4e58ee5d81db4270185c21e22 + languageName: node + linkType: hard + +"@emnapi/wasi-threads@npm:1.0.1": + version: 1.0.1 + resolution: "@emnapi/wasi-threads@npm:1.0.1" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/949f8bdcb11153d530652516b11d4b11d8c6ed48a692b4a59cbaa4305327aed59a61f0d87c366085c20ad0b0336c3b50eaddbddeeb3e8c55e7e82b583b9d98fb + languageName: node + linkType: hard + +"@esbuild/aix-ppc64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/aix-ppc64@npm:0.24.2" conditions: os=aix & cpu=ppc64 languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm64@npm:0.20.2" +"@esbuild/android-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-arm64@npm:0.24.2" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-arm@npm:0.20.2" +"@esbuild/android-arm@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-arm@npm:0.24.2" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/android-x64@npm:0.20.2" +"@esbuild/android-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/android-x64@npm:0.24.2" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-arm64@npm:0.20.2" +"@esbuild/darwin-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/darwin-arm64@npm:0.24.2" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/darwin-x64@npm:0.20.2" +"@esbuild/darwin-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/darwin-x64@npm:0.24.2" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-arm64@npm:0.20.2" +"@esbuild/freebsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/freebsd-arm64@npm:0.24.2" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/freebsd-x64@npm:0.20.2" +"@esbuild/freebsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/freebsd-x64@npm:0.24.2" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm64@npm:0.20.2" +"@esbuild/linux-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-arm64@npm:0.24.2" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-arm@npm:0.20.2" +"@esbuild/linux-arm@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-arm@npm:0.24.2" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ia32@npm:0.20.2" +"@esbuild/linux-ia32@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-ia32@npm:0.24.2" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-loong64@npm:0.20.2" +"@esbuild/linux-loong64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-loong64@npm:0.24.2" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-mips64el@npm:0.20.2" +"@esbuild/linux-mips64el@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-mips64el@npm:0.24.2" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-ppc64@npm:0.20.2" +"@esbuild/linux-ppc64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-ppc64@npm:0.24.2" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-riscv64@npm:0.20.2" +"@esbuild/linux-riscv64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-riscv64@npm:0.24.2" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-s390x@npm:0.20.2" +"@esbuild/linux-s390x@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-s390x@npm:0.24.2" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/linux-x64@npm:0.20.2" +"@esbuild/linux-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/linux-x64@npm:0.24.2" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/netbsd-x64@npm:0.20.2" +"@esbuild/netbsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/netbsd-arm64@npm:0.24.2" + conditions: os=netbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/netbsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/netbsd-x64@npm:0.24.2" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/openbsd-x64@npm:0.20.2" +"@esbuild/openbsd-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/openbsd-arm64@npm:0.24.2" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + +"@esbuild/openbsd-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/openbsd-x64@npm:0.24.2" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/sunos-x64@npm:0.20.2" +"@esbuild/sunos-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/sunos-x64@npm:0.24.2" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-arm64@npm:0.20.2" +"@esbuild/win32-arm64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-arm64@npm:0.24.2" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-ia32@npm:0.20.2" +"@esbuild/win32-ia32@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-ia32@npm:0.24.2" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.20.2": - version: 0.20.2 - resolution: "@esbuild/win32-x64@npm:0.20.2" +"@esbuild/win32-x64@npm:0.24.2": + version: 0.24.2 + resolution: "@esbuild/win32-x64@npm:0.24.2" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0": - version: 4.4.0 - resolution: "@eslint-community/eslint-utils@npm:4.4.0" +"@eslint-community/eslint-utils@npm:^4.1.2, @eslint-community/eslint-utils@npm:^4.2.0, @eslint-community/eslint-utils@npm:^4.4.0, @eslint-community/eslint-utils@npm:^4.4.1": + version: 4.4.1 + resolution: "@eslint-community/eslint-utils@npm:4.4.1" dependencies: - eslint-visitor-keys: "npm:^3.3.0" + eslint-visitor-keys: "npm:^3.4.3" peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - checksum: 10/8d70bcdcd8cd279049183aca747d6c2ed7092a5cf0cf5916faac1ef37ffa74f0c245c2a3a3d3b9979d9dfdd4ca59257b4c5621db699d637b847a2c5e02f491c2 + checksum: 10/ae92a11412674329b4bd38422518601ec9ceae28e251104d1cad83715da9d38e321f68c817c39b64e66d0af7d98df6f9a10ad2dc638911254b47fb8932df00ef languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.6.0": - version: 4.10.0 - resolution: "@eslint-community/regexpp@npm:4.10.0" - checksum: 10/8c36169c815fc5d726078e8c71a5b592957ee60d08c6470f9ce0187c8046af1a00afbda0a065cc40ff18d5d83f82aed9793c6818f7304a74a7488dc9f3ecbd42 +"@eslint-community/regexpp@npm:^4.10.0, @eslint-community/regexpp@npm:^4.11.0, @eslint-community/regexpp@npm:^4.12.1": + version: 4.12.1 + resolution: "@eslint-community/regexpp@npm:4.12.1" + checksum: 10/c08f1dd7dd18fbb60bdd0d85820656d1374dd898af9be7f82cb00451313402a22d5e30569c150315b4385907cdbca78c22389b2a72ab78883b3173be317620cc languageName: node linkType: hard -"@eslint-community/regexpp@npm:^4.11.0": - version: 4.11.0 - resolution: "@eslint-community/regexpp@npm:4.11.0" - checksum: 10/f053f371c281ba173fe6ee16dbc4fe544c84870d58035ccca08dba7f6ce1830d895ce3237a0db89ba37616524775dca82f1c502066b58e2d5712d7f87f5ba17c +"@eslint/config-array@npm:^0.19.2": + version: 0.19.2 + resolution: "@eslint/config-array@npm:0.19.2" + dependencies: + "@eslint/object-schema": "npm:^2.1.6" + debug: "npm:^4.3.1" + minimatch: "npm:^3.1.2" + checksum: 10/a6809720908f7dd8536e1a73b2369adf802fe61335536ed0592bca9543c476956e0c0a20fef8001885da8026e2445dc9bf3e471bb80d32c3be7bcdabb7628fd1 languageName: node linkType: hard -"@eslint/config-array@npm:^0.18.0": - version: 0.18.0 - resolution: "@eslint/config-array@npm:0.18.0" +"@eslint/config-helpers@npm:^0.1.0": + version: 0.1.0 + resolution: "@eslint/config-helpers@npm:0.1.0" + checksum: 10/899b4783c2ecd45322b2e3b2f839c8bf687e237769aae65b1a8aa1fd90dbead3a07a37866136894b89d67c9eadece4771074f40804c6d2a864fb60870ce687f6 + languageName: node + linkType: hard + +"@eslint/core@npm:^0.12.0": + version: 0.12.0 + resolution: "@eslint/core@npm:0.12.0" dependencies: - "@eslint/object-schema": "npm:^2.1.4" - debug: "npm:^4.3.1" - minimatch: "npm:^3.1.2" - checksum: 10/60ccad1eb4806710b085cd739568ec7afd289ee5af6ca0383f0876f9fe375559ef525f7b3f86bdb3f961493de952f2cf3ab4aa4a6ccaef0ae3cd688267cabcb3 + "@types/json-schema": "npm:^7.0.15" + checksum: 10/ee8a2c65ee49af727e167b180a8672739e468ad0b1b9ac52558e61bb120f1a93af23f9e723e0e58f273adfe30ccd98167b59598c7be07440489fa38f669b59ae languageName: node linkType: hard -"@eslint/eslintrc@npm:^3.1.0": - version: 3.1.0 - resolution: "@eslint/eslintrc@npm:3.1.0" +"@eslint/eslintrc@npm:^3.3.0": + version: 3.3.0 + resolution: "@eslint/eslintrc@npm:3.3.0" dependencies: ajv: "npm:^6.12.4" debug: "npm:^4.3.2" @@ -372,21 +419,48 @@ __metadata: js-yaml: "npm:^4.1.0" minimatch: "npm:^3.1.2" strip-json-comments: "npm:^3.1.1" - checksum: 10/02bf892d1397e1029209dea685e9f4f87baf643315df2a632b5f121ec7e8548a3b34f428a007234fa82772218fa8a3ac2d10328637b9ce63b7f8344035b74db3 + checksum: 10/f17d232fc4198de5f43b2f92dc2b1980db4d5faaeb134f13f974b4b57ce906c15f4272025fa14492bee2b496359132eb82fa15c9abc8eda607b8f781c5cedcd4 + languageName: node + linkType: hard + +"@eslint/js@npm:9.22.0, @eslint/js@npm:^9.22.0": + version: 9.22.0 + resolution: "@eslint/js@npm:9.22.0" + checksum: 10/2d7725f29ee4a7c85f5b5c499945d60f7701877b41b580d3f7badef43901ac98e4f8f76e4cfaef9ba116966c5f7b67132161e31e02f2eeccb0d09b548f6ea1b2 languageName: node linkType: hard -"@eslint/js@npm:9.9.1, @eslint/js@npm:^9.9.1": - version: 9.9.1 - resolution: "@eslint/js@npm:9.9.1" - checksum: 10/c3fac3389bda97e790eea03c0a0be2dc1cfb0eec3863f8c4b88033ca7bad4265e4c48abe40d4dc8f82b456a2617fc8a499b2b90837c8bd39a05ebc8cb34c3a04 +"@eslint/object-schema@npm:^2.1.6": + version: 2.1.6 + resolution: "@eslint/object-schema@npm:2.1.6" + checksum: 10/266085c8d3fa6cd99457fb6350dffb8ee39db9c6baf28dc2b86576657373c92a568aec4bae7d142978e798b74c271696672e103202d47a0c148da39154351ed6 languageName: node linkType: hard -"@eslint/object-schema@npm:^2.1.4": - version: 2.1.4 - resolution: "@eslint/object-schema@npm:2.1.4" - checksum: 10/221e8d9f281c605948cd6e030874aacce83fe097f8f9c1964787037bccf08e82b7aa9eff1850a30fffac43f1d76555727ec22a2af479d91e268e89d1e035131e +"@eslint/plugin-kit@npm:^0.2.7": + version: 0.2.7 + resolution: "@eslint/plugin-kit@npm:0.2.7" + dependencies: + "@eslint/core": "npm:^0.12.0" + levn: "npm:^0.4.1" + checksum: 10/e932da4ff9e24d0383febf73d3c3269f6c6f2cabba98acc2aac1cf50aa697fdf899c3944f44d2a86fb6805e1a30795d5e5fe38dd5abc76c923ce2828fab4c59b + languageName: node + linkType: hard + +"@humanfs/core@npm:^0.19.1": + version: 0.19.1 + resolution: "@humanfs/core@npm:0.19.1" + checksum: 10/270d936be483ab5921702623bc74ce394bf12abbf57d9145a69e8a0d1c87eb1c768bd2d93af16c5705041e257e6d9cc7529311f63a1349f3678abc776fc28523 + languageName: node + linkType: hard + +"@humanfs/node@npm:^0.16.6": + version: 0.16.6 + resolution: "@humanfs/node@npm:0.16.6" + dependencies: + "@humanfs/core": "npm:^0.19.1" + "@humanwhocodes/retry": "npm:^0.3.0" + checksum: 10/6d43c6727463772d05610aa05c83dab2bfbe78291022ee7a92cb50999910b8c720c76cc312822e2dea2b497aa1b3fef5fe9f68803fc45c9d4ed105874a65e339 languageName: node linkType: hard @@ -404,6 +478,13 @@ __metadata: languageName: node linkType: hard +"@humanwhocodes/retry@npm:^0.4.2": + version: 0.4.2 + resolution: "@humanwhocodes/retry@npm:0.4.2" + checksum: 10/8910c4cdf8d46ce406e6f0cb4407ff6cfef70b15039bd5713cc059f32e02fe5119d833cfe2ebc5f522eae42fdd453b6d88f3fa7a1d8c4275aaad6eb3d3e9b117 + languageName: node + linkType: hard + "@hutson/parse-repository-url@npm:^3.0.0": version: 3.0.2 resolution: "@hutson/parse-repository-url@npm:3.0.2" @@ -411,16 +492,24 @@ __metadata: languageName: node linkType: hard -"@inquirer/checkbox@npm:^2.5.0, @inquirer/checkbox@workspace:packages/checkbox": +"@inquirer/checkbox@npm:^4.1.4, @inquirer/checkbox@workspace:packages/checkbox": version: 0.0.0-use.local resolution: "@inquirer/checkbox@workspace:packages/checkbox" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" ansi-escapes: "npm:^4.3.2" + tshy: "npm:^3.0.2" yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft @@ -435,34 +524,48 @@ __metadata: languageName: unknown linkType: soft -"@inquirer/confirm@npm:^3.2.0, @inquirer/confirm@workspace:packages/confirm": +"@inquirer/confirm@npm:^5.1.8, @inquirer/confirm@workspace:packages/confirm": version: 0.0.0-use.local resolution: "@inquirer/confirm@workspace:packages/confirm" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/core@npm:^9.1.0, @inquirer/core@workspace:*, @inquirer/core@workspace:packages/core": +"@inquirer/core@npm:^10.1.9, @inquirer/core@workspace:*, @inquirer/core@workspace:packages/core": version: 0.0.0-use.local resolution: "@inquirer/core@workspace:packages/core" dependencies: - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" "@types/mute-stream": "npm:^0.0.4" - "@types/node": "npm:^22.5.2" + "@types/node": "npm:^22.13.10" "@types/wrap-ansi": "npm:^3.0.0" ansi-escapes: "npm:^4.3.2" - cli-spinners: "npm:^2.9.2" cli-width: "npm:^4.1.0" - mute-stream: "npm:^1.0.0" + mute-stream: "npm:^2.0.0" signal-exit: "npm:^4.1.0" - strip-ansi: "npm:^6.0.1" + tshy: "npm:^3.0.2" wrap-ansi: "npm:^6.2.0" yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft @@ -470,22 +573,39 @@ __metadata: version: 0.0.0-use.local resolution: "@inquirer/demo@workspace:packages/demo" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/prompts": "npm:^5.4.0" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/prompts": "npm:^7.4.0" + "@repo/tsconfig": "workspace:*" + "@types/node": "npm:^22.13.10" + tshy: "npm:^3.0.2" yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true bin: - inquirer-demo: index.mjs + inquirer-demo: ./dist/esm/index.js languageName: unknown linkType: soft -"@inquirer/editor@npm:^2.2.0, @inquirer/editor@workspace:packages/editor": +"@inquirer/editor@npm:^4.2.9, @inquirer/editor@workspace:packages/editor": version: 0.0.0-use.local resolution: "@inquirer/editor@workspace:packages/editor" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" external-editor: "npm:^3.1.0" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft @@ -500,80 +620,132 @@ __metadata: languageName: unknown linkType: soft -"@inquirer/expand@npm:^2.2.0, @inquirer/expand@workspace:packages/expand": +"@inquirer/expand@npm:^4.0.11, @inquirer/expand@workspace:packages/expand": version: 0.0.0-use.local resolution: "@inquirer/expand@workspace:packages/expand" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/figures@npm:^1.0.5, @inquirer/figures@workspace:packages/figures": +"@inquirer/figures@npm:^1.0.11, @inquirer/figures@workspace:packages/figures": version: 0.0.0-use.local resolution: "@inquirer/figures@workspace:packages/figures" + dependencies: + "@arethetypeswrong/cli": "npm:^0.17.4" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" languageName: unknown linkType: soft -"@inquirer/input@npm:^2.3.0, @inquirer/input@workspace:*, @inquirer/input@workspace:packages/input": +"@inquirer/input@npm:^4.1.8, @inquirer/input@workspace:*, @inquirer/input@workspace:packages/input": version: 0.0.0-use.local resolution: "@inquirer/input@workspace:packages/input" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/number@npm:^1.1.0, @inquirer/number@workspace:packages/number": +"@inquirer/number@npm:^3.0.11, @inquirer/number@workspace:packages/number": version: 0.0.0-use.local resolution: "@inquirer/number@workspace:packages/number" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/password@npm:^2.2.0, @inquirer/password@workspace:packages/password": +"@inquirer/password@npm:^4.0.11, @inquirer/password@workspace:packages/password": version: 0.0.0-use.local resolution: "@inquirer/password@workspace:packages/password" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" ansi-escapes: "npm:^4.3.2" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/prompts@npm:^5.4.0, @inquirer/prompts@workspace:*, @inquirer/prompts@workspace:packages/prompts": +"@inquirer/prompts@npm:^7.4.0, @inquirer/prompts@workspace:*, @inquirer/prompts@workspace:packages/prompts": version: 0.0.0-use.local resolution: "@inquirer/prompts@workspace:packages/prompts" dependencies: - "@inquirer/checkbox": "npm:^2.5.0" - "@inquirer/confirm": "npm:^3.2.0" - "@inquirer/editor": "npm:^2.2.0" - "@inquirer/expand": "npm:^2.2.0" - "@inquirer/input": "npm:^2.3.0" - "@inquirer/number": "npm:^1.1.0" - "@inquirer/password": "npm:^2.2.0" - "@inquirer/rawlist": "npm:^2.3.0" - "@inquirer/search": "npm:^1.1.0" - "@inquirer/select": "npm:^2.5.0" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/checkbox": "npm:^4.1.4" + "@inquirer/confirm": "npm:^5.1.8" + "@inquirer/editor": "npm:^4.2.9" + "@inquirer/expand": "npm:^4.0.11" + "@inquirer/input": "npm:^4.1.8" + "@inquirer/number": "npm:^3.0.11" + "@inquirer/password": "npm:^4.0.11" + "@inquirer/rawlist": "npm:^4.0.11" + "@inquirer/search": "npm:^3.0.11" + "@inquirer/select": "npm:^4.1.0" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/rawlist@npm:^2.3.0, @inquirer/rawlist@workspace:packages/rawlist": +"@inquirer/rawlist@npm:^4.0.11, @inquirer/rawlist@workspace:packages/rawlist": version: 0.0.0-use.local resolution: "@inquirer/rawlist@workspace:packages/rawlist" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft @@ -581,74 +753,104 @@ __metadata: version: 0.0.0-use.local resolution: "@inquirer/root@workspace:." dependencies: - "@arethetypeswrong/cli": "npm:^0.15.4" - "@eslint/js": "npm:^9.9.1" - "@sindresorhus/tsconfig": "npm:^6.0.0" - "@types/node": "npm:^22.5.2" - "@vitest/coverage-v8": "npm:^2.0.5" - "@vitest/ui": "npm:^2.0.5" - eslint: "npm:^9.9.1" - eslint-config-prettier: "npm:^9.1.0" - eslint-plugin-n: "npm:^17.10.2" - eslint-plugin-prettier: "npm:^5.2.1" - eslint-plugin-unicorn: "npm:^55.0.0" - globals: "npm:^15.9.0" - globby: "npm:^14.0.2" - husky: "npm:^9.1.5" - lerna: "npm:^8.1.8" - lint-staged: "npm:^15.2.10" - prettier: "npm:^3.3.3" + "@eslint/js": "npm:^9.22.0" + "@repo/hoist-peer-dependencies": "workspace:*" + "@repo/tsconfig": "workspace:*" + "@types/node": "npm:^22.13.10" + "@vitest/coverage-v8": "npm:^3.0.8" + "@vitest/ui": "npm:^3.0.8" + eslint: "npm:^9.22.0" + eslint-config-prettier: "npm:^10.1.1" + eslint-plugin-n: "npm:^17.16.2" + eslint-plugin-prettier: "npm:^5.2.3" + eslint-plugin-unicorn: "npm:^57.0.0" + globals: "npm:^16.0.0" + globby: "npm:^14.1.0" + husky: "npm:^9.1.7" + lerna: "npm:^8.2.1" + nano-staged: "npm:^0.8.0" + prettier: "npm:^3.5.3" ts-node: "npm:^10.9.2" - turbo: "npm:^2.1.1" - typescript: "npm:^5.5.4" - typescript-eslint: "npm:^8.3.0" - vitest: "npm:^2.0.5" + turbo: "npm:^2.4.4" + typescript: "npm:^5.8.2" + typescript-eslint: "npm:^8.26.0" + vitest: "npm:^3.0.8" languageName: unknown linkType: soft -"@inquirer/search@npm:^1.1.0, @inquirer/search@workspace:packages/search": +"@inquirer/search@npm:^3.0.11, @inquirer/search@workspace:packages/search": version: 0.0.0-use.local resolution: "@inquirer/search@workspace:packages/search" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/select@npm:^2.5.0, @inquirer/select@workspace:packages/select": +"@inquirer/select@npm:^4.1.0, @inquirer/select@workspace:packages/select": version: 0.0.0-use.local resolution: "@inquirer/select@workspace:packages/select" dependencies: - "@inquirer/core": "npm:^9.1.0" - "@inquirer/figures": "npm:^1.0.5" - "@inquirer/testing": "npm:^2.1.32" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/figures": "npm:^1.0.11" + "@inquirer/testing": "npm:^2.1.45" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" ansi-escapes: "npm:^4.3.2" + tshy: "npm:^3.0.2" yoctocolors-cjs: "npm:^2.1.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/testing@npm:^2.1.32, @inquirer/testing@workspace:packages/testing": +"@inquirer/testing@npm:^2.1.45, @inquirer/testing@workspace:packages/testing": version: 0.0.0-use.local resolution: "@inquirer/testing@workspace:packages/testing" dependencies: - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" "@types/mute-stream": "npm:^0.0.4" - "@types/node": "npm:^22.5.2" + "@types/node": "npm:^22.13.10" ansi-escapes: "npm:^4.3.2" - mute-stream: "npm:^1.0.0" - strip-ansi: "npm:^6.0.1" + mute-stream: "npm:^2.0.0" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft -"@inquirer/type@npm:^1.5.3, @inquirer/type@workspace:packages/type": +"@inquirer/type@npm:^3.0.5, @inquirer/type@workspace:packages/type": version: 0.0.0-use.local resolution: "@inquirer/type@workspace:packages/type" dependencies: - mute-stream: "npm:^1.0.0" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@repo/tsconfig": "workspace:*" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft @@ -714,10 +916,10 @@ __metadata: languageName: node linkType: hard -"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.4.15": - version: 1.4.15 - resolution: "@jridgewell/sourcemap-codec@npm:1.4.15" - checksum: 10/89960ac087781b961ad918978975bcdf2051cd1741880469783c42de64239703eab9db5230d776d8e6a09d73bb5e4cb964e07d93ee6e2e7aea5a7d726e865c09 +"@jridgewell/sourcemap-codec@npm:^1.4.10, @jridgewell/sourcemap-codec@npm:^1.4.14, @jridgewell/sourcemap-codec@npm:^1.5.0": + version: 1.5.0 + resolution: "@jridgewell/sourcemap-codec@npm:1.5.0" + checksum: 10/4ed6123217569a1484419ac53f6ea0d9f3b57e5b57ab30d7c267bdb27792a27eb0e4b08e84a2680aa55cc2f2b411ffd6ec3db01c44fdc6dc43aca4b55f8374fd languageName: node linkType: hard @@ -741,16 +943,16 @@ __metadata: languageName: node linkType: hard -"@lerna/create@npm:8.1.8": - version: 8.1.8 - resolution: "@lerna/create@npm:8.1.8" +"@lerna/create@npm:8.2.1": + version: 8.2.1 + resolution: "@lerna/create@npm:8.2.1" dependencies: "@npmcli/arborist": "npm:7.5.4" "@npmcli/package-json": "npm:5.2.0" "@npmcli/run-script": "npm:8.1.0" - "@nx/devkit": "npm:>=17.1.2 < 20" + "@nx/devkit": "npm:>=17.1.2 < 21" "@octokit/plugin-enterprise-rest": "npm:6.0.1" - "@octokit/rest": "npm:19.0.11" + "@octokit/rest": "npm:20.1.2" aproba: "npm:2.0.0" byte-size: "npm:8.1.1" chalk: "npm:4.1.0" @@ -761,7 +963,7 @@ __metadata: console-control-strings: "npm:^1.1.0" conventional-changelog-core: "npm:5.0.1" conventional-recommended-bump: "npm:7.0.1" - cosmiconfig: "npm:^8.2.0" + cosmiconfig: "npm:9.0.0" dedent: "npm:1.5.3" execa: "npm:5.0.0" fs-extra: "npm:^11.2.0" @@ -787,7 +989,7 @@ __metadata: npm-package-arg: "npm:11.0.2" npm-packlist: "npm:8.0.2" npm-registry-fetch: "npm:^17.1.0" - nx: "npm:>=17.1.2 < 20" + nx: "npm:>=17.1.2 < 21" p-map: "npm:4.0.0" p-map-series: "npm:2.1.0" p-queue: "npm:6.6.2" @@ -803,7 +1005,6 @@ __metadata: slash: "npm:^3.0.0" ssri: "npm:^10.0.6" string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" strong-log-transformer: "npm:2.1.0" tar: "npm:6.2.1" temp-dir: "npm:1.0.0" @@ -816,7 +1017,27 @@ __metadata: write-pkg: "npm:4.0.0" yargs: "npm:17.7.2" yargs-parser: "npm:21.1.1" - checksum: 10/810df5d35303882f84585be5360b248cec2d339df90bd594231ef2276cc5d2f633b264ae3221b0d2fa0611eeca86ae00cf8c184f79a1fab46ab0663a039a010b + checksum: 10/802db88edad8967afcbf499f68491139965209137ec92f402ac838452079f143701d6f9abd9832b3506a7e1c56e01ea9c09ffd6f8782b1d9202413756fcfd708 + languageName: node + linkType: hard + +"@loaderkit/resolve@npm:^1.0.2": + version: 1.0.3 + resolution: "@loaderkit/resolve@npm:1.0.3" + dependencies: + "@braidai/lang": "npm:^1.0.0" + checksum: 10/58a79d1b3420781f2eaf17a7036a0f87c951ad100fe5437c85b8c655e11c72a489b8d1057551854c21f73668a2054ef3b578473cd7b4218e4766ea775c1e7834 + languageName: node + linkType: hard + +"@napi-rs/wasm-runtime@npm:0.2.4": + version: 0.2.4 + resolution: "@napi-rs/wasm-runtime@npm:0.2.4" + dependencies: + "@emnapi/core": "npm:^1.1.0" + "@emnapi/runtime": "npm:^1.1.0" + "@tybys/wasm-util": "npm:^0.9.0" + checksum: 10/af335867eca9696b0dbb1b8439878e0408a853c42419cd71d2c5dcf9f7c9f6a8549ea88b3a31b9544bb3a9376e5742f3268e58ee066925d3726bd76a121eb8a6 languageName: node linkType: hard @@ -837,7 +1058,7 @@ __metadata: languageName: node linkType: hard -"@nodelib/fs.walk@npm:^1.2.3, @nodelib/fs.walk@npm:^1.2.8": +"@nodelib/fs.walk@npm:^1.2.3": version: 1.2.8 resolution: "@nodelib/fs.walk@npm:1.2.8" dependencies: @@ -905,16 +1126,7 @@ __metadata: languageName: node linkType: hard -"@npmcli/fs@npm:^3.1.0": - version: 3.1.0 - resolution: "@npmcli/fs@npm:3.1.0" - dependencies: - semver: "npm:^7.3.5" - checksum: 10/f3a7ab3a31de65e42aeb6ed03ed035ef123d2de7af4deb9d4a003d27acc8618b57d9fb9d259fe6c28ca538032a028f37337264388ba27d26d37fff7dde22476e - languageName: node - linkType: hard - -"@npmcli/fs@npm:^3.1.1": +"@npmcli/fs@npm:^3.1.0, @npmcli/fs@npm:^3.1.1": version: 3.1.1 resolution: "@npmcli/fs@npm:3.1.1" dependencies: @@ -939,19 +1151,7 @@ __metadata: languageName: node linkType: hard -"@npmcli/installed-package-contents@npm:^2.0.1": - version: 2.0.2 - resolution: "@npmcli/installed-package-contents@npm:2.0.2" - dependencies: - npm-bundled: "npm:^3.0.0" - npm-normalize-package-bin: "npm:^3.0.0" - bin: - installed-package-contents: lib/index.js - checksum: 10/4598a97e3d6e4c8602157d9ac47723071f09662852add0f275af62d1038d8e44d0c5ff9afa05358ba3ca7e100c860d679964be0a163add6ea028dc72d31f0af1 - languageName: node - linkType: hard - -"@npmcli/installed-package-contents@npm:^2.1.0": +"@npmcli/installed-package-contents@npm:^2.0.1, @npmcli/installed-package-contents@npm:^2.1.0": version: 2.1.0 resolution: "@npmcli/installed-package-contents@npm:2.1.0" dependencies: @@ -1056,32 +1256,10 @@ __metadata: languageName: node linkType: hard -"@nrwl/devkit@npm:19.0.4": - version: 19.0.4 - resolution: "@nrwl/devkit@npm:19.0.4" - dependencies: - "@nx/devkit": "npm:19.0.4" - checksum: 10/bdf8e67100c597aa1c3c511b3b32fea1a672589b3013c37642db43e3df0a7d9c28198556cbe6d505ae6232653564c46e3d196a0c7cacd6009a3bb60d2b7ef4a8 - languageName: node - linkType: hard - -"@nrwl/tao@npm:19.0.4": - version: 19.0.4 - resolution: "@nrwl/tao@npm:19.0.4" - dependencies: - nx: "npm:19.0.4" - tslib: "npm:^2.3.0" - bin: - tao: index.js - checksum: 10/1e5a40857a1dbd568cfd42081a9a5568bb968311c0f784fb09d47d576e23267593ac6a2a58bca9c46fbbc97484d7732aaf9358ad8f975d20b1b3d37985b6fd7d - languageName: node - linkType: hard - -"@nx/devkit@npm:19.0.4, @nx/devkit@npm:>=17.1.2 < 20": - version: 19.0.4 - resolution: "@nx/devkit@npm:19.0.4" +"@nx/devkit@npm:>=17.1.2 < 21": + version: 20.0.8 + resolution: "@nx/devkit@npm:20.0.8" dependencies: - "@nrwl/devkit": "npm:19.0.4" ejs: "npm:^3.1.7" enquirer: "npm:~2.3.6" ignore: "npm:^5.0.4" @@ -1091,129 +1269,128 @@ __metadata: tslib: "npm:^2.3.0" yargs-parser: "npm:21.1.1" peerDependencies: - nx: ">= 17 <= 20" - checksum: 10/98baaffce4f4030d46f6b75b450507b66bc67ba9037956e2bf795e23efebf9066f62bf2499fcb36978c2bf0339b8c2aa50953bdaf25a8a26a4ea81d1871785a9 + nx: ">= 19 <= 21" + checksum: 10/f9bb3c3d8a0b61080bba6aa104ec3f3941700617efbf813a3c58ba52f8adc9716e3c2ce61895232d7e95d4e4d5bdc5f9aba3cee7bb4eb75f47bde73cace1b330 languageName: node linkType: hard -"@nx/nx-darwin-arm64@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-darwin-arm64@npm:19.0.4" +"@nx/nx-darwin-arm64@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-darwin-arm64@npm:20.0.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@nx/nx-darwin-x64@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-darwin-x64@npm:19.0.4" +"@nx/nx-darwin-x64@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-darwin-x64@npm:20.0.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@nx/nx-freebsd-x64@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-freebsd-x64@npm:19.0.4" +"@nx/nx-freebsd-x64@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-freebsd-x64@npm:20.0.8" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@nx/nx-linux-arm-gnueabihf@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-linux-arm-gnueabihf@npm:19.0.4" +"@nx/nx-linux-arm-gnueabihf@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-linux-arm-gnueabihf@npm:20.0.8" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@nx/nx-linux-arm64-gnu@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-linux-arm64-gnu@npm:19.0.4" +"@nx/nx-linux-arm64-gnu@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-linux-arm64-gnu@npm:20.0.8" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@nx/nx-linux-arm64-musl@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-linux-arm64-musl@npm:19.0.4" +"@nx/nx-linux-arm64-musl@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-linux-arm64-musl@npm:20.0.8" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@nx/nx-linux-x64-gnu@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-linux-x64-gnu@npm:19.0.4" +"@nx/nx-linux-x64-gnu@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-linux-x64-gnu@npm:20.0.8" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@nx/nx-linux-x64-musl@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-linux-x64-musl@npm:19.0.4" +"@nx/nx-linux-x64-musl@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-linux-x64-musl@npm:20.0.8" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@nx/nx-win32-arm64-msvc@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-win32-arm64-msvc@npm:19.0.4" +"@nx/nx-win32-arm64-msvc@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-win32-arm64-msvc@npm:20.0.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@nx/nx-win32-x64-msvc@npm:19.0.4": - version: 19.0.4 - resolution: "@nx/nx-win32-x64-msvc@npm:19.0.4" +"@nx/nx-win32-x64-msvc@npm:20.0.8": + version: 20.0.8 + resolution: "@nx/nx-win32-x64-msvc@npm:20.0.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@octokit/auth-token@npm:^3.0.0": - version: 3.0.4 - resolution: "@octokit/auth-token@npm:3.0.4" - checksum: 10/8e21e567e38ba307fa30497ad77801135e25c328ce8b363c1622a4afb408a7d3315d54082527b38ecd5b3a5449680d89cfca9cb10c516cacf3dfa01e4c8b7195 +"@octokit/auth-token@npm:^4.0.0": + version: 4.0.0 + resolution: "@octokit/auth-token@npm:4.0.0" + checksum: 10/60e42701e341d700f73c518c7a35675d36d79fa9d5e838cc3ade96d147e49f5ba74db2e07b2337c2b95aaa540aa42088116df2122daa25633f9e70a2c8785c44 languageName: node linkType: hard -"@octokit/core@npm:^4.2.1": - version: 4.2.4 - resolution: "@octokit/core@npm:4.2.4" +"@octokit/core@npm:^5.0.2": + version: 5.2.0 + resolution: "@octokit/core@npm:5.2.0" dependencies: - "@octokit/auth-token": "npm:^3.0.0" - "@octokit/graphql": "npm:^5.0.0" - "@octokit/request": "npm:^6.0.0" - "@octokit/request-error": "npm:^3.0.0" - "@octokit/types": "npm:^9.0.0" + "@octokit/auth-token": "npm:^4.0.0" + "@octokit/graphql": "npm:^7.1.0" + "@octokit/request": "npm:^8.3.1" + "@octokit/request-error": "npm:^5.1.0" + "@octokit/types": "npm:^13.0.0" before-after-hook: "npm:^2.2.0" universal-user-agent: "npm:^6.0.0" - checksum: 10/53ba8f990ce2c0ea4583d8c142377770c3ac8fb9221b563d82dbca9d642f19be49607b9e9b472767075e4afa16c2203339680d75f3ebf5ad853af2646e8604ca + checksum: 10/2e40baf0b5c6949922436a653c213be43befd9690c43dd89872f669f3ac23117ae8ae5e5d6c18094813756c71c3f4fbedd575a891f0b89e12f58b2c38b7f3c13 languageName: node linkType: hard -"@octokit/endpoint@npm:^7.0.0": - version: 7.0.6 - resolution: "@octokit/endpoint@npm:7.0.6" +"@octokit/endpoint@npm:^9.0.6": + version: 9.0.6 + resolution: "@octokit/endpoint@npm:9.0.6" dependencies: - "@octokit/types": "npm:^9.0.0" - is-plain-object: "npm:^5.0.0" + "@octokit/types": "npm:^13.1.0" universal-user-agent: "npm:^6.0.0" - checksum: 10/e8b9cc09aa8306d63cb0e5b65ac5d29fc421522c92810a9d70bbfef997bc8750fc339f1f4f60e1604c22db77457ea493c51849b0d61cbfcb8655b0c4f2640e4b + checksum: 10/2bf776423365ee926bf3f722a664e52f1070758eff4a176279fb132103fd0c76e3541f83ace49bbad9a64f9c9b8de453be565ca8d6136989e9514dea65380ecf languageName: node linkType: hard -"@octokit/graphql@npm:^5.0.0": - version: 5.0.6 - resolution: "@octokit/graphql@npm:5.0.6" +"@octokit/graphql@npm:^7.1.0": + version: 7.1.1 + resolution: "@octokit/graphql@npm:7.1.1" dependencies: - "@octokit/request": "npm:^6.0.0" - "@octokit/types": "npm:^9.0.0" + "@octokit/request": "npm:^8.4.1" + "@octokit/types": "npm:^13.0.0" universal-user-agent: "npm:^6.0.0" - checksum: 10/6014690d184d7b2bfb56ab9be5ddbe4f5c77aa6031d71ec2caf5f56cbd32f4a5b0601049cef7dce1ca8010b89a9fc8bb07ce7833e6213c5bc77b7a564b1f40b9 + checksum: 10/9a7a65fa84df795b0acb5315dae5a4a5a042a01dde0c88974df180a1c02b9b8e61cae013be32461b11ee1d507a8f778f3b7f37dfa3b371771332cb8efcd01f29 languageName: node linkType: hard -"@octokit/openapi-types@npm:^18.0.0": - version: 18.0.0 - resolution: "@octokit/openapi-types@npm:18.0.0" - checksum: 10/5d4aa6abab9b67585bc8496afca4c6377ea1ffccfa17acacd325cefb5fd825799e1d292b498b34023093088b65571c201f4f7e3ba1d3248352f247a1801f6570 +"@octokit/openapi-types@npm:^23.0.1": + version: 23.0.1 + resolution: "@octokit/openapi-types@npm:23.0.1" + checksum: 10/2647ae16bc410cbec930a3d7c25a166366917d7074eef505a6f89d6aa6f5c9972f30e78a4817cbcf7cef5172765db45859805cbfa89591c6175ebceaaa95d199 languageName: node linkType: hard @@ -1224,97 +1401,78 @@ __metadata: languageName: node linkType: hard -"@octokit/plugin-paginate-rest@npm:^6.1.2": - version: 6.1.2 - resolution: "@octokit/plugin-paginate-rest@npm:6.1.2" +"@octokit/plugin-paginate-rest@npm:11.4.4-cjs.2": + version: 11.4.4-cjs.2 + resolution: "@octokit/plugin-paginate-rest@npm:11.4.4-cjs.2" dependencies: - "@octokit/tsconfig": "npm:^1.0.2" - "@octokit/types": "npm:^9.2.3" + "@octokit/types": "npm:^13.7.0" peerDependencies: - "@octokit/core": ">=4" - checksum: 10/6d5b97fb44a3ed8ff25196b56ebe7bdac64f4023c165792f77938c77876934c01b46e79b83712e26cd3f2f9e36e0735bd3c292a37e8060a2b259f3a6456116dc + "@octokit/core": 5 + checksum: 10/e0f696b3b69febe4e7c736d909065871f38bb8346a07f19a9c83246a02972568ac672667db472f846baef20a9611adf26ce8f0f189a11004c4b6618765078e19 languageName: node linkType: hard -"@octokit/plugin-request-log@npm:^1.0.4": - version: 1.0.4 - resolution: "@octokit/plugin-request-log@npm:1.0.4" +"@octokit/plugin-request-log@npm:^4.0.0": + version: 4.0.1 + resolution: "@octokit/plugin-request-log@npm:4.0.1" peerDependencies: - "@octokit/core": ">=3" - checksum: 10/2086db00056aee0f8ebd79797b5b57149ae1014e757ea08985b71eec8c3d85dbb54533f4fd34b6b9ecaa760904ae6a7536be27d71e50a3782ab47809094bfc0c + "@octokit/core": 5 + checksum: 10/fd8c0a201490cba00084689a0d1d54fc7b5ab5b6bdb7e447056b947b1754f78526e9685400eab10d3522bfa7b5bc49c555f41ec412c788610b96500b168f3789 languageName: node linkType: hard -"@octokit/plugin-rest-endpoint-methods@npm:^7.1.2": - version: 7.2.3 - resolution: "@octokit/plugin-rest-endpoint-methods@npm:7.2.3" +"@octokit/plugin-rest-endpoint-methods@npm:13.3.2-cjs.1": + version: 13.3.2-cjs.1 + resolution: "@octokit/plugin-rest-endpoint-methods@npm:13.3.2-cjs.1" dependencies: - "@octokit/types": "npm:^10.0.0" + "@octokit/types": "npm:^13.8.0" peerDependencies: - "@octokit/core": ">=3" - checksum: 10/59fb4e786ab85a5f3ad701e1b193dd3113833cfd1f2657cb06864e45b80a53a1f9ba6c3c66a855c4bf2593c539299fdfe51db639e3a87dc16ffa7602fe9bb999 + "@octokit/core": ^5 + checksum: 10/479827e62466e55bc1a50129d51597807bddc6c909e56be9e8dd9c1a91efa0f466a2f56b7d80438649e21ab0a3a195f840b3fccf2ae7f11fb0a919db8e62bc62 languageName: node linkType: hard -"@octokit/request-error@npm:^3.0.0": - version: 3.0.3 - resolution: "@octokit/request-error@npm:3.0.3" +"@octokit/request-error@npm:^5.1.0, @octokit/request-error@npm:^5.1.1": + version: 5.1.1 + resolution: "@octokit/request-error@npm:5.1.1" dependencies: - "@octokit/types": "npm:^9.0.0" + "@octokit/types": "npm:^13.1.0" deprecation: "npm:^2.0.0" once: "npm:^1.4.0" - checksum: 10/5db0b514732686b627e6ed9ef1ccdbc10501f1b271a9b31f784783f01beee70083d7edcfeb35fbd7e569fa31fdd6762b1ff6b46101700d2d97e7e48e749520d0 + checksum: 10/6ad98626407ba57bb33fa197611be74bee1dd9abc8d5d845648d6a2a04aa6840c0eb7f4be341d55dfcab5bc19181ad5fd25194869a7aaac6245f74b3a14d9662 languageName: node linkType: hard -"@octokit/request@npm:^6.0.0": - version: 6.2.8 - resolution: "@octokit/request@npm:6.2.8" +"@octokit/request@npm:^8.3.1, @octokit/request@npm:^8.4.1": + version: 8.4.1 + resolution: "@octokit/request@npm:8.4.1" dependencies: - "@octokit/endpoint": "npm:^7.0.0" - "@octokit/request-error": "npm:^3.0.0" - "@octokit/types": "npm:^9.0.0" - is-plain-object: "npm:^5.0.0" - node-fetch: "npm:^2.6.7" + "@octokit/endpoint": "npm:^9.0.6" + "@octokit/request-error": "npm:^5.1.1" + "@octokit/types": "npm:^13.1.0" universal-user-agent: "npm:^6.0.0" - checksum: 10/47188fa08d28e5e9e6a22f84058fc13f108cdcb68aea97686da4718d32d3ddda8fde8a5c9f189057e3d466560b67c2305a2e343d1eed9517b47a13f68cb329e7 + checksum: 10/2b2c9131cc9b608baeeef8ce2943768cc9db5fbe36a665f734a099bd921561c760e4391fbdf39d5aefb725db26742db1488c65624940ef7cec522e10863caa5e languageName: node linkType: hard -"@octokit/rest@npm:19.0.11": - version: 19.0.11 - resolution: "@octokit/rest@npm:19.0.11" +"@octokit/rest@npm:20.1.2": + version: 20.1.2 + resolution: "@octokit/rest@npm:20.1.2" dependencies: - "@octokit/core": "npm:^4.2.1" - "@octokit/plugin-paginate-rest": "npm:^6.1.2" - "@octokit/plugin-request-log": "npm:^1.0.4" - "@octokit/plugin-rest-endpoint-methods": "npm:^7.1.2" - checksum: 10/c9b15de6b544506c85c0297e48aa51a2aeb8f73415eef7331fc5c951c7eaa75f6fcf9d549ca5bb52a5f631553c94a70ac550ef9a3202ee765c49c04a85523d8b + "@octokit/core": "npm:^5.0.2" + "@octokit/plugin-paginate-rest": "npm:11.4.4-cjs.2" + "@octokit/plugin-request-log": "npm:^4.0.0" + "@octokit/plugin-rest-endpoint-methods": "npm:13.3.2-cjs.1" + checksum: 10/e0759fdbf18bc96f68299b4ca04d7102ce861e8508f01e9e580ed9c1e19d4cc20d150635161e360375f1c52c95e54bf6b56aaae16f943a93d6dcb38a51d8a23e languageName: node linkType: hard -"@octokit/tsconfig@npm:^1.0.2": - version: 1.0.2 - resolution: "@octokit/tsconfig@npm:1.0.2" - checksum: 10/74d56f3e9f326a8dd63700e9a51a7c75487180629c7a68bbafee97c612fbf57af8347369bfa6610b9268a3e8b833c19c1e4beb03f26db9a9dce31f6f7a19b5b1 - languageName: node - linkType: hard - -"@octokit/types@npm:^10.0.0": - version: 10.0.0 - resolution: "@octokit/types@npm:10.0.0" +"@octokit/types@npm:^13.0.0, @octokit/types@npm:^13.1.0, @octokit/types@npm:^13.7.0, @octokit/types@npm:^13.8.0": + version: 13.8.0 + resolution: "@octokit/types@npm:13.8.0" dependencies: - "@octokit/openapi-types": "npm:^18.0.0" - checksum: 10/6345e605d30c99639a0207cfc7bea5bf29d9007e93cdcd78be3f8218830a462a0f0fbb976f5c2d9ebe70ee2aa33d1b72243cdb955478581ee2cead059ac4f030 - languageName: node - linkType: hard - -"@octokit/types@npm:^9.0.0, @octokit/types@npm:^9.2.3": - version: 9.3.2 - resolution: "@octokit/types@npm:9.3.2" - dependencies: - "@octokit/openapi-types": "npm:^18.0.0" - checksum: 10/4bcd18850d5397e5835f5686be88ad95e5d7c23e7d53f898b82a8ca5fc1f6a7b53816ef6f9f3b7a06799c0b030d259bf2bd50a258a1656df2dc7f3e533e334f8 + "@octokit/openapi-types": "npm:^23.0.1" + checksum: 10/7f260cd3f98887626e791cc0e71ae718b689f359ff6546ed0343364bb213c70807f71135956659470ecdf2b4a5a0c32b6437bd5a3af412883ef3a62f41e811f8 languageName: node linkType: hard @@ -1339,107 +1497,149 @@ __metadata: languageName: node linkType: hard -"@rollup/rollup-android-arm-eabi@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-android-arm-eabi@npm:4.14.0" +"@repo/hoist-peer-dependencies@workspace:*, @repo/hoist-peer-dependencies@workspace:internals/hoist-peer-dependencies": + version: 0.0.0-use.local + resolution: "@repo/hoist-peer-dependencies@workspace:internals/hoist-peer-dependencies" + languageName: unknown + linkType: soft + +"@repo/tsconfig@workspace:*, @repo/tsconfig@workspace:internals/tsconfig": + version: 0.0.0-use.local + resolution: "@repo/tsconfig@workspace:internals/tsconfig" + dependencies: + "@sindresorhus/tsconfig": "npm:^7.0.0" + languageName: unknown + linkType: soft + +"@rollup/rollup-android-arm-eabi@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.31.0" conditions: os=android & cpu=arm languageName: node linkType: hard -"@rollup/rollup-android-arm64@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-android-arm64@npm:4.14.0" +"@rollup/rollup-android-arm64@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-android-arm64@npm:4.31.0" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-arm64@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-darwin-arm64@npm:4.14.0" +"@rollup/rollup-darwin-arm64@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.31.0" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-darwin-x64@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-darwin-x64@npm:4.14.0" +"@rollup/rollup-darwin-x64@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.31.0" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@rollup/rollup-linux-arm-gnueabihf@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.14.0" - conditions: os=linux & cpu=arm +"@rollup/rollup-freebsd-arm64@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.31.0" + conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-linux-arm64-gnu@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.14.0" +"@rollup/rollup-freebsd-x64@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-freebsd-x64@npm:4.31.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.31.0" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.31.0" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.31.0" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-arm64-musl@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-linux-arm64-musl@npm:4.14.0" +"@rollup/rollup-linux-arm64-musl@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.31.0" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-linux-powerpc64le-gnu@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.14.0" - conditions: os=linux & cpu=ppc64le & libc=glibc +"@rollup/rollup-linux-loongarch64-gnu@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-loongarch64-gnu@npm:4.31.0" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-powerpc64le-gnu@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-powerpc64le-gnu@npm:4.31.0" + conditions: os=linux & cpu=ppc64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-riscv64-gnu@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.14.0" +"@rollup/rollup-linux-riscv64-gnu@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.31.0" conditions: os=linux & cpu=riscv64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-s390x-gnu@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.14.0" +"@rollup/rollup-linux-s390x-gnu@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.31.0" conditions: os=linux & cpu=s390x & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-gnu@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-linux-x64-gnu@npm:4.14.0" +"@rollup/rollup-linux-x64-gnu@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.31.0" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@rollup/rollup-linux-x64-musl@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-linux-x64-musl@npm:4.14.0" +"@rollup/rollup-linux-x64-musl@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.31.0" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@rollup/rollup-win32-arm64-msvc@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.14.0" +"@rollup/rollup-win32-arm64-msvc@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.31.0" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@rollup/rollup-win32-ia32-msvc@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.14.0" +"@rollup/rollup-win32-ia32-msvc@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.31.0" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@rollup/rollup-win32-x64-msvc@npm:4.14.0": - version: 4.14.0 - resolution: "@rollup/rollup-win32-x64-msvc@npm:4.14.0" +"@rollup/rollup-win32-x64-msvc@npm:4.31.0": + version: 4.31.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.31.0" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1523,10 +1723,10 @@ __metadata: languageName: node linkType: hard -"@sindresorhus/tsconfig@npm:^6.0.0": - version: 6.0.0 - resolution: "@sindresorhus/tsconfig@npm:6.0.0" - checksum: 10/6971cea3628433604c6d6daeae47e94caea7b73fc8bb349f6121089940d579118ec13f76960a117c1e449bb010844bef1bd13ae3b190ff66e415952146cf01de +"@sindresorhus/tsconfig@npm:^7.0.0": + version: 7.0.0 + resolution: "@sindresorhus/tsconfig@npm:7.0.0" + checksum: 10/ecd39a526c586b45ec3071b474e1a3a711bd9e32ca5babd8c64159158c9078ba766e9b978145c17b975c5d7f9052b03f47ee39ad8f584b8c118a73207fcf2609 languageName: node linkType: hard @@ -1582,10 +1782,26 @@ __metadata: languageName: node linkType: hard -"@types/estree@npm:1.0.5, @types/estree@npm:^1.0.0": - version: 1.0.5 - resolution: "@types/estree@npm:1.0.5" - checksum: 10/7de6d928dd4010b0e20c6919e1a6c27b61f8d4567befa89252055fad503d587ecb9a1e3eab1b1901f923964d7019796db810b7fd6430acb26c32866d126fd408 +"@tybys/wasm-util@npm:^0.9.0": + version: 0.9.0 + resolution: "@tybys/wasm-util@npm:0.9.0" + dependencies: + tslib: "npm:^2.4.0" + checksum: 10/aa58e64753a420ad1eefaf7bacef3dda61d74f9336925943d9244132d5b48d9242f734f1e707fd5ccfa6dd1d8ec8e6debc234b4dedb3a5b0d8486d1f373350b2 + languageName: node + linkType: hard + +"@types/estree@npm:1.0.6, @types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": + version: 1.0.6 + resolution: "@types/estree@npm:1.0.6" + checksum: 10/9d35d475095199c23e05b431bcdd1f6fec7380612aed068b14b2a08aa70494de8a9026765a5a91b1073f636fb0368f6d8973f518a31391d519e20c59388ed88d + languageName: node + linkType: hard + +"@types/json-schema@npm:^7.0.15": + version: 7.0.15 + resolution: "@types/json-schema@npm:7.0.15" + checksum: 10/1a3c3e06236e4c4aab89499c428d585527ce50c24fe8259e8b3926d3df4cfbbbcf306cfc73ddfb66cbafc973116efd15967020b0f738f63e09e64c7d260519e7 languageName: node linkType: hard @@ -1613,20 +1829,20 @@ __metadata: linkType: hard "@types/node@npm:*": - version: 22.5.0 - resolution: "@types/node@npm:22.5.0" + version: 22.13.5 + resolution: "@types/node@npm:22.13.5" dependencies: - undici-types: "npm:~6.19.2" - checksum: 10/89af3bd217b1559b645a9ed16d4ae3add75749814cbd8eefddd1b96003d1973afb1c8a2b23d69f3a8cc6c532e3aa185eaf5cc29a6e7c42c311a2aad4c99430ae + undici-types: "npm:~6.20.0" + checksum: 10/a69ec8dba36a58a93e3ec3709a6a362ca0cdd8443310bb5e43b0c1f560c57bcc120c96fabb301ef42c2901f46103adad5158b6923ea14e8e14a432af20a2bb24 languageName: node linkType: hard -"@types/node@npm:^22.5.2": - version: 22.5.2 - resolution: "@types/node@npm:22.5.2" +"@types/node@npm:^22.13.10": + version: 22.13.10 + resolution: "@types/node@npm:22.13.10" dependencies: - undici-types: "npm:~6.19.2" - checksum: 10/c4634118abc36d1436d62e192f7088c211139165a395f1cdacca28df421d8dc8dd332b3104d72fc37764d73a205a4bbbe6e6abdc817c2c81883e147d1a96d497 + undici-types: "npm:~6.20.0" + checksum: 10/57dc6a5e0110ca9edea8d7047082e649fa7fa813f79e4a901653b9174141c622f4336435648baced5b38d9f39843f404fa2d8d7a10981610da26066bc8caab48 languageName: node linkType: hard @@ -1637,6 +1853,13 @@ __metadata: languageName: node linkType: hard +"@types/normalize-package-data@npm:^2.4.3": + version: 2.4.4 + resolution: "@types/normalize-package-data@npm:2.4.4" + checksum: 10/65dff72b543997b7be8b0265eca7ace0e34b75c3e5fee31de11179d08fa7124a7a5587265d53d0409532ecb7f7fba662c2012807963e1f9b059653ec2c83ee05 + languageName: node + linkType: hard + "@types/wrap-ansi@npm:^3.0.0": version: 3.0.0 resolution: "@types/wrap-ansi@npm:3.0.0" @@ -1644,221 +1867,239 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/eslint-plugin@npm:8.3.0" +"@typescript-eslint/eslint-plugin@npm:8.26.0": + version: 8.26.0 + resolution: "@typescript-eslint/eslint-plugin@npm:8.26.0" dependencies: "@eslint-community/regexpp": "npm:^4.10.0" - "@typescript-eslint/scope-manager": "npm:8.3.0" - "@typescript-eslint/type-utils": "npm:8.3.0" - "@typescript-eslint/utils": "npm:8.3.0" - "@typescript-eslint/visitor-keys": "npm:8.3.0" + "@typescript-eslint/scope-manager": "npm:8.26.0" + "@typescript-eslint/type-utils": "npm:8.26.0" + "@typescript-eslint/utils": "npm:8.26.0" + "@typescript-eslint/visitor-keys": "npm:8.26.0" graphemer: "npm:^1.4.0" ignore: "npm:^5.3.1" natural-compare: "npm:^1.4.0" - ts-api-utils: "npm:^1.3.0" + ts-api-utils: "npm:^2.0.1" peerDependencies: "@typescript-eslint/parser": ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/00dc71345066940fed070308f585f812173c357d48b8aafa3fc4de89951d1803ad8f3f47f298320d334cd141c55fbe45210b37ad2899570d306ad66b25faef26 + typescript: ">=4.8.4 <5.9.0" + checksum: 10/5a3d2445178b815398aa9707e112492ce15c1709e7760fc2d68e64fce609901f4145de923007f50c3bbd6d11ef9f6c7843f1df40ab93c99f8a6610bcf34aa5c2 languageName: node linkType: hard -"@typescript-eslint/parser@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/parser@npm:8.3.0" +"@typescript-eslint/parser@npm:8.26.0": + version: 8.26.0 + resolution: "@typescript-eslint/parser@npm:8.26.0" dependencies: - "@typescript-eslint/scope-manager": "npm:8.3.0" - "@typescript-eslint/types": "npm:8.3.0" - "@typescript-eslint/typescript-estree": "npm:8.3.0" - "@typescript-eslint/visitor-keys": "npm:8.3.0" + "@typescript-eslint/scope-manager": "npm:8.26.0" + "@typescript-eslint/types": "npm:8.26.0" + "@typescript-eslint/typescript-estree": "npm:8.26.0" + "@typescript-eslint/visitor-keys": "npm:8.26.0" debug: "npm:^4.3.4" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/627e8d0b3376a1453c122c5dc8eda2ec1427328012d34f087291e52b484adde47a97fd0febb80cabcb058d80cea3b5df1ff44ba21ccb3ff001a6043bb068de62 + typescript: ">=4.8.4 <5.9.0" + checksum: 10/86843d488b58d47d4bd45fed25a5afbb033bd844b4517f6401ae2f9af0fdeaedaf5c9dd30e74a7bf5b6029cff10fec0e33ca073b1ffe4795df7403b58aaac58c languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/scope-manager@npm:8.3.0" +"@typescript-eslint/scope-manager@npm:8.26.0": + version: 8.26.0 + resolution: "@typescript-eslint/scope-manager@npm:8.26.0" dependencies: - "@typescript-eslint/types": "npm:8.3.0" - "@typescript-eslint/visitor-keys": "npm:8.3.0" - checksum: 10/ce56dbd82606daae889d0a913308b743b43d5df827aeedd7349de181e1fb4cf1af4795cfabf395bcd9871925217c301b75ee0d1c7c1dd6c2c79105714d1c6629 + "@typescript-eslint/types": "npm:8.26.0" + "@typescript-eslint/visitor-keys": "npm:8.26.0" + checksum: 10/beccc5c0a815f20d8ccd5f8c4365175df39b62d0eeaf4893ef9b25e2fd96d26ac20e667b91d258584d33b970a471240b1b5bee73b14dac6630a63b5ce0b9ecd4 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/type-utils@npm:8.3.0" +"@typescript-eslint/type-utils@npm:8.26.0": + version: 8.26.0 + resolution: "@typescript-eslint/type-utils@npm:8.26.0" dependencies: - "@typescript-eslint/typescript-estree": "npm:8.3.0" - "@typescript-eslint/utils": "npm:8.3.0" + "@typescript-eslint/typescript-estree": "npm:8.26.0" + "@typescript-eslint/utils": "npm:8.26.0" debug: "npm:^4.3.4" - ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/70dac55d8d9e33e3291c555b8454fd8dbc0c20ac7b0652521d5bae37d2e81db08eef229449f837c6b96de7853565a249dc38242406d83ba38ee5851f1ff06697 + ts-api-utils: "npm:^2.0.1" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10/cc383418bd208b5787ec93923a5ecb46f424b5f9a5aeb81f51382aa440671b6c85d1fe27527f2e0d711dfaff593d42ca6b57c10c839db800aa4d965d01ac8461 languageName: node linkType: hard -"@typescript-eslint/types@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/types@npm:8.3.0" - checksum: 10/0265f6b6999db53ea5246cf2ab69d58d3860616a3ad384efdbe8b6f71334d6fbcf09ddc1eb38956ff537056636bd993d349c7037fcb458359c257be857fedc0a +"@typescript-eslint/types@npm:8.26.0": + version: 8.26.0 + resolution: "@typescript-eslint/types@npm:8.26.0" + checksum: 10/2fcd2eed0550bc7f95ccf54cf44aae50a38b531deae92c6a616890fff7f335eb2c030553062518fa1bde9e29009b2c92ed59489c2ef9d4e35e9df55f95a6992b languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/typescript-estree@npm:8.3.0" +"@typescript-eslint/typescript-estree@npm:8.26.0": + version: 8.26.0 + resolution: "@typescript-eslint/typescript-estree@npm:8.26.0" dependencies: - "@typescript-eslint/types": "npm:8.3.0" - "@typescript-eslint/visitor-keys": "npm:8.3.0" + "@typescript-eslint/types": "npm:8.26.0" + "@typescript-eslint/visitor-keys": "npm:8.26.0" debug: "npm:^4.3.4" fast-glob: "npm:^3.3.2" is-glob: "npm:^4.0.3" minimatch: "npm:^9.0.4" semver: "npm:^7.6.0" - ts-api-utils: "npm:^1.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/61243c9251f98120ec8cf1abb03841bc65652c53ec80f0b628c2f853f4d9796b934fd7f27adab53b5670241f4eeb72afcfedcb9861e1c3e36241e36bd54ed909 + ts-api-utils: "npm:^2.0.1" + peerDependencies: + typescript: ">=4.8.4 <5.9.0" + checksum: 10/f50101c138a545d0286b4c20be6e873c380cd2f3abac0bef7ce120e8c8297bad2e7ccb4ed4152ab455f2fb2761089d5d75e9d2ba277c3beef3019c99a9067c24 languageName: node linkType: hard -"@typescript-eslint/utils@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/utils@npm:8.3.0" +"@typescript-eslint/utils@npm:8.26.0": + version: 8.26.0 + resolution: "@typescript-eslint/utils@npm:8.26.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.4.0" - "@typescript-eslint/scope-manager": "npm:8.3.0" - "@typescript-eslint/types": "npm:8.3.0" - "@typescript-eslint/typescript-estree": "npm:8.3.0" + "@typescript-eslint/scope-manager": "npm:8.26.0" + "@typescript-eslint/types": "npm:8.26.0" + "@typescript-eslint/typescript-estree": "npm:8.26.0" peerDependencies: eslint: ^8.57.0 || ^9.0.0 - checksum: 10/9d3494c15f56792f7867616c18142a3cedca8f93d77c71f58891f7fa6f1bcdef8277e85abd359687ab0c2d44b897096b007612725793850748d9c3cf49620110 + typescript: ">=4.8.4 <5.9.0" + checksum: 10/69b5ace76c27db4c6d9ce5e4d76aa17c712d90cbe61f3e8603c16a75d8ea38d27c54c4f70937bcd16f6352b26be79ee200f62af60d52b4fc6fe7e88fcaf93fe5 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:8.3.0": - version: 8.3.0 - resolution: "@typescript-eslint/visitor-keys@npm:8.3.0" +"@typescript-eslint/visitor-keys@npm:8.26.0": + version: 8.26.0 + resolution: "@typescript-eslint/visitor-keys@npm:8.26.0" dependencies: - "@typescript-eslint/types": "npm:8.3.0" - eslint-visitor-keys: "npm:^3.4.3" - checksum: 10/4ee45dd25891d5677b8d4aaab23234a9d1fe8af3d8e39d7777b3a4cfb6aa61fabc13623d8596c11e6140f9129dc9ad7e6bb6f48a4c8c40704018ddd5beafd6c2 + "@typescript-eslint/types": "npm:8.26.0" + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/8800c84d711682949e27d72e65b501dbdc5de0009b7d74e289f5f9125aa21107dc55c6ef3dc970431acebe92e19e907d1622de2d2092a79eb8d29ac96670ea75 languageName: node linkType: hard -"@vitest/coverage-v8@npm:^2.0.5": - version: 2.0.5 - resolution: "@vitest/coverage-v8@npm:2.0.5" +"@vitest/coverage-v8@npm:^3.0.8": + version: 3.0.8 + resolution: "@vitest/coverage-v8@npm:3.0.8" dependencies: "@ampproject/remapping": "npm:^2.3.0" - "@bcoe/v8-coverage": "npm:^0.2.3" - debug: "npm:^4.3.5" + "@bcoe/v8-coverage": "npm:^1.0.2" + debug: "npm:^4.4.0" istanbul-lib-coverage: "npm:^3.2.2" istanbul-lib-report: "npm:^3.0.1" istanbul-lib-source-maps: "npm:^5.0.6" istanbul-reports: "npm:^3.1.7" - magic-string: "npm:^0.30.10" - magicast: "npm:^0.3.4" - std-env: "npm:^3.7.0" + magic-string: "npm:^0.30.17" + magicast: "npm:^0.3.5" + std-env: "npm:^3.8.0" test-exclude: "npm:^7.0.1" - tinyrainbow: "npm:^1.2.0" + tinyrainbow: "npm:^2.0.0" peerDependencies: - vitest: 2.0.5 - checksum: 10/bb774d1a52b85adf94dcf62dc9684c59bd6aba6f8d43ce4d4afa06e3ca85651ec217f74842c0c4a81ea0158f029e484055207869e5d741cfbc3119257399fb83 + "@vitest/browser": 3.0.8 + vitest: 3.0.8 + peerDependenciesMeta: + "@vitest/browser": + optional: true + checksum: 10/78d2349a9a200ca82acda2fbb785cdaf11081cfdb590d2aa9c596fe318fb5badd0247099a4ac1bd52eef606d0255fcd4573f334e61263671eb8901e4810a788a languageName: node linkType: hard -"@vitest/expect@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/expect@npm:2.0.5" +"@vitest/expect@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/expect@npm:3.0.8" dependencies: - "@vitest/spy": "npm:2.0.5" - "@vitest/utils": "npm:2.0.5" - chai: "npm:^5.1.1" - tinyrainbow: "npm:^1.2.0" - checksum: 10/ca9a218f50254b2259fd16166b2d8c9ccc8ee2cc068905e6b3d6281da10967b1590cc7d34b5fa9d429297f97e740450233745583b4cc12272ff11705faf70a37 + "@vitest/spy": "npm:3.0.8" + "@vitest/utils": "npm:3.0.8" + chai: "npm:^5.2.0" + tinyrainbow: "npm:^2.0.0" + checksum: 10/6cb8a707ff8be140f5d1a5f61a9b0622b2783af1cb591b286e20ebeab9d04081567ef0f9bd697e60b08bc5be0008ea4687b78fb1134e7f3956f2fb06c74c59f8 languageName: node linkType: hard -"@vitest/pretty-format@npm:2.0.5, @vitest/pretty-format@npm:^2.0.5": - version: 2.0.5 - resolution: "@vitest/pretty-format@npm:2.0.5" +"@vitest/mocker@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/mocker@npm:3.0.8" dependencies: - tinyrainbow: "npm:^1.2.0" - checksum: 10/70bf452dd0b8525e658795125b3f11110bd6baadfaa38c5bb91ca763bded35ec6dc80e27964ad4e91b91be6544d35e18ea7748c1997693988f975a7283c3e9a0 + "@vitest/spy": "npm:3.0.8" + estree-walker: "npm:^3.0.3" + magic-string: "npm:^0.30.17" + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + checksum: 10/456cafc5c2701a3cfffd7549e3bef0313f96672aea1c3f3da449b0d28744b69d466e510afdf6d5ad08beb7126954c75468c8408e099a2faea8733b364c5523fd languageName: node linkType: hard -"@vitest/runner@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/runner@npm:2.0.5" +"@vitest/pretty-format@npm:3.0.8, @vitest/pretty-format@npm:^3.0.8": + version: 3.0.8 + resolution: "@vitest/pretty-format@npm:3.0.8" dependencies: - "@vitest/utils": "npm:2.0.5" - pathe: "npm:^1.1.2" - checksum: 10/464449abb84b3c779e1c6d1bedfc9e7469240ba3ccc4b4fa884386d1752d6572b68b9a87440159d433f17f61aca4012ee3bb78a3718d0e2bc64d810e9fc574a5 + tinyrainbow: "npm:^2.0.0" + checksum: 10/255a7929e814fd8cfd8978ae6342479a8f453ccca97a0a968efbe45b5d39d2c56e1bfa3a5400816f54d3a82c944c8407f7fe2426ec57499a9210bdccf06dbc78 languageName: node linkType: hard -"@vitest/snapshot@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/snapshot@npm:2.0.5" +"@vitest/runner@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/runner@npm:3.0.8" dependencies: - "@vitest/pretty-format": "npm:2.0.5" - magic-string: "npm:^0.30.10" - pathe: "npm:^1.1.2" - checksum: 10/fb46bc65851d4c8dcbbf86279c4146d5e7c17ad0d1be97132dedd98565d37f70ac8b0bf51ead0c6707786ffb15652535398c14d4304fa2146b0393d3db26fdff + "@vitest/utils": "npm:3.0.8" + pathe: "npm:^2.0.3" + checksum: 10/d1c3661ed1a5b2ffc3b90b99eac6133b318b2f32ff49e805e153d7128b3a824ff7906eced8d08d7a43b9f34a280432b060c59b2fcede942cde2de4c5684ae003 languageName: node linkType: hard -"@vitest/spy@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/spy@npm:2.0.5" +"@vitest/snapshot@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/snapshot@npm:3.0.8" dependencies: - tinyspy: "npm:^3.0.0" - checksum: 10/ed19f4c3bb4d3853241e8070979615138e24403ce4c137fa48c903b3af2c8b3ada2cc26aca9c1aa323bb314a457a8130a29acbb18dafd4e42737deefb2abf1ca + "@vitest/pretty-format": "npm:3.0.8" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + checksum: 10/61b66ca6a3362de8724fd7cfa17b27a1d59d884693e5c1a2b4edfbcdc75621a7d3314ecb207c88aabff6e6360e7d4ed08c1997ecf3f71e28c485bd590a98919e languageName: node linkType: hard -"@vitest/ui@npm:^2.0.5": - version: 2.0.5 - resolution: "@vitest/ui@npm:2.0.5" +"@vitest/spy@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/spy@npm:3.0.8" dependencies: - "@vitest/utils": "npm:2.0.5" - fast-glob: "npm:^3.3.2" + tinyspy: "npm:^3.0.2" + checksum: 10/a6be428cedd4052d44ffd90ebd0c422d389f313996e08c5a655148b7d1c5695a94a321c66acc8331e20a3988e3946d4231722a8c5040afe1fe41035e3d390297 + languageName: node + linkType: hard + +"@vitest/ui@npm:^3.0.8": + version: 3.0.8 + resolution: "@vitest/ui@npm:3.0.8" + dependencies: + "@vitest/utils": "npm:3.0.8" fflate: "npm:^0.8.2" - flatted: "npm:^3.3.1" - pathe: "npm:^1.1.2" - sirv: "npm:^2.0.4" - tinyrainbow: "npm:^1.2.0" + flatted: "npm:^3.3.3" + pathe: "npm:^2.0.3" + sirv: "npm:^3.0.1" + tinyglobby: "npm:^0.2.12" + tinyrainbow: "npm:^2.0.0" peerDependencies: - vitest: 2.0.5 - checksum: 10/ef07017386d48a1da6871c6f164584a2786172243bdf61dda91b2773fc275743739fc1dd9098e56ec384e599f8e3059a5314cdcfb186380b73dfed11cff252d2 + vitest: 3.0.8 + checksum: 10/d38c3ebf31b62fb6c987ce663e8a04e36642cbdcba4e521fcef13c41346435847885f180854ee20592c56d6722b6b5c5f46c211bd2d86403023b0ce99ff23f0b languageName: node linkType: hard -"@vitest/utils@npm:2.0.5": - version: 2.0.5 - resolution: "@vitest/utils@npm:2.0.5" +"@vitest/utils@npm:3.0.8": + version: 3.0.8 + resolution: "@vitest/utils@npm:3.0.8" dependencies: - "@vitest/pretty-format": "npm:2.0.5" - estree-walker: "npm:^3.0.3" - loupe: "npm:^3.1.1" - tinyrainbow: "npm:^1.2.0" - checksum: 10/d631d56d29c33bc8de631166b2b6691c470187a345469dfef7048befe6027e1c6ff9552f2ee11c8a247522c325c4a64bfcc73f8f0f0c525da39cb9f190f119f8 + "@vitest/pretty-format": "npm:3.0.8" + loupe: "npm:^3.1.3" + tinyrainbow: "npm:^2.0.0" + checksum: 10/207281dc59cd37e4aabb56db4b9bd66d281b4ef314cbed7f9642e61dfcd65bb12d29600291d676f56c3eb82b9831722a59b13f0d65b1a7af4e3ed2a5c18e98b7 languageName: node linkType: hard @@ -1879,14 +2120,14 @@ __metadata: languageName: node linkType: hard -"@zkochan/js-yaml@npm:0.0.6": - version: 0.0.6 - resolution: "@zkochan/js-yaml@npm:0.0.6" +"@zkochan/js-yaml@npm:0.0.7": + version: 0.0.7 + resolution: "@zkochan/js-yaml@npm:0.0.7" dependencies: argparse: "npm:^2.0.1" bin: js-yaml: bin/js-yaml.js - checksum: 10/1a079db8bc76dfd200f3d2334c96fd5df6ce072f40b5aa6fe4508e6fd5af0e57cab6fc879ea7f8c376e4c553febd73c4b46c924bd48b838b5b9522936b88517b + checksum: 10/83642debff31400764e8721ba8f386e0f5444b118c7a6c17dbdcb316b56fefa061ea0587af47de75e04d60059215a703a1ca8bbc479149581cd57d752cb3d4e0 languageName: node linkType: hard @@ -1932,21 +2173,12 @@ __metadata: languageName: node linkType: hard -"acorn@npm:^8.11.3, acorn@npm:^8.4.1": - version: 8.11.3 - resolution: "acorn@npm:8.11.3" +"acorn@npm:^8.14.0, acorn@npm:^8.4.1": + version: 8.14.0 + resolution: "acorn@npm:8.14.0" bin: acorn: bin/acorn - checksum: 10/b688e7e3c64d9bfb17b596e1b35e4da9d50553713b3b3630cf5690f2b023a84eac90c56851e6912b483fe60e8b4ea28b254c07e92f17ef83d72d78745a8352dd - languageName: node - linkType: hard - -"acorn@npm:^8.12.0": - version: 8.12.0 - resolution: "acorn@npm:8.12.0" - bin: - acorn: bin/acorn - checksum: 10/550cc5033184eb98f7fbe2e9ddadd0f47f065734cc682f25db7a244f52314eb816801b64dec7174effd978045bd1754892731a90b1102b0ede9d17a15cfde138 + checksum: 10/6df29c35556782ca9e632db461a7f97947772c6c1d5438a81f0c873a3da3a792487e83e404d1c6c25f70513e91aa18745f6eafb1fcc3a43ecd1920b21dd173d2 languageName: node linkType: hard @@ -2072,7 +2304,7 @@ __metadata: languageName: node linkType: hard -"ansi-styles@npm:^6.0.0, ansi-styles@npm:^6.1.0, ansi-styles@npm:^6.2.1": +"ansi-styles@npm:^6.1.0": version: 6.2.1 resolution: "ansi-styles@npm:6.2.1" checksum: 10/70fdf883b704d17a5dfc9cde206e698c16bcd74e7f196ab821511651aee4f9f76c9514bdfa6ca3a27b5e49138b89cb222a28caf3afe4567570139577f991df32 @@ -2086,6 +2318,16 @@ __metadata: languageName: node linkType: hard +"anymatch@npm:~3.1.2": + version: 3.1.3 + resolution: "anymatch@npm:3.1.3" + dependencies: + normalize-path: "npm:^3.0.0" + picomatch: "npm:^2.0.4" + checksum: 10/3e044fd6d1d26545f235a9fe4d7a534e2029d8e59fa7fd9f2a6eb21230f6b5380ea1eaf55136e60cbf8e613544b3b766e7a6fa2102e2a3a117505466e3025dc2 + languageName: node + linkType: hard + "aproba@npm:2.0.0, aproba@npm:^1.0.3 || ^2.0.0": version: 2.0.0 resolution: "aproba@npm:2.0.0" @@ -2182,14 +2424,14 @@ __metadata: languageName: node linkType: hard -"axios@npm:^1.6.0": - version: 1.7.4 - resolution: "axios@npm:1.7.4" +"axios@npm:^1.7.4": + version: 1.8.2 + resolution: "axios@npm:1.8.2" dependencies: follow-redirects: "npm:^1.15.6" form-data: "npm:^4.0.0" proxy-from-env: "npm:^1.1.0" - checksum: 10/7a1429be1e3d0c2e1b96d4bba4d113efbfabc7c724bed107beb535c782c7bea447ff634886b0c7c43395a264d085450d009eb1154b5f38a8bae49d469fdcbc61 + checksum: 10/d4328758128d0602cc809a8e7627622cb7839b379eae5e4d6b9d603dd4d5fb89159985630243ec107cf5c675cd8825dba737a319dff9499f3b7688d9a69ec9ed languageName: node linkType: hard @@ -2226,6 +2468,13 @@ __metadata: languageName: node linkType: hard +"binary-extensions@npm:^2.0.0": + version: 2.3.0 + resolution: "binary-extensions@npm:2.3.0" + checksum: 10/bcad01494e8a9283abf18c1b967af65ee79b0c6a9e6fcfafebfe91dbe6e0fc7272bafb73389e198b310516ae04f7ad17d79aacf6cb4c0d5d5202a7e2e52c7d98 + languageName: node + linkType: hard + "bl@npm:^4.0.3, bl@npm:^4.1.0": version: 4.1.0 resolution: "bl@npm:4.1.0" @@ -2256,7 +2505,7 @@ __metadata: languageName: node linkType: hard -"braces@npm:^3.0.3": +"braces@npm:^3.0.3, braces@npm:~3.0.2": version: 3.0.3 resolution: "braces@npm:3.0.3" dependencies: @@ -2265,17 +2514,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.23.0": - version: 4.23.0 - resolution: "browserslist@npm:4.23.0" +"browserslist@npm:^4.24.4": + version: 4.24.4 + resolution: "browserslist@npm:4.24.4" dependencies: - caniuse-lite: "npm:^1.0.30001587" - electron-to-chromium: "npm:^1.4.668" - node-releases: "npm:^2.0.14" - update-browserslist-db: "npm:^1.0.13" + caniuse-lite: "npm:^1.0.30001688" + electron-to-chromium: "npm:^1.5.73" + node-releases: "npm:^2.0.19" + update-browserslist-db: "npm:^1.1.1" bin: browserslist: cli.js - checksum: 10/496c3862df74565dd942b4ae65f502c575cbeba1fa4a3894dad7aa3b16130dc3033bc502d8848147f7b625154a284708253d9598bcdbef5a1e34cf11dc7bad8e + checksum: 10/11fda105e803d891311a21a1f962d83599319165faf471c2d70e045dff82a12128f5b50b1fcba665a2352ad66147aaa248a9d2355a80aadc3f53375eb3de2e48 languageName: node linkType: hard @@ -2296,19 +2545,10 @@ __metadata: languageName: node linkType: hard -"builtin-modules@npm:^3.3.0": - version: 3.3.0 - resolution: "builtin-modules@npm:3.3.0" - checksum: 10/62e063ab40c0c1efccbfa9ffa31873e4f9d57408cb396a2649981a0ecbce56aabc93c28feaccbc5658c95aab2703ad1d11980e62ec2e5e72637404e1eb60f39e - languageName: node - linkType: hard - -"builtins@npm:^5.0.0": - version: 5.0.1 - resolution: "builtins@npm:5.0.1" - dependencies: - semver: "npm:^7.0.0" - checksum: 10/90136fa0ba98b7a3aea33190b1262a5297164731efb6a323b0231acf60cc2ea0b2b1075dbf107038266b8b77d6045fa9631d1c3f90efc1c594ba61218fbfbb4c +"builtin-modules@npm:^4.0.0": + version: 4.0.0 + resolution: "builtin-modules@npm:4.0.0" + checksum: 10/cea28dd8fa3060d39bee0f3e9f141987ac99d2dd7913c2fa15eb34a98372399f3be3b1bf1f849790ecad602d52e57d45a9c54bcde28c0bbf25bfe947ca8ffe55 languageName: node linkType: hard @@ -2346,27 +2586,7 @@ __metadata: languageName: node linkType: hard -"cacache@npm:^18.0.0": - version: 18.0.2 - resolution: "cacache@npm:18.0.2" - dependencies: - "@npmcli/fs": "npm:^3.1.0" - fs-minipass: "npm:^3.0.0" - glob: "npm:^10.2.2" - lru-cache: "npm:^10.0.1" - minipass: "npm:^7.0.3" - minipass-collect: "npm:^2.0.1" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - p-map: "npm:^4.0.0" - ssri: "npm:^10.0.0" - tar: "npm:^6.1.11" - unique-filename: "npm:^3.0.0" - checksum: 10/5ca58464f785d4d64ac2019fcad95451c8c89bea25949f63acd8987fcc3493eaef1beccc0fa39e673506d879d3fc1ab420760f8a14f8ddf46ea2d121805a5e96 - languageName: node - linkType: hard - -"cacache@npm:^18.0.3": +"cacache@npm:^18.0.0, cacache@npm:^18.0.3": version: 18.0.3 resolution: "cacache@npm:18.0.3" dependencies: @@ -2411,23 +2631,23 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001587": - version: 1.0.30001617 - resolution: "caniuse-lite@npm:1.0.30001617" - checksum: 10/eac442b9ad12801086be19f6dc17056827fe398f1c05983357e2531c8183ee890ffc8fb973d54519ad7114a2fd47de8f33ec66d98565b995fef1c6ba02b5bc5b +"caniuse-lite@npm:^1.0.30001688": + version: 1.0.30001701 + resolution: "caniuse-lite@npm:1.0.30001701" + checksum: 10/d121607a96f9165128203a317d6aee6a4c7808d52a1f3b46ef5fb918abe9e9d4463e57b0bd5ffe2f4316292bd5b8d85a832b4456b7ca6f024f377b498911bfec languageName: node linkType: hard -"chai@npm:^5.1.1": - version: 5.1.1 - resolution: "chai@npm:5.1.1" +"chai@npm:^5.2.0": + version: 5.2.0 + resolution: "chai@npm:5.2.0" dependencies: assertion-error: "npm:^2.0.1" check-error: "npm:^2.1.1" deep-eql: "npm:^5.0.1" loupe: "npm:^3.1.0" pathval: "npm:^2.0.0" - checksum: 10/ee67279a5613bd36dc1dc13660042429ae2f1dc5a9030a6abcf381345866dfb5bce7bc10b9d74c8de86b6f656489f654bbbef3f3361e06925591e6a00c72afff + checksum: 10/2ce03671c159c6a567bf1912756daabdbb7c075f3c0078f1b59d61da8d276936367ee696dfe093b49e1479d9ba93a6074c8e55d49791dddd8061728cdcad249e languageName: node linkType: hard @@ -2462,7 +2682,7 @@ __metadata: languageName: node linkType: hard -"chalk@npm:^5.3.0, chalk@npm:~5.3.0": +"chalk@npm:^5.3.0": version: 5.3.0 resolution: "chalk@npm:5.3.0" checksum: 10/6373caaab21bd64c405bfc4bd9672b145647fc9482657b5ea1d549b3b2765054e9d3d928870cdf764fb4aad67555f5061538ff247b8310f110c5c888d92397ea @@ -2490,6 +2710,25 @@ __metadata: languageName: node linkType: hard +"chokidar@npm:^3.6.0": + version: 3.6.0 + resolution: "chokidar@npm:3.6.0" + dependencies: + anymatch: "npm:~3.1.2" + braces: "npm:~3.0.2" + fsevents: "npm:~2.3.2" + glob-parent: "npm:~5.1.2" + is-binary-path: "npm:~2.1.0" + is-glob: "npm:~4.0.1" + normalize-path: "npm:~3.0.0" + readdirp: "npm:~3.6.0" + dependenciesMeta: + fsevents: + optional: true + checksum: 10/c327fb07704443f8d15f7b4a7ce93b2f0bc0e6cea07ec28a7570aa22cd51fcf0379df589403976ea956c369f25aa82d84561947e227cd925902e1751371658df + languageName: node + linkType: hard + "chownr@npm:^2.0.0": version: 2.0.0 resolution: "chownr@npm:2.0.0" @@ -2511,6 +2750,20 @@ __metadata: languageName: node linkType: hard +"ci-info@npm:^4.1.0": + version: 4.1.0 + resolution: "ci-info@npm:4.1.0" + checksum: 10/546628efd04e37da3182a58b6995a3313deb86ec7c8112e22ffb644317a61296b89bbfa128219e5bfcce43d9613a434ed89907ed8e752db947f7291e0405125f + languageName: node + linkType: hard + +"cjs-module-lexer@npm:^1.2.3": + version: 1.4.1 + resolution: "cjs-module-lexer@npm:1.4.1" + checksum: 10/6e830a1e00a34d416949bbc1924f3e8da65cef4a6a09e2b7fa35722e2d1c34bf378d3baca987b698d1cbc3eb83e44b044039b4e82755c96f30e0f03d1d227637 + languageName: node + linkType: hard + "clean-regexp@npm:^1.0.0": version: 1.0.0 resolution: "clean-regexp@npm:1.0.0" @@ -2536,15 +2789,6 @@ __metadata: languageName: node linkType: hard -"cli-cursor@npm:^5.0.0": - version: 5.0.0 - resolution: "cli-cursor@npm:5.0.0" - dependencies: - restore-cursor: "npm:^5.0.0" - checksum: 10/1eb9a3f878b31addfe8d82c6d915ec2330cec8447ab1f117f4aa34f0137fbb3137ec3466e1c9a65bcb7557f6e486d343f2da57f253a2f668d691372dfa15c090 - languageName: node - linkType: hard - "cli-highlight@npm:^2.1.11": version: 2.1.11 resolution: "cli-highlight@npm:2.1.11" @@ -2568,27 +2812,14 @@ __metadata: languageName: node linkType: hard -"cli-spinners@npm:^2.5.0, cli-spinners@npm:^2.9.2": +"cli-spinners@npm:^2.5.0": version: 2.9.2 resolution: "cli-spinners@npm:2.9.2" checksum: 10/a0a863f442df35ed7294424f5491fa1756bd8d2e4ff0c8736531d886cec0ece4d85e8663b77a5afaf1d296e3cbbebff92e2e99f52bbea89b667cbe789b994794 languageName: node linkType: hard -"cli-table3@npm:^0.6.3": - version: 0.6.3 - resolution: "cli-table3@npm:0.6.3" - dependencies: - "@colors/colors": "npm:1.5.0" - string-width: "npm:^4.2.0" - dependenciesMeta: - "@colors/colors": - optional: true - checksum: 10/8d82b75be7edc7febb1283dc49582a521536527cba80af62a2e4522a0ee39c252886a1a2f02d05ae9d753204dbcffeb3a40d1358ee10dccd7fe8d935cfad3f85 - languageName: node - linkType: hard - -"cli-table3@npm:^0.6.5": +"cli-table3@npm:^0.6.3, cli-table3@npm:^0.6.5": version: 0.6.5 resolution: "cli-table3@npm:0.6.5" dependencies: @@ -2601,16 +2832,6 @@ __metadata: languageName: node linkType: hard -"cli-truncate@npm:^4.0.0": - version: 4.0.0 - resolution: "cli-truncate@npm:4.0.0" - dependencies: - slice-ansi: "npm:^5.0.0" - string-width: "npm:^7.0.0" - checksum: 10/d5149175fd25ca985731bdeec46a55ec237475cf74c1a5e103baea696aceb45e372ac4acbaabf1316f06bd62e348123060f8191ffadfeedebd2a70a2a7fb199d - languageName: node - linkType: hard - "cli-width@npm:^3.0.0": version: 3.0.0 resolution: "cli-width@npm:3.0.0" @@ -2713,13 +2934,6 @@ __metadata: languageName: node linkType: hard -"colorette@npm:^2.0.20": - version: 2.0.20 - resolution: "colorette@npm:2.0.20" - checksum: 10/0b8de48bfa5d10afc160b8eaa2b9938f34a892530b2f7d7897e0458d9535a066e3998b49da9d21161c78225b272df19ae3a64d6df28b4c9734c0e55bbd02406f - languageName: node - linkType: hard - "columnify@npm:1.6.0": version: 1.6.0 resolution: "columnify@npm:1.6.0" @@ -2746,13 +2960,6 @@ __metadata: languageName: node linkType: hard -"commander@npm:~12.1.0": - version: 12.1.0 - resolution: "commander@npm:12.1.0" - checksum: 10/cdaeb672d979816853a4eed7f1310a9319e8b976172485c2a6b437ed0db0a389a44cfb222bfbde772781efa9f215bdd1b936f80d6b249485b465c6cb906e1f93 - languageName: node - linkType: hard - "common-ancestor-path@npm:^1.0.1": version: 1.0.1 resolution: "common-ancestor-path@npm:1.0.1" @@ -2889,12 +3096,12 @@ __metadata: languageName: node linkType: hard -"core-js-compat@npm:^3.37.0": - version: 3.37.0 - resolution: "core-js-compat@npm:3.37.0" +"core-js-compat@npm:^3.40.0": + version: 3.41.0 + resolution: "core-js-compat@npm:3.41.0" dependencies: - browserslist: "npm:^4.23.0" - checksum: 10/5f33d7ba45acc9ceb45544d844090edfd14e46a64c2424df24084347405182c1156588cc3a877fc580c005a0b13b8a1af26bb6c73fe73f22eede89b5483b482d + browserslist: "npm:^4.24.4" + checksum: 10/a59da111fc437cc7ed1a1448dae6883617cabebd7731433d27ad75e0ff77df5f411204979bd8eb5668d2600f99db46eedf6f87e123109b6de728bef489d4229a languageName: node linkType: hard @@ -2905,15 +3112,20 @@ __metadata: languageName: node linkType: hard -"cosmiconfig@npm:^8.2.0": - version: 8.2.0 - resolution: "cosmiconfig@npm:8.2.0" +"cosmiconfig@npm:9.0.0": + version: 9.0.0 + resolution: "cosmiconfig@npm:9.0.0" dependencies: - import-fresh: "npm:^3.2.1" + env-paths: "npm:^2.2.1" + import-fresh: "npm:^3.3.0" js-yaml: "npm:^4.1.0" - parse-json: "npm:^5.0.0" - path-type: "npm:^4.0.0" - checksum: 10/e0b188f9a672ee7135851bf9d9fc8f0ba00f9769c95fda5af0ebc274804f6aeb713b753e04e706f595e1fbd0fa67c5073840666019068c0296a06057560ab39d + parse-json: "npm:^5.2.0" + peerDependencies: + typescript: ">=4.9.5" + peerDependenciesMeta: + typescript: + optional: true + checksum: 10/8bdf1dfbb6fdb3755195b6886dc0649a3c742ec75afa4cb8da7b070936aed22a4f4e5b7359faafe03180358f311dbc300d248fd6586c458203d376a40cc77826 languageName: node linkType: hard @@ -2924,14 +3136,14 @@ __metadata: languageName: node linkType: hard -"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.2, cross-spawn@npm:^7.0.3": - version: 7.0.3 - resolution: "cross-spawn@npm:7.0.3" +"cross-spawn@npm:^7.0.0, cross-spawn@npm:^7.0.3, cross-spawn@npm:^7.0.6": + version: 7.0.6 + resolution: "cross-spawn@npm:7.0.6" dependencies: path-key: "npm:^3.1.0" shebang-command: "npm:^2.0.0" which: "npm:^2.0.1" - checksum: 10/e1a13869d2f57d974de0d9ef7acbf69dc6937db20b918525a01dacb5032129bd552d290d886d981e99f1b624cb03657084cc87bd40f115c07ecf376821c729ce + checksum: 10/0d52657d7ae36eb130999dffff1168ec348687b48dd38e2ff59992ed916c88d328cf1d07ff4a4a10bc78de5e1c23f04b306d569e42f7a2293915c081e4dfee86 languageName: node linkType: hard @@ -2958,27 +3170,15 @@ __metadata: languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.3.5": - version: 4.3.5 - resolution: "debug@npm:4.3.5" - dependencies: - ms: "npm:2.1.2" - peerDependenciesMeta: - supports-color: - optional: true - checksum: 10/cb6eab424c410e07813ca1392888589972ce9a32b8829c6508f5e1f25f3c3e70a76731610ae55b4bbe58d1a2fffa1424b30e97fa8d394e49cd2656a9643aedd2 - languageName: node - linkType: hard - -"debug@npm:~4.3.6": - version: 4.3.6 - resolution: "debug@npm:4.3.6" +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4, debug@npm:^4.4.0": + version: 4.4.0 + resolution: "debug@npm:4.4.0" dependencies: - ms: "npm:2.1.2" + ms: "npm:^2.1.3" peerDependenciesMeta: supports-color: optional: true - checksum: 10/d3adb9af7d57a9e809a68f404490cf776122acca16e6359a2702c0f462e510e91f9765c07f707b8ab0d91e03bad57328f3256f5082631cefb5393d0394d50fb7 + checksum: 10/1847944c2e3c2c732514b93d11886575625686056cd765336212dc15de2d2b29612b6cd80e1afba767bb8e1803b778caf9973e98169ef1a24a7a7009e1820367 languageName: node linkType: hard @@ -3108,17 +3308,19 @@ __metadata: languageName: node linkType: hard -"dotenv-expand@npm:~10.0.0": - version: 10.0.0 - resolution: "dotenv-expand@npm:10.0.0" - checksum: 10/b41eb278bc96b92cbf3037ca5f3d21e8845bf165dc06b6f9a0a03d278c2bd5a01c0cfbb3528ae3a60301ba1a8a9cace30e748c54b460753bc00d4c014b675597 +"dotenv-expand@npm:~11.0.6": + version: 11.0.6 + resolution: "dotenv-expand@npm:11.0.6" + dependencies: + dotenv: "npm:^16.4.4" + checksum: 10/8912aba44c024982449c14a701455f84a65af8db38c58977d9952b73d1741952a1ef950e72e5fb9201cc3ab231b593dc9d5c5293c9154794dbaa33c900faceb4 languageName: node linkType: hard -"dotenv@npm:~16.3.1": - version: 16.3.1 - resolution: "dotenv@npm:16.3.1" - checksum: 10/dbb778237ef8750e9e3cd1473d3c8eaa9cc3600e33a75c0e36415d0fa0848197f56c3800f77924c70e7828f0b03896818cd52f785b07b9ad4d88dba73fbba83f +"dotenv@npm:^16.4.4, dotenv@npm:~16.4.5": + version: 16.4.5 + resolution: "dotenv@npm:16.4.5" + checksum: 10/55a3134601115194ae0f924e54473459ed0d9fc340ae610b676e248cca45aa7c680d86365318ea964e6da4e2ea80c4514c1adab5adb43d6867fb57ff068f95c8 languageName: node linkType: hard @@ -3147,17 +3349,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.668": - version: 1.4.763 - resolution: "electron-to-chromium@npm:1.4.763" - checksum: 10/088c53acfe4723d40077a9fd98cc67e74af2c8d0c5c12e75ffddacfd6e98c009c75fff07e3443a3dc499f599a71b7cf0bcbfb1b0c574355436d297c88979056b - languageName: node - linkType: hard - -"emoji-regex@npm:^10.3.0": - version: 10.3.0 - resolution: "emoji-regex@npm:10.3.0" - checksum: 10/b9b084ebe904f13bb4b66ee4c29fb41a7a4a1165adcc33c1ce8056c0194b882cc91ebdc782f1a779b5d7ea7375c5064643a7734893d7c657b44c5c6b9d7bf1e7 +"electron-to-chromium@npm:^1.5.73": + version: 1.5.109 + resolution: "electron-to-chromium@npm:1.5.109" + checksum: 10/4f6bd5963a2a55cbff97b2374cb0dbd6141f85e5cf8cb07267d91b0e56f3a4c8df72a7be905ddb1770b9277deef207567e97f94b9385c7cba3775620af17a932 languageName: node linkType: hard @@ -3200,13 +3395,13 @@ __metadata: languageName: node linkType: hard -"enhanced-resolve@npm:^5.17.0": - version: 5.17.0 - resolution: "enhanced-resolve@npm:5.17.0" +"enhanced-resolve@npm:^5.17.1": + version: 5.17.1 + resolution: "enhanced-resolve@npm:5.17.1" dependencies: graceful-fs: "npm:^4.2.4" tapable: "npm:^2.2.0" - checksum: 10/8f7bf71537d78e7d20a27363793f2c9e13ec44800c7c7830364a448f80a44994aa19d64beecefa1ab49e4de6f7fbe18cc0931dc449c115f02918ff5fcbe7705f + checksum: 10/e8e03cb7a4bf3c0250a89afbd29e5ec20e90ba5fcd026066232a0754864d7d0a393fa6fc0e5379314a6529165a1834b36731147080714459d98924520410d8f5 languageName: node linkType: hard @@ -3219,7 +3414,7 @@ __metadata: languageName: node linkType: hard -"env-paths@npm:^2.2.0": +"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1": version: 2.2.1 resolution: "env-paths@npm:2.2.1" checksum: 10/65b5df55a8bab92229ab2b40dad3b387fad24613263d103a97f91c9fe43ceb21965cd3392b1ccb5d77088021e525c4e0481adb309625d0cb94ade1d1fb8dc17e @@ -3258,33 +3453,42 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.20.1": - version: 0.20.2 - resolution: "esbuild@npm:0.20.2" - dependencies: - "@esbuild/aix-ppc64": "npm:0.20.2" - "@esbuild/android-arm": "npm:0.20.2" - "@esbuild/android-arm64": "npm:0.20.2" - "@esbuild/android-x64": "npm:0.20.2" - "@esbuild/darwin-arm64": "npm:0.20.2" - "@esbuild/darwin-x64": "npm:0.20.2" - "@esbuild/freebsd-arm64": "npm:0.20.2" - "@esbuild/freebsd-x64": "npm:0.20.2" - "@esbuild/linux-arm": "npm:0.20.2" - "@esbuild/linux-arm64": "npm:0.20.2" - "@esbuild/linux-ia32": "npm:0.20.2" - "@esbuild/linux-loong64": "npm:0.20.2" - "@esbuild/linux-mips64el": "npm:0.20.2" - "@esbuild/linux-ppc64": "npm:0.20.2" - "@esbuild/linux-riscv64": "npm:0.20.2" - "@esbuild/linux-s390x": "npm:0.20.2" - "@esbuild/linux-x64": "npm:0.20.2" - "@esbuild/netbsd-x64": "npm:0.20.2" - "@esbuild/openbsd-x64": "npm:0.20.2" - "@esbuild/sunos-x64": "npm:0.20.2" - "@esbuild/win32-arm64": "npm:0.20.2" - "@esbuild/win32-ia32": "npm:0.20.2" - "@esbuild/win32-x64": "npm:0.20.2" +"es-module-lexer@npm:^1.6.0": + version: 1.6.0 + resolution: "es-module-lexer@npm:1.6.0" + checksum: 10/807ee7020cc46a9c970c78cad1f2f3fc139877e5ebad7f66dbfbb124d451189ba1c48c1c632bd5f8ce1b8af2caef3fca340ba044a410fa890d17b080a59024bb + languageName: node + linkType: hard + +"esbuild@npm:^0.24.2": + version: 0.24.2 + resolution: "esbuild@npm:0.24.2" + dependencies: + "@esbuild/aix-ppc64": "npm:0.24.2" + "@esbuild/android-arm": "npm:0.24.2" + "@esbuild/android-arm64": "npm:0.24.2" + "@esbuild/android-x64": "npm:0.24.2" + "@esbuild/darwin-arm64": "npm:0.24.2" + "@esbuild/darwin-x64": "npm:0.24.2" + "@esbuild/freebsd-arm64": "npm:0.24.2" + "@esbuild/freebsd-x64": "npm:0.24.2" + "@esbuild/linux-arm": "npm:0.24.2" + "@esbuild/linux-arm64": "npm:0.24.2" + "@esbuild/linux-ia32": "npm:0.24.2" + "@esbuild/linux-loong64": "npm:0.24.2" + "@esbuild/linux-mips64el": "npm:0.24.2" + "@esbuild/linux-ppc64": "npm:0.24.2" + "@esbuild/linux-riscv64": "npm:0.24.2" + "@esbuild/linux-s390x": "npm:0.24.2" + "@esbuild/linux-x64": "npm:0.24.2" + "@esbuild/netbsd-arm64": "npm:0.24.2" + "@esbuild/netbsd-x64": "npm:0.24.2" + "@esbuild/openbsd-arm64": "npm:0.24.2" + "@esbuild/openbsd-x64": "npm:0.24.2" + "@esbuild/sunos-x64": "npm:0.24.2" + "@esbuild/win32-arm64": "npm:0.24.2" + "@esbuild/win32-ia32": "npm:0.24.2" + "@esbuild/win32-x64": "npm:0.24.2" dependenciesMeta: "@esbuild/aix-ppc64": optional: true @@ -3320,8 +3524,12 @@ __metadata: optional: true "@esbuild/linux-x64": optional: true + "@esbuild/netbsd-arm64": + optional: true "@esbuild/netbsd-x64": optional: true + "@esbuild/openbsd-arm64": + optional: true "@esbuild/openbsd-x64": optional: true "@esbuild/sunos-x64": @@ -3334,14 +3542,14 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 10/663215ab7e599651e00d61b528a63136e1f1d397db8b9c3712540af928c9476d61da95aefa81b7a8dfc7a9fdd7616fcf08395c27be68be8c99953fb461863ce4 + checksum: 10/95425071c9f24ff88bf61e0710b636ec0eb24ddf8bd1f7e1edef3044e1221104bbfa7bbb31c18018c8c36fa7902c5c0b843f829b981ebc89160cf5eebdaa58f4 languageName: node linkType: hard -"escalade@npm:^3.1.1": - version: 3.1.1 - resolution: "escalade@npm:3.1.1" - checksum: 10/afa618e73362576b63f6ca83c975456621095a1ed42ff068174e3f5cea48afc422814dda548c96e6ebb5333e7265140c7292abcc81bbd6ccb1757d50d3a4e182 +"escalade@npm:^3.1.1, escalade@npm:^3.2.0": + version: 3.2.0 + resolution: "escalade@npm:3.2.0" + checksum: 10/9d7169e3965b2f9ae46971afa392f6e5a25545ea30f2e2dd99c9b0a95a3f52b5653681a84f5b2911a413ddad2d7a93d3514165072f349b5ffc59c75a899970d6 languageName: node linkType: hard @@ -3359,60 +3567,62 @@ __metadata: languageName: node linkType: hard -"eslint-compat-utils@npm:^0.1.2": - version: 0.1.2 - resolution: "eslint-compat-utils@npm:0.1.2" +"eslint-compat-utils@npm:^0.5.1": + version: 0.5.1 + resolution: "eslint-compat-utils@npm:0.5.1" + dependencies: + semver: "npm:^7.5.4" peerDependencies: eslint: ">=6.0.0" - checksum: 10/8c273889485ab863f2b6089c36f042dd2d9bf65d219fa256c1991f9466ea8261f3ab753a017a6d8e93bec84abd568fe3e10216f3fda5b41d05e3dce3b2a5e514 + checksum: 10/ac65ac1c6107cf19f63f5fc17cea361c9cb1336be7356f23dbb0fac10979974b4622e13e950be43cbf431801f2c07f7dab448573181ccf6edc0b86d5b5304511 languageName: node linkType: hard -"eslint-config-prettier@npm:^9.1.0": - version: 9.1.0 - resolution: "eslint-config-prettier@npm:9.1.0" +"eslint-config-prettier@npm:^10.1.1": + version: 10.1.1 + resolution: "eslint-config-prettier@npm:10.1.1" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 10/411e3b3b1c7aa04e3e0f20d561271b3b909014956c4dba51c878bf1a23dbb8c800a3be235c46c4732c70827276e540b6eed4636d9b09b444fd0a8e07f0fcd830 + checksum: 10/e78e195a4f19e0de9bf655648bb3433877d6a5368537f1b1049976b74180844a00dd7c1ba3144e3da6e8b6864f8dcdfcda6c7338a537883fcf5b212ef6dcd0e0 languageName: node linkType: hard -"eslint-plugin-es-x@npm:^7.5.0": - version: 7.5.0 - resolution: "eslint-plugin-es-x@npm:7.5.0" +"eslint-plugin-es-x@npm:^7.8.0": + version: 7.8.0 + resolution: "eslint-plugin-es-x@npm:7.8.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.1.2" - "@eslint-community/regexpp": "npm:^4.6.0" - eslint-compat-utils: "npm:^0.1.2" + "@eslint-community/regexpp": "npm:^4.11.0" + eslint-compat-utils: "npm:^0.5.1" peerDependencies: eslint: ">=8" - checksum: 10/b0aa59e5a9fe034d6d485969091abfcdc6893bc0b9b145864d29307b03465141cc073bed806d9cb1a343a561362f2d0e9b34526af8fe8b7ca3cd8aa144f3720a + checksum: 10/1df8d52c4fadc06854ce801af05b05f2642aa2deb918fb7d37738596eabd70b7f21a22b150b78ec9104bac6a1b6b4fb796adea2364ede91b01d20964849ce5f7 languageName: node linkType: hard -"eslint-plugin-n@npm:^17.10.2": - version: 17.10.2 - resolution: "eslint-plugin-n@npm:17.10.2" +"eslint-plugin-n@npm:^17.16.2": + version: 17.16.2 + resolution: "eslint-plugin-n@npm:17.16.2" dependencies: - "@eslint-community/eslint-utils": "npm:^4.4.0" - enhanced-resolve: "npm:^5.17.0" - eslint-plugin-es-x: "npm:^7.5.0" - get-tsconfig: "npm:^4.7.0" - globals: "npm:^15.8.0" - ignore: "npm:^5.2.4" + "@eslint-community/eslint-utils": "npm:^4.4.1" + enhanced-resolve: "npm:^5.17.1" + eslint-plugin-es-x: "npm:^7.8.0" + get-tsconfig: "npm:^4.8.1" + globals: "npm:^15.11.0" + ignore: "npm:^5.3.2" minimatch: "npm:^9.0.5" - semver: "npm:^7.5.3" + semver: "npm:^7.6.3" peerDependencies: eslint: ">=8.23.0" - checksum: 10/c360e745b63d0dffddcd040cd6907bb50d259b5d92e9f4b71b98d9dcbc592d818885b6938956657bdad5bd076a7658c66daac164ed9e7d5abacb25ffc5de971b + checksum: 10/84bc5957f50ac7f867fc44d6b37659a705f0e19c25f656023254b33bdd5db8a2c382e2a161d8443494d04f228f2b73f54ae7fe581005e59cfec51a3b0d4a7b20 languageName: node linkType: hard -"eslint-plugin-prettier@npm:^5.2.1": - version: 5.2.1 - resolution: "eslint-plugin-prettier@npm:5.2.1" +"eslint-plugin-prettier@npm:^5.2.3": + version: 5.2.3 + resolution: "eslint-plugin-prettier@npm:5.2.3" dependencies: prettier-linter-helpers: "npm:^1.0.0" synckit: "npm:^0.9.1" @@ -3426,80 +3636,85 @@ __metadata: optional: true eslint-config-prettier: optional: true - checksum: 10/10ddf68215237e327af09a47adab4c63f3885fda4fb28c4c42d1fc5f47d8a0cc45df6484799360ff1417a0aa3c77c3aaac49d7e9dfd145557b17e2d7ecc2a27c + checksum: 10/6444a0b89f3e2a6b38adce69761133f8539487d797f1655b3fa24f93a398be132c4f68f87041a14740b79202368d5782aa1dffd2bd7a3ea659f263d6796acf15 languageName: node linkType: hard -"eslint-plugin-unicorn@npm:^55.0.0": - version: 55.0.0 - resolution: "eslint-plugin-unicorn@npm:55.0.0" +"eslint-plugin-unicorn@npm:^57.0.0": + version: 57.0.0 + resolution: "eslint-plugin-unicorn@npm:57.0.0" dependencies: - "@babel/helper-validator-identifier": "npm:^7.24.5" - "@eslint-community/eslint-utils": "npm:^4.4.0" - ci-info: "npm:^4.0.0" + "@babel/helper-validator-identifier": "npm:^7.25.9" + "@eslint-community/eslint-utils": "npm:^4.4.1" + ci-info: "npm:^4.1.0" clean-regexp: "npm:^1.0.0" - core-js-compat: "npm:^3.37.0" - esquery: "npm:^1.5.0" - globals: "npm:^15.7.0" - indent-string: "npm:^4.0.0" - is-builtin-module: "npm:^3.2.1" - jsesc: "npm:^3.0.2" + core-js-compat: "npm:^3.40.0" + esquery: "npm:^1.6.0" + globals: "npm:^15.15.0" + indent-string: "npm:^5.0.0" + is-builtin-module: "npm:^4.0.0" + jsesc: "npm:^3.1.0" pluralize: "npm:^8.0.0" - read-pkg-up: "npm:^7.0.1" + read-package-up: "npm:^11.0.0" regexp-tree: "npm:^0.1.27" - regjsparser: "npm:^0.10.0" - semver: "npm:^7.6.1" - strip-indent: "npm:^3.0.0" + regjsparser: "npm:^0.12.0" + semver: "npm:^7.7.1" + strip-indent: "npm:^4.0.0" peerDependencies: - eslint: ">=8.56.0" - checksum: 10/ea2fe55c517e18a8abedee125492ba09b11695fe41a3f42bf7b6789e9c937c89e8692735b07dcd41e25aff849950da2cca76ac6b727996e6bd2a978c8dc2685f + eslint: ">=9.20.0" + checksum: 10/056dcca3ce4f89314bff2d4dcbe4124398e3cb99f315416ea6944c69e5673551f20812d440d5614a11fca0da825d06fb98a870de9a74de2a4f404dcde88d4553 languageName: node linkType: hard -"eslint-scope@npm:^8.0.2": - version: 8.0.2 - resolution: "eslint-scope@npm:8.0.2" +"eslint-scope@npm:^8.3.0": + version: 8.3.0 + resolution: "eslint-scope@npm:8.3.0" dependencies: esrecurse: "npm:^4.3.0" estraverse: "npm:^5.2.0" - checksum: 10/d17c2e1ff4d3a98911414a954531078db912e2747d6da8ea4cafd16d0526e32086c676ce9aeaffb3ca0ff695fc951ac3169d7f08a0b42962db683dff126cc95b + checksum: 10/ee1ff009e949423639a8b53453c0cb189967d9142c5d94dc3752bed9880140a0760007148ac6b0bd03557d70ede9cd7c3b1e66f9a7f3427b2dbeca2a5be22c91 languageName: node linkType: hard -"eslint-visitor-keys@npm:^3.3.0, eslint-visitor-keys@npm:^3.4.3": +"eslint-visitor-keys@npm:^3.4.3": version: 3.4.3 resolution: "eslint-visitor-keys@npm:3.4.3" checksum: 10/3f357c554a9ea794b094a09bd4187e5eacd1bc0d0653c3adeb87962c548e6a1ab8f982b86963ae1337f5d976004146536dcee5d0e2806665b193fbfbf1a9231b languageName: node linkType: hard -"eslint-visitor-keys@npm:^4.0.0": - version: 4.0.0 - resolution: "eslint-visitor-keys@npm:4.0.0" - checksum: 10/c7617166e6291a15ce2982b5c4b9cdfb6409f5c14562712d12e2584480cdf18609694b21d7dad35b02df0fa2cd037505048ded54d2f405c64f600949564eb334 +"eslint-visitor-keys@npm:^4.2.0": + version: 4.2.0 + resolution: "eslint-visitor-keys@npm:4.2.0" + checksum: 10/9651b3356b01760e586b4c631c5268c0e1a85236e3292bf754f0472f465bf9a856c0ddc261fceace155334118c0151778effafbab981413dbf9288349343fa25 languageName: node linkType: hard -"eslint@npm:^9.9.1": - version: 9.9.1 - resolution: "eslint@npm:9.9.1" +"eslint@npm:^9.22.0": + version: 9.22.0 + resolution: "eslint@npm:9.22.0" dependencies: "@eslint-community/eslint-utils": "npm:^4.2.0" - "@eslint-community/regexpp": "npm:^4.11.0" - "@eslint/config-array": "npm:^0.18.0" - "@eslint/eslintrc": "npm:^3.1.0" - "@eslint/js": "npm:9.9.1" + "@eslint-community/regexpp": "npm:^4.12.1" + "@eslint/config-array": "npm:^0.19.2" + "@eslint/config-helpers": "npm:^0.1.0" + "@eslint/core": "npm:^0.12.0" + "@eslint/eslintrc": "npm:^3.3.0" + "@eslint/js": "npm:9.22.0" + "@eslint/plugin-kit": "npm:^0.2.7" + "@humanfs/node": "npm:^0.16.6" "@humanwhocodes/module-importer": "npm:^1.0.1" - "@humanwhocodes/retry": "npm:^0.3.0" - "@nodelib/fs.walk": "npm:^1.2.8" + "@humanwhocodes/retry": "npm:^0.4.2" + "@types/estree": "npm:^1.0.6" + "@types/json-schema": "npm:^7.0.15" ajv: "npm:^6.12.4" chalk: "npm:^4.0.0" - cross-spawn: "npm:^7.0.2" + cross-spawn: "npm:^7.0.6" debug: "npm:^4.3.2" escape-string-regexp: "npm:^4.0.0" - eslint-scope: "npm:^8.0.2" - eslint-visitor-keys: "npm:^4.0.0" - espree: "npm:^10.1.0" + eslint-scope: "npm:^8.3.0" + eslint-visitor-keys: "npm:^4.2.0" + espree: "npm:^10.3.0" esquery: "npm:^1.5.0" esutils: "npm:^2.0.2" fast-deep-equal: "npm:^3.1.3" @@ -3509,15 +3724,11 @@ __metadata: ignore: "npm:^5.2.0" imurmurhash: "npm:^0.1.4" is-glob: "npm:^4.0.0" - is-path-inside: "npm:^3.0.3" json-stable-stringify-without-jsonify: "npm:^1.0.1" - levn: "npm:^0.4.1" lodash.merge: "npm:^4.6.2" minimatch: "npm:^3.1.2" natural-compare: "npm:^1.4.0" optionator: "npm:^0.9.3" - strip-ansi: "npm:^6.0.1" - text-table: "npm:^0.2.0" peerDependencies: jiti: "*" peerDependenciesMeta: @@ -3525,29 +3736,18 @@ __metadata: optional: true bin: eslint: bin/eslint.js - checksum: 10/d53dcfff396642cc33907b7c4a04536205f8889ae264fe105eea29de571b5923eb9b0bc6fc95b5d30414796cbe180dc93a523e0fdd4f26b2b4b4cf0195969908 - languageName: node - linkType: hard - -"espree@npm:^10.0.1": - version: 10.0.1 - resolution: "espree@npm:10.0.1" - dependencies: - acorn: "npm:^8.11.3" - acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.0.0" - checksum: 10/557d6cfb4894b1489effcaed8702682086033f8a2449568933bc59493734733d750f2a87907ba575844d3933340aea2d84288f5e67020c6152f6fd18a86497b2 + checksum: 10/0a21a46fb4a4d83840d60d7a3689bc1b2f6b3594a92d8fcb08b8d8f8d14be1098fa71d41b3863590af5a74fee847afa0a98d002dbbbe867cdb3b3eced3d7765e languageName: node linkType: hard -"espree@npm:^10.1.0": - version: 10.1.0 - resolution: "espree@npm:10.1.0" +"espree@npm:^10.0.1, espree@npm:^10.3.0": + version: 10.3.0 + resolution: "espree@npm:10.3.0" dependencies: - acorn: "npm:^8.12.0" + acorn: "npm:^8.14.0" acorn-jsx: "npm:^5.3.2" - eslint-visitor-keys: "npm:^4.0.0" - checksum: 10/a673aa39a19a51763d92272f8f3772ae3d4b10624740bb72d5f273b631b43f1a5a32b385c1da6ae6bc10be05a5913bc4679ebd22a09c7b336a745204834806ea + eslint-visitor-keys: "npm:^4.2.0" + checksum: 10/3412d44d4204c9e29d6b5dd0277400cfa0cd68495dc09eae1b9ce79d0c8985c1c5cc09cb9ba32a1cd963f48a49b0c46bdb7736afe395a300aa6bb1c0d86837e8 languageName: node linkType: hard @@ -3561,12 +3761,12 @@ __metadata: languageName: node linkType: hard -"esquery@npm:^1.5.0": - version: 1.5.0 - resolution: "esquery@npm:1.5.0" +"esquery@npm:^1.5.0, esquery@npm:^1.6.0": + version: 1.6.0 + resolution: "esquery@npm:1.6.0" dependencies: estraverse: "npm:^5.1.0" - checksum: 10/e65fcdfc1e0ff5effbf50fb4f31ea20143ae5df92bb2e4953653d8d40aa4bc148e0d06117a592ce4ea53eeab1dafdfded7ea7e22a5be87e82d73757329a1b01d + checksum: 10/c587fb8ec9ed83f2b1bc97cf2f6854cc30bf784a79d62ba08c6e358bf22280d69aee12827521cf38e69ae9761d23fb7fde593ce315610f85655c139d99b05e5a languageName: node linkType: hard @@ -3609,13 +3809,6 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^5.0.1": - version: 5.0.1 - resolution: "eventemitter3@npm:5.0.1" - checksum: 10/ac6423ec31124629c84c7077eed1e6987f6d66c31cf43c6fcbf6c87791d56317ce808d9ead483652436df171b526fc7220eccdc9f3225df334e81582c3cf7dd5 - languageName: node - linkType: hard - "execa@npm:5.0.0": version: 5.0.0 resolution: "execa@npm:5.0.0" @@ -3633,20 +3826,10 @@ __metadata: languageName: node linkType: hard -"execa@npm:^8.0.1, execa@npm:~8.0.1": - version: 8.0.1 - resolution: "execa@npm:8.0.1" - dependencies: - cross-spawn: "npm:^7.0.3" - get-stream: "npm:^8.0.1" - human-signals: "npm:^5.0.0" - is-stream: "npm:^3.0.0" - merge-stream: "npm:^2.0.0" - npm-run-path: "npm:^5.1.0" - onetime: "npm:^6.0.0" - signal-exit: "npm:^4.1.0" - strip-final-newline: "npm:^3.0.0" - checksum: 10/d2ab5fe1e2bb92b9788864d0713f1fce9a07c4594e272c0c97bc18c90569897ab262e4ea58d27a694d288227a2e24f16f5e2575b44224ad9983b799dc7f1098d +"expect-type@npm:^1.1.0": + version: 1.1.0 + resolution: "expect-type@npm:1.1.0" + checksum: 10/05fca80ddc7d493a89361f783c6b000750fa04a8226bc24701f3b90adb0efc2fb467f2a0baaed4015a02d8b9034ef5bb87521df9dba980f50b1105bd596ef833 languageName: node linkType: hard @@ -3682,16 +3865,16 @@ __metadata: languageName: node linkType: hard -"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2": - version: 3.3.2 - resolution: "fast-glob@npm:3.3.2" +"fast-glob@npm:^3.2.9, fast-glob@npm:^3.3.2, fast-glob@npm:^3.3.3": + version: 3.3.3 + resolution: "fast-glob@npm:3.3.3" dependencies: "@nodelib/fs.stat": "npm:^2.0.2" "@nodelib/fs.walk": "npm:^1.2.3" glob-parent: "npm:^5.1.2" merge2: "npm:^1.3.0" - micromatch: "npm:^4.0.4" - checksum: 10/222512e9315a0efca1276af9adb2127f02105d7288fa746145bf45e2716383fb79eb983c89601a72a399a56b7c18d38ce70457c5466218c5f13fad957cee16df + micromatch: "npm:^4.0.8" + checksum: 10/dcc6432b269762dd47381d8b8358bf964d8f4f60286ac6aa41c01ade70bda459ff2001b516690b96d5365f68a49242966112b5d5cc9cd82395fa8f9d017c90ad languageName: node linkType: hard @@ -3718,6 +3901,18 @@ __metadata: languageName: node linkType: hard +"fdir@npm:^6.4.3": + version: 6.4.3 + resolution: "fdir@npm:6.4.3" + peerDependencies: + picomatch: ^3 || ^4 + peerDependenciesMeta: + picomatch: + optional: true + checksum: 10/8e6d20f4590dc168de1374a9cadaa37e20ca6e0b822aa247c230e7ea1d9e9674a68cd816146435e4ecc98f9285091462ab7e5e56eebc9510931a1794e4db68b2 + languageName: node + linkType: hard + "fflate@npm:^0.8.2": version: 0.8.2 resolution: "fflate@npm:0.8.2" @@ -3761,6 +3956,13 @@ __metadata: languageName: node linkType: hard +"find-up-simple@npm:^1.0.0": + version: 1.0.1 + resolution: "find-up-simple@npm:1.0.1" + checksum: 10/6e374bffda9f8425314eab47ef79752b6e77dcc95c0ad17d257aef48c32fe07bbc41bcafbd22941c25bb94fffaaaa8e178d928867d844c58100c7fe19ec82f72 + languageName: node + linkType: hard + "find-up@npm:^2.0.0": version: 2.1.0 resolution: "find-up@npm:2.1.0" @@ -3810,16 +4012,16 @@ __metadata: linkType: hard "flatted@npm:^3.2.9": - version: 3.2.9 - resolution: "flatted@npm:3.2.9" - checksum: 10/dc2b89e46a2ebde487199de5a4fcb79e8c46f984043fea5c41dbf4661eb881fefac1c939b5bdcd8a09d7f960ec364f516970c7ec44e58ff451239c07fd3d419b + version: 3.3.2 + resolution: "flatted@npm:3.3.2" + checksum: 10/ac3c159742e01d0e860a861164bcfd35bb567ccbebb8a0dd041e61cf3c64a435b917dd1e7ed1c380c2ebca85735fb16644485ec33665bc6aafc3b316aa1eed44 languageName: node linkType: hard -"flatted@npm:^3.3.1": - version: 3.3.1 - resolution: "flatted@npm:3.3.1" - checksum: 10/7b8376061d5be6e0d3658bbab8bde587647f68797cf6bfeae9dea0e5137d9f27547ab92aaff3512dd9d1299086a6d61be98e9d48a56d17531b634f77faadbc49 +"flatted@npm:^3.3.3": + version: 3.3.3 + resolution: "flatted@npm:3.3.3" + checksum: 10/8c96c02fbeadcf4e8ffd0fa24983241e27698b0781295622591fc13585e2f226609d95e422bcf2ef044146ffacb6b68b1f20871454eddf75ab3caa6ee5f4a1fe languageName: node linkType: hard @@ -3833,13 +4035,13 @@ __metadata: languageName: node linkType: hard -"foreground-child@npm:^3.1.0": - version: 3.1.1 - resolution: "foreground-child@npm:3.1.1" +"foreground-child@npm:^3.1.0, foreground-child@npm:^3.1.1": + version: 3.3.0 + resolution: "foreground-child@npm:3.3.0" dependencies: cross-spawn: "npm:^7.0.0" signal-exit: "npm:^4.0.1" - checksum: 10/087edd44857d258c4f73ad84cb8df980826569656f2550c341b27adf5335354393eec24ea2fabd43a253233fb27cee177ebe46bd0b7ea129c77e87cb1e9936fb + checksum: 10/e3a60480f3a09b12273ce2c5fcb9514d98dd0e528f58656a1b04680225f918d60a2f81f6a368f2f3b937fcee9cfc0cbf16f1ad9a0bc6a3a6e103a84c9a90087e languageName: node linkType: hard @@ -3854,6 +4056,15 @@ __metadata: languageName: node linkType: hard +"front-matter@npm:^4.0.2": + version: 4.0.2 + resolution: "front-matter@npm:4.0.2" + dependencies: + js-yaml: "npm:^3.13.1" + checksum: 10/8897a831a82c5d35413b02b806ed421e793068ad8bf75e864163ec07b7f0cfd87e2fcce0893e8ceccc8f6c63a46e953a6c01208e573627626867a8b86cf6abb9 + languageName: node + linkType: hard + "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -3861,17 +4072,6 @@ __metadata: languageName: node linkType: hard -"fs-extra@npm:^11.1.0": - version: 11.1.1 - resolution: "fs-extra@npm:11.1.1" - dependencies: - graceful-fs: "npm:^4.2.0" - jsonfile: "npm:^6.0.1" - universalify: "npm:^2.0.0" - checksum: 10/c4e9fabf9762a70d1403316b7faa899f3d3303c8afa765b891c2210fdeba368461e04ae1203920b64ef6a7d066a39ab8cef2160b5ce8d1011bb4368688cd9bb7 - languageName: node - linkType: hard - "fs-extra@npm:^11.2.0": version: 11.2.0 resolution: "fs-extra@npm:11.2.0" @@ -3957,20 +4157,6 @@ __metadata: languageName: node linkType: hard -"get-east-asian-width@npm:^1.0.0": - version: 1.2.0 - resolution: "get-east-asian-width@npm:1.2.0" - checksum: 10/c9b280e7c7c67fb89fa17e867c4a9d1c9f1321aba2a9ee27bff37fb6ca9552bccda328c70a80c1f83a0e39ba1b7e3427e60f47823402d19e7a41b83417ec047a - languageName: node - linkType: hard - -"get-func-name@npm:^2.0.1": - version: 2.0.2 - resolution: "get-func-name@npm:2.0.2" - checksum: 10/3f62f4c23647de9d46e6f76d2b3eafe58933a9b3830c60669e4180d6c601ce1b4aa310ba8366143f55e52b139f992087a9f0647274e8745621fa2af7e0acf13b - languageName: node - linkType: hard - "get-pkg-repo@npm:^4.2.1": version: 4.2.1 resolution: "get-pkg-repo@npm:4.2.1" @@ -4006,19 +4192,12 @@ __metadata: languageName: node linkType: hard -"get-stream@npm:^8.0.1": - version: 8.0.1 - resolution: "get-stream@npm:8.0.1" - checksum: 10/dde5511e2e65a48e9af80fea64aff11b4921b14b6e874c6f8294c50975095af08f41bfb0b680c887f28b566dd6ec2cb2f960f9d36a323359be324ce98b766e9e - languageName: node - linkType: hard - -"get-tsconfig@npm:^4.7.0": - version: 4.7.2 - resolution: "get-tsconfig@npm:4.7.2" +"get-tsconfig@npm:^4.8.1": + version: 4.8.1 + resolution: "get-tsconfig@npm:4.8.1" dependencies: resolve-pkg-maps: "npm:^1.0.0" - checksum: 10/f21135848fb5d16012269b7b34b186af7a41824830f8616aba17a15eb4d9e54fdc876833f1e21768395215a826c8145582f5acd594ae2b4de3284d10b38d20f8 + checksum: 10/3fb5a8ad57b9633eaea085d81661e9e5c9f78b35d8f8689eaf8b8b45a2a3ebf3b3422266d4d7df765e308cc1e6231648d114803ab3d018332e29916f2c1de036 languageName: node linkType: hard @@ -4094,7 +4273,7 @@ __metadata: languageName: node linkType: hard -"glob-parent@npm:^5.1.2": +"glob-parent@npm:^5.1.2, glob-parent@npm:~5.1.2": version: 5.1.2 resolution: "glob-parent@npm:5.1.2" dependencies: @@ -4103,34 +4282,35 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": - version: 10.3.10 - resolution: "glob@npm:10.3.10" +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.4.1": + version: 10.4.5 + resolution: "glob@npm:10.4.5" dependencies: foreground-child: "npm:^3.1.0" - jackspeak: "npm:^2.3.5" - minimatch: "npm:^9.0.1" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - path-scurry: "npm:^1.10.1" + jackspeak: "npm:^3.1.2" + minimatch: "npm:^9.0.4" + minipass: "npm:^7.1.2" + package-json-from-dist: "npm:^1.0.0" + path-scurry: "npm:^1.11.1" bin: glob: dist/esm/bin.mjs - checksum: 10/38bdb2c9ce75eb5ed168f309d4ed05b0798f640b637034800a6bf306f39d35409bf278b0eaaffaec07591085d3acb7184a201eae791468f0f617771c2486a6a8 + checksum: 10/698dfe11828b7efd0514cd11e573eaed26b2dff611f0400907281ce3eab0c1e56143ef9b35adc7c77ecc71fba74717b510c7c223d34ca8a98ec81777b293d4ac languageName: node linkType: hard -"glob@npm:^10.4.1": - version: 10.4.5 - resolution: "glob@npm:10.4.5" +"glob@npm:^11.0.0": + version: 11.0.0 + resolution: "glob@npm:11.0.0" dependencies: foreground-child: "npm:^3.1.0" - jackspeak: "npm:^3.1.2" - minimatch: "npm:^9.0.4" + jackspeak: "npm:^4.0.1" + minimatch: "npm:^10.0.0" minipass: "npm:^7.1.2" package-json-from-dist: "npm:^1.0.0" - path-scurry: "npm:^1.11.1" + path-scurry: "npm:^2.0.0" bin: glob: dist/esm/bin.mjs - checksum: 10/698dfe11828b7efd0514cd11e573eaed26b2dff611f0400907281ce3eab0c1e56143ef9b35adc7c77ecc71fba74717b510c7c223d34ca8a98ec81777b293d4ac + checksum: 10/e66939201d11ae30fe97e3364ac2be5c59d6c9bfce18ac633edfad473eb6b46a7553f6f73658f67caaf6cccc1df1ae336298a45e9021fa5695fd78754cc1603e languageName: node linkType: hard @@ -4167,17 +4347,17 @@ __metadata: languageName: node linkType: hard -"globals@npm:^15.7.0, globals@npm:^15.8.0": - version: 15.8.0 - resolution: "globals@npm:15.8.0" - checksum: 10/fbca69cc1084c28a5155fea06224f6f0fcd9a371d8b8057db9c1851adc4bf2aad8016dd0db4e161e0ad1da0953e4286b90c826ff9ef5dbfb864493f2bba806df +"globals@npm:^15.11.0, globals@npm:^15.15.0": + version: 15.15.0 + resolution: "globals@npm:15.15.0" + checksum: 10/7f561c87b2fd381b27fc2db7df8a4ea7a9bb378667b8a7193e61fd2ca3a876479174e2a303a74345fbea6e1242e16db48915c1fd3bf35adcf4060a795b425e18 languageName: node linkType: hard -"globals@npm:^15.9.0": - version: 15.9.0 - resolution: "globals@npm:15.9.0" - checksum: 10/19bca70131c5d3e0d4171deed0f8ae16adda19f18d39b67421056f1eaa160b4433c3ffc8eb69b8b19adebbbdad4834d8a0494c5fe1ae295f0f769a5c0331d794 +"globals@npm:^16.0.0": + version: 16.0.0 + resolution: "globals@npm:16.0.0" + checksum: 10/aa05d569af9c763d9982e6885f3ac6d21c84cd54c9a12eeace55b3334d0631128f189902d34ae2a924694311f92d700dbd3e8e62e8a9e1094a882f9f8897149a languageName: node linkType: hard @@ -4195,17 +4375,17 @@ __metadata: languageName: node linkType: hard -"globby@npm:^14.0.2": - version: 14.0.2 - resolution: "globby@npm:14.0.2" +"globby@npm:^14.1.0": + version: 14.1.0 + resolution: "globby@npm:14.1.0" dependencies: "@sindresorhus/merge-streams": "npm:^2.1.0" - fast-glob: "npm:^3.3.2" - ignore: "npm:^5.2.4" - path-type: "npm:^5.0.0" + fast-glob: "npm:^3.3.3" + ignore: "npm:^7.0.3" + path-type: "npm:^6.0.0" slash: "npm:^5.1.0" - unicorn-magic: "npm:^0.1.0" - checksum: 10/67660da70fc1223f7170c1a62ba6c373385e9e39765d952b6518606dec15ed8c7958e9dae6ba5752a31dbc1e9126f146938b830ad680fe794141734ffc3fbb75 + unicorn-magic: "npm:^0.3.0" + checksum: 10/e527ff54f0dddf60abfabd0d9e799768619d957feecd8b13ef60481f270bfdce0d28f6b09267c60f8064798fb3003b8ec991375f7fe0233fbce5304e1741368c languageName: node linkType: hard @@ -4301,16 +4481,7 @@ __metadata: languageName: node linkType: hard -"hosted-git-info@npm:^7.0.0": - version: 7.0.1 - resolution: "hosted-git-info@npm:7.0.1" - dependencies: - lru-cache: "npm:^10.0.1" - checksum: 10/5f740ecf3c70838e27446ff433a9a9a583de8747f7b661390b373ad12ca47edb937136e79999a4f953d0953079025a11df173f1fd9f7d52b0277b2fb9433e1c7 - languageName: node - linkType: hard - -"hosted-git-info@npm:^7.0.2": +"hosted-git-info@npm:^7.0.0, hosted-git-info@npm:^7.0.2": version: 7.0.2 resolution: "hosted-git-info@npm:7.0.2" dependencies: @@ -4381,13 +4552,6 @@ __metadata: languageName: node linkType: hard -"human-signals@npm:^5.0.0": - version: 5.0.0 - resolution: "human-signals@npm:5.0.0" - checksum: 10/30f8870d831cdcd2d6ec0486a7d35d49384996742052cee792854273fa9dd9e7d5db06bb7985d4953e337e10714e994e0302e90dc6848069171b05ec836d65b0 - languageName: node - linkType: hard - "humanize-ms@npm:^1.2.1": version: 1.2.1 resolution: "humanize-ms@npm:1.2.1" @@ -4397,12 +4561,12 @@ __metadata: languageName: node linkType: hard -"husky@npm:^9.1.5": - version: 9.1.5 - resolution: "husky@npm:9.1.5" +"husky@npm:^9.1.7": + version: 9.1.7 + resolution: "husky@npm:9.1.7" bin: husky: bin.js - checksum: 10/21a3036dd03141c41347693bde301c62502b4e3bffb87310e7e42b3011c2e55691af2e4a9a5f39bd94e6b1d69e3cfc26ec636d8e164e19737b26f11c556caf10 + checksum: 10/c2412753f15695db369634ba70f50f5c0b7e5cb13b673d0826c411ec1bd9ddef08c1dad89ea154f57da2521d2605bd64308af748749b27d08c5f563bcd89975f languageName: node linkType: hard @@ -4440,14 +4604,21 @@ __metadata: languageName: node linkType: hard -"ignore@npm:^5.0.4, ignore@npm:^5.2.0, ignore@npm:^5.2.4, ignore@npm:^5.3.1": - version: 5.3.1 - resolution: "ignore@npm:5.3.1" - checksum: 10/0a884c2fbc8c316f0b9f92beaf84464253b73230a4d4d286697be45fca081199191ca33e1c2e82d9e5f851f5e9a48a78e25a35c951e7eb41e59f150db3530065 +"ignore@npm:^5.0.4, ignore@npm:^5.2.0, ignore@npm:^5.3.1, ignore@npm:^5.3.2": + version: 5.3.2 + resolution: "ignore@npm:5.3.2" + checksum: 10/cceb6a457000f8f6a50e1196429750d782afce5680dd878aa4221bd79972d68b3a55b4b1458fc682be978f4d3c6a249046aa0880637367216444ab7b014cfc98 + languageName: node + linkType: hard + +"ignore@npm:^7.0.3": + version: 7.0.3 + resolution: "ignore@npm:7.0.3" + checksum: 10/ce5e812af3acd6607a3fe0a9f9b5f01d53f009a5ace8cbf5b6491d05a481b55d65186e6a7eaa13126e93f15276bcf3d1e8d6ff3ce5549c312f9bb313fff33365 languageName: node linkType: hard -"import-fresh@npm:^3.2.1": +"import-fresh@npm:^3.2.1, import-fresh@npm:^3.3.0": version: 3.3.0 resolution: "import-fresh@npm:3.3.0" dependencies: @@ -4483,6 +4654,20 @@ __metadata: languageName: node linkType: hard +"indent-string@npm:^5.0.0": + version: 5.0.0 + resolution: "indent-string@npm:5.0.0" + checksum: 10/e466c27b6373440e6d84fbc19e750219ce25865cb82d578e41a6053d727e5520dc5725217d6eb1cc76005a1bb1696a0f106d84ce7ebda3033b963a38583fb3b3 + languageName: node + linkType: hard + +"index-to-position@npm:^0.1.2": + version: 0.1.2 + resolution: "index-to-position@npm:0.1.2" + checksum: 10/ae8e2304ed7c959bc6d1121712e9f625634ed884e32ef93fc0795c6aab1131b10198929a50c7d16d470dab37be7438eccb0afe021d79f69116273d500898daee + languageName: node + linkType: hard + "inflight@npm:^1.0.4": version: 1.0.6 resolution: "inflight@npm:1.0.6" @@ -4549,13 +4734,22 @@ __metadata: version: 0.0.0-use.local resolution: "inquirer@workspace:packages/inquirer" dependencies: - "@inquirer/prompts": "npm:^5.4.0" - "@inquirer/type": "npm:^1.5.3" + "@arethetypeswrong/cli": "npm:^0.17.4" + "@inquirer/core": "npm:^10.1.9" + "@inquirer/prompts": "npm:^7.4.0" + "@inquirer/type": "npm:^3.0.5" + "@repo/tsconfig": "workspace:*" "@types/mute-stream": "npm:^0.0.4" ansi-escapes: "npm:^4.3.2" - mute-stream: "npm:^1.0.0" + mute-stream: "npm:^2.0.0" run-async: "npm:^3.0.0" - rxjs: "npm:^7.8.1" + rxjs: "npm:^7.8.2" + tshy: "npm:^3.0.2" + peerDependencies: + "@types/node": ">=18" + peerDependenciesMeta: + "@types/node": + optional: true languageName: unknown linkType: soft @@ -4573,12 +4767,21 @@ __metadata: languageName: node linkType: hard -"is-builtin-module@npm:^3.2.1": - version: 3.2.1 - resolution: "is-builtin-module@npm:3.2.1" +"is-binary-path@npm:~2.1.0": + version: 2.1.0 + resolution: "is-binary-path@npm:2.1.0" dependencies: - builtin-modules: "npm:^3.3.0" - checksum: 10/e8f0ffc19a98240bda9c7ada84d846486365af88d14616e737d280d378695c8c448a621dcafc8332dbf0fcd0a17b0763b845400709963fa9151ddffece90ae88 + binary-extensions: "npm:^2.0.0" + checksum: 10/078e51b4f956c2c5fd2b26bb2672c3ccf7e1faff38e0ebdba45612265f4e3d9fc3127a1fa8370bbf09eab61339203c3d3b7af5662cbf8be4030f8fac37745b0e + languageName: node + linkType: hard + +"is-builtin-module@npm:^4.0.0": + version: 4.0.0 + resolution: "is-builtin-module@npm:4.0.0" + dependencies: + builtin-modules: "npm:^4.0.0" + checksum: 10/61e31a8730cc0babfc29af52250178220f4a2cefd23c54f614e5256f0e4e37643f0eb709a92ccfd6ad84732e48e8c4d10cd9d3e29a47197598d5ad2c9c19a765 languageName: node linkType: hard @@ -4593,7 +4796,7 @@ __metadata: languageName: node linkType: hard -"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0, is-core-module@npm:^2.8.1": +"is-core-module@npm:^2.13.0, is-core-module@npm:^2.5.0": version: 2.13.1 resolution: "is-core-module@npm:2.13.1" dependencies: @@ -4625,23 +4828,7 @@ __metadata: languageName: node linkType: hard -"is-fullwidth-code-point@npm:^4.0.0": - version: 4.0.0 - resolution: "is-fullwidth-code-point@npm:4.0.0" - checksum: 10/8ae89bf5057bdf4f57b346fb6c55e9c3dd2549983d54191d722d5c739397a903012cc41a04ee3403fd872e811243ef91a7c5196da7b5841dc6b6aae31a264a8d - languageName: node - linkType: hard - -"is-fullwidth-code-point@npm:^5.0.0": - version: 5.0.0 - resolution: "is-fullwidth-code-point@npm:5.0.0" - dependencies: - get-east-asian-width: "npm:^1.0.0" - checksum: 10/8dfb2d2831b9e87983c136f5c335cd9d14c1402973e357a8ff057904612ed84b8cba196319fabedf9aefe4639e14fe3afe9d9966d1d006ebeb40fe1fed4babe5 - languageName: node - linkType: hard - -"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3": +"is-glob@npm:^4.0.0, is-glob@npm:^4.0.1, is-glob@npm:^4.0.3, is-glob@npm:~4.0.1": version: 4.0.3 resolution: "is-glob@npm:4.0.3" dependencies: @@ -4678,13 +4865,6 @@ __metadata: languageName: node linkType: hard -"is-path-inside@npm:^3.0.3": - version: 3.0.3 - resolution: "is-path-inside@npm:3.0.3" - checksum: 10/abd50f06186a052b349c15e55b182326f1936c89a78bf6c8f2b707412517c097ce04bc49a0ca221787bc44e1049f51f09a2ffb63d22899051988d3a618ba13e9 - languageName: node - linkType: hard - "is-plain-obj@npm:^1.0.0, is-plain-obj@npm:^1.1.0": version: 1.1.0 resolution: "is-plain-obj@npm:1.1.0" @@ -4701,13 +4881,6 @@ __metadata: languageName: node linkType: hard -"is-plain-object@npm:^5.0.0": - version: 5.0.0 - resolution: "is-plain-object@npm:5.0.0" - checksum: 10/e32d27061eef62c0847d303125440a38660517e586f2f3db7c9d179ae5b6674ab0f469d519b2e25c147a1a3bc87156d0d5f4d8821e0ce4a9ee7fe1fcf11ce45c - languageName: node - linkType: hard - "is-ssh@npm:^1.4.0": version: 1.4.0 resolution: "is-ssh@npm:1.4.0" @@ -4731,13 +4904,6 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^3.0.0": - version: 3.0.0 - resolution: "is-stream@npm:3.0.0" - checksum: 10/172093fe99119ffd07611ab6d1bcccfe8bc4aa80d864b15f43e63e54b7abc71e779acd69afdb854c4e2a67fdc16ae710e370eda40088d1cfc956a50ed82d8f16 - languageName: node - linkType: hard - "is-text-path@npm:^1.0.1": version: 1.0.1 resolution: "is-text-path@npm:1.0.1" @@ -4830,29 +4996,25 @@ __metadata: languageName: node linkType: hard -"jackspeak@npm:^2.3.5": - version: 2.3.6 - resolution: "jackspeak@npm:2.3.6" +"jackspeak@npm:^3.1.2": + version: 3.4.2 + resolution: "jackspeak@npm:3.4.2" dependencies: "@isaacs/cliui": "npm:^8.0.2" "@pkgjs/parseargs": "npm:^0.11.0" dependenciesMeta: "@pkgjs/parseargs": optional: true - checksum: 10/6e6490d676af8c94a7b5b29b8fd5629f21346911ebe2e32931c2a54210134408171c24cee1a109df2ec19894ad04a429402a8438cbf5cc2794585d35428ace76 + checksum: 10/485b77ffef380d1a1367a6453f3c6e61ca02728012be99bb397e673479020e87b1b0307d8f2a9288e48017eea9b8c95586a5c621b137e60c856e87365b9e1a8f languageName: node linkType: hard -"jackspeak@npm:^3.1.2": - version: 3.4.2 - resolution: "jackspeak@npm:3.4.2" +"jackspeak@npm:^4.0.1": + version: 4.0.2 + resolution: "jackspeak@npm:4.0.2" dependencies: "@isaacs/cliui": "npm:^8.0.2" - "@pkgjs/parseargs": "npm:^0.11.0" - dependenciesMeta: - "@pkgjs/parseargs": - optional: true - checksum: 10/485b77ffef380d1a1367a6453f3c6e61ca02728012be99bb397e673479020e87b1b0307d8f2a9288e48017eea9b8c95586a5c621b137e60c856e87365b9e1a8f + checksum: 10/d9722f0e55f6c322c57aedf094c405f4201b834204629817187953988075521cfddb23df83e2a7b845723ca7eb0555068c5ce1556732e9c275d32a531881efa8 languageName: node linkType: hard @@ -4907,7 +5069,7 @@ __metadata: languageName: node linkType: hard -"js-yaml@npm:^3.10.0": +"js-yaml@npm:^3.10.0, js-yaml@npm:^3.13.1": version: 3.14.1 resolution: "js-yaml@npm:3.14.1" dependencies: @@ -4919,21 +5081,21 @@ __metadata: languageName: node linkType: hard -"jsesc@npm:^3.0.2": - version: 3.0.2 - resolution: "jsesc@npm:3.0.2" +"jsesc@npm:^3.1.0": + version: 3.1.0 + resolution: "jsesc@npm:3.1.0" bin: jsesc: bin/jsesc - checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 + checksum: 10/20bd37a142eca5d1794f354db8f1c9aeb54d85e1f5c247b371de05d23a9751ecd7bd3a9c4fc5298ea6fa09a100dafb4190fa5c98c6610b75952c3487f3ce7967 languageName: node linkType: hard -"jsesc@npm:~0.5.0": - version: 0.5.0 - resolution: "jsesc@npm:0.5.0" +"jsesc@npm:~3.0.2": + version: 3.0.2 + resolution: "jsesc@npm:3.0.2" bin: jsesc: bin/jsesc - checksum: 10/fab949f585c71e169c5cbe00f049f20de74f067081bbd64a55443bad1c71e1b5a5b448f2359bf2fe06f5ed7c07e2e4a9101843b01c823c30b6afc11f5bfaf724 + checksum: 10/8e5a7de6b70a8bd71f9cb0b5a7ade6a73ae6ab55e697c74cc997cede97417a3a65ed86c36f7dd6125fe49766e8386c845023d9e213916ca92c9dfdd56e2babf3 languageName: node linkType: hard @@ -4958,14 +5120,7 @@ __metadata: languageName: node linkType: hard -"json-parse-even-better-errors@npm:^3.0.0": - version: 3.0.0 - resolution: "json-parse-even-better-errors@npm:3.0.0" - checksum: 10/f1970b5220c7fa23d888565510752c3d5e863f93668a202fcaa719739fa41485dfc6a1db212f702ebd3c873851cc067aebc2917e3f79763cae2fdb95046f38f3 - languageName: node - linkType: hard - -"json-parse-even-better-errors@npm:^3.0.2": +"json-parse-even-better-errors@npm:^3.0.0, json-parse-even-better-errors@npm:^3.0.2": version: 3.0.2 resolution: "json-parse-even-better-errors@npm:3.0.2" checksum: 10/6f04ea6c9ccb783630a59297959247e921cc90b917b8351197ca7fd058fccc7079268fd9362be21ba876fc26aa5039369dd0a2280aae49aae425784794a94927 @@ -5066,17 +5221,17 @@ __metadata: languageName: node linkType: hard -"lerna@npm:^8.1.8": - version: 8.1.8 - resolution: "lerna@npm:8.1.8" +"lerna@npm:^8.2.1": + version: 8.2.1 + resolution: "lerna@npm:8.2.1" dependencies: - "@lerna/create": "npm:8.1.8" + "@lerna/create": "npm:8.2.1" "@npmcli/arborist": "npm:7.5.4" "@npmcli/package-json": "npm:5.2.0" "@npmcli/run-script": "npm:8.1.0" - "@nx/devkit": "npm:>=17.1.2 < 20" + "@nx/devkit": "npm:>=17.1.2 < 21" "@octokit/plugin-enterprise-rest": "npm:6.0.1" - "@octokit/rest": "npm:19.0.11" + "@octokit/rest": "npm:20.1.2" aproba: "npm:2.0.0" byte-size: "npm:8.1.1" chalk: "npm:4.1.0" @@ -5088,7 +5243,7 @@ __metadata: conventional-changelog-angular: "npm:7.0.0" conventional-changelog-core: "npm:5.0.1" conventional-recommended-bump: "npm:7.0.1" - cosmiconfig: "npm:^8.2.0" + cosmiconfig: "npm:9.0.0" dedent: "npm:1.5.3" envinfo: "npm:7.13.0" execa: "npm:5.0.0" @@ -5119,7 +5274,7 @@ __metadata: npm-package-arg: "npm:11.0.2" npm-packlist: "npm:8.0.2" npm-registry-fetch: "npm:^17.1.0" - nx: "npm:>=17.1.2 < 20" + nx: "npm:>=17.1.2 < 21" p-map: "npm:4.0.0" p-map-series: "npm:2.1.0" p-pipe: "npm:3.1.0" @@ -5137,7 +5292,6 @@ __metadata: slash: "npm:3.0.0" ssri: "npm:^10.0.6" string-width: "npm:^4.2.3" - strip-ansi: "npm:^6.0.1" strong-log-transformer: "npm:2.1.0" tar: "npm:6.2.1" temp-dir: "npm:1.0.0" @@ -5153,7 +5307,7 @@ __metadata: yargs-parser: "npm:21.1.1" bin: lerna: dist/cli.js - checksum: 10/c058064f07b3e32fb10a2e37bd8a76b3cbba76c5e90250e508726003c4c2f80545d6a95a3de533ff8f1f20931c47055290e555a34b78de53eed786995d25b3e9 + checksum: 10/ebf9fd1af102a8b7e89dcf05e32f92dfa2ce13e77c9788a86eb4828e6a5269e7bf85edf1bcdb4e4ea383f42d872880ad61fc26d304276715b3757fb54cd60d94 languageName: node linkType: hard @@ -5193,10 +5347,10 @@ __metadata: languageName: node linkType: hard -"lilconfig@npm:~3.1.2": - version: 3.1.2 - resolution: "lilconfig@npm:3.1.2" - checksum: 10/8058403850cfad76d6041b23db23f730e52b6c17a8c28d87b90766639ca0ee40c748a3e85c2d7bd133d572efabff166c4b015e5d25e01fd666cb4b13cfada7f0 +"lines-and-columns@npm:2.0.3": + version: 2.0.3 + resolution: "lines-and-columns@npm:2.0.3" + checksum: 10/b5bb0d6ee2f82ae834ceddc9251af2060c30db476673e9c817c34c00bed58e0c5d90a6866b64afe7bdcb2c5eb1b418a5b1ee631d2592dc8ff381540901fa4da6 languageName: node linkType: hard @@ -5207,47 +5361,6 @@ __metadata: languageName: node linkType: hard -"lines-and-columns@npm:~2.0.3": - version: 2.0.3 - resolution: "lines-and-columns@npm:2.0.3" - checksum: 10/b5bb0d6ee2f82ae834ceddc9251af2060c30db476673e9c817c34c00bed58e0c5d90a6866b64afe7bdcb2c5eb1b418a5b1ee631d2592dc8ff381540901fa4da6 - languageName: node - linkType: hard - -"lint-staged@npm:^15.2.10": - version: 15.2.10 - resolution: "lint-staged@npm:15.2.10" - dependencies: - chalk: "npm:~5.3.0" - commander: "npm:~12.1.0" - debug: "npm:~4.3.6" - execa: "npm:~8.0.1" - lilconfig: "npm:~3.1.2" - listr2: "npm:~8.2.4" - micromatch: "npm:~4.0.8" - pidtree: "npm:~0.6.0" - string-argv: "npm:~0.3.2" - yaml: "npm:~2.5.0" - bin: - lint-staged: bin/lint-staged.js - checksum: 10/ab6930cd633dbb5b6ec7c81fc06c65df41e9f80d93dd22e0d79c6e272cdfd8110a0fbdec60303d46a06b30bcd92261153630e2c937531b77ec5ae41e7e9d90d3 - languageName: node - linkType: hard - -"listr2@npm:~8.2.4": - version: 8.2.4 - resolution: "listr2@npm:8.2.4" - dependencies: - cli-truncate: "npm:^4.0.0" - colorette: "npm:^2.0.20" - eventemitter3: "npm:^5.0.1" - log-update: "npm:^6.1.0" - rfdc: "npm:^1.4.1" - wrap-ansi: "npm:^9.0.0" - checksum: 10/344d2397e127bf802935925e95b54468eef745fbbaf9326eb33a1634ae2d6e86cdb527ef48cb83a19a50671955d39b3e2608c74db85530df07b5674f5de115e1 - languageName: node - linkType: hard - "load-json-file@npm:6.2.0": version: 6.2.0 resolution: "load-json-file@npm:6.2.0" @@ -5331,46 +5444,31 @@ __metadata: languageName: node linkType: hard -"log-update@npm:^6.1.0": - version: 6.1.0 - resolution: "log-update@npm:6.1.0" - dependencies: - ansi-escapes: "npm:^7.0.0" - cli-cursor: "npm:^5.0.0" - slice-ansi: "npm:^7.1.0" - strip-ansi: "npm:^7.1.0" - wrap-ansi: "npm:^9.0.0" - checksum: 10/5abb4131e33b1e7f8416bb194fe17a3603d83e4657c5bf5bb81ce4187f3b00ea481643b85c3d5cefe6037a452cdcf7f1391ab8ea0d9c23e75d19589830ec4f11 - languageName: node - linkType: hard - -"loupe@npm:^3.1.0, loupe@npm:^3.1.1": - version: 3.1.1 - resolution: "loupe@npm:3.1.1" - dependencies: - get-func-name: "npm:^2.0.1" - checksum: 10/56d71d64c5af109aaf2b5343668ea5952eed468ed2ff837373810e417bf8331f14491c6e4d38e08ff84a29cb18906e06e58ba660c53bd00f2989e1873fa2f54c +"loupe@npm:^3.1.0": + version: 3.1.2 + resolution: "loupe@npm:3.1.2" + checksum: 10/8f5734e53fb64cd914aa7d986e01b6d4c2e3c6c56dcbd5428d71c2703f0ab46b5ab9f9eeaaf2b485e8a1c43f865bdd16ec08ae1a661c8f55acdbd9f4d59c607a languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^9.1.1 || ^10.0.0": - version: 10.1.0 - resolution: "lru-cache@npm:10.1.0" - checksum: 10/207278d6fa711fb1f94a0835d4d4737441d2475302482a14785b10515e4c906a57ebf9f35bf060740c9560e91c7c1ad5a04fd7ed030972a9ba18bce2a228e95b +"loupe@npm:^3.1.3": + version: 3.1.3 + resolution: "loupe@npm:3.1.3" + checksum: 10/9e98c34daf0eba48ccc603595e51f2ae002110982d84879cf78c51de2c632f0c571dfe82ce4210af60c32203d06b443465c269bda925076fe6d9b612cc65c321 languageName: node linkType: hard -"lru-cache@npm:^10.2.0": +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.2.2, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a languageName: node linkType: hard -"lru-cache@npm:^10.2.2": - version: 10.2.2 - resolution: "lru-cache@npm:10.2.2" - checksum: 10/ff1a496d30b5eaec2c9079080965bb0cede203cf878371f7033a007f1e54cd4aa13cc8abf7ccec4c994a83a22ed5476e83a55bb57cc07e6c1547a42937e42c37 +"lru-cache@npm:^11.0.0": + version: 11.0.1 + resolution: "lru-cache@npm:11.0.1" + checksum: 10/26688a1b2a4d7fb97e9ea1ffb15348f1ab21b7110496814f5ce9190d50258fbba8c1444ae7232876deae1fc54adb230aa63dd1efc5bd47f240620ba8bf218041 languageName: node linkType: hard @@ -5390,23 +5488,23 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.10": - version: 0.30.10 - resolution: "magic-string@npm:0.30.10" +"magic-string@npm:^0.30.17": + version: 0.30.17 + resolution: "magic-string@npm:0.30.17" dependencies: - "@jridgewell/sourcemap-codec": "npm:^1.4.15" - checksum: 10/9f8bf6363a14c98a9d9f32ef833b194702a5c98fb931b05ac511b76f0b06fd30ed92beda6ca3261d2d52d21e39e891ef1136fbd032023f6cbb02d0b7d5767201 + "@jridgewell/sourcemap-codec": "npm:^1.5.0" + checksum: 10/2f71af2b0afd78c2e9012a29b066d2c8ba45a9cd0c8070f7fd72de982fb1c403b4e3afdb1dae00691d56885ede66b772ef6bedf765e02e3a7066208fe2fec4aa languageName: node linkType: hard -"magicast@npm:^0.3.4": - version: 0.3.4 - resolution: "magicast@npm:0.3.4" +"magicast@npm:^0.3.5": + version: 0.3.5 + resolution: "magicast@npm:0.3.5" dependencies: - "@babel/parser": "npm:^7.24.4" - "@babel/types": "npm:^7.24.0" + "@babel/parser": "npm:^7.25.4" + "@babel/types": "npm:^7.25.4" source-map-js: "npm:^1.2.0" - checksum: 10/704f86639b01c8e063155408cb181d89d4444db3a4a473fb501107f30f19d9c39a159dd315ef9e54a22291c090170044efd9b49a9b3ab8d6deb948a9c99d90b3 + checksum: 10/3a2dba6b0bdde957797361d09c7931ebdc1b30231705360eeb40ed458d28e1c3112841c3ed4e1b87ceb28f741e333c7673cd961193aa9fdb4f4946b202e6205a languageName: node linkType: hard @@ -5459,26 +5557,7 @@ __metadata: languageName: node linkType: hard -"make-fetch-happen@npm:^13.0.0": - version: 13.0.0 - resolution: "make-fetch-happen@npm:13.0.0" - dependencies: - "@npmcli/agent": "npm:^2.0.0" - cacache: "npm:^18.0.0" - http-cache-semantics: "npm:^4.1.1" - is-lambda: "npm:^1.0.1" - minipass: "npm:^7.0.2" - minipass-fetch: "npm:^3.0.0" - minipass-flush: "npm:^1.0.5" - minipass-pipeline: "npm:^1.2.4" - negotiator: "npm:^0.6.3" - promise-retry: "npm:^2.0.1" - ssri: "npm:^10.0.0" - checksum: 10/ded5a91a02b76381b06a4ec4d5c1d23ebbde15d402b3c3e4533b371dac7e2f7ca071ae71ae6dae72aa261182557b7b1b3fd3a705b39252dc17f74fa509d3e76f - languageName: node - linkType: hard - -"make-fetch-happen@npm:^13.0.1": +"make-fetch-happen@npm:^13.0.0, make-fetch-happen@npm:^13.0.1": version: 13.0.1 resolution: "make-fetch-happen@npm:13.0.1" dependencies: @@ -5570,7 +5649,7 @@ __metadata: languageName: node linkType: hard -"micromatch@npm:^4.0.4, micromatch@npm:~4.0.8": +"micromatch@npm:^4.0.8": version: 4.0.8 resolution: "micromatch@npm:4.0.8" dependencies: @@ -5603,21 +5682,7 @@ __metadata: languageName: node linkType: hard -"mimic-fn@npm:^4.0.0": - version: 4.0.0 - resolution: "mimic-fn@npm:4.0.0" - checksum: 10/995dcece15ee29aa16e188de6633d43a3db4611bcf93620e7e62109ec41c79c0f34277165b8ce5e361205049766e371851264c21ac64ca35499acb5421c2ba56 - languageName: node - linkType: hard - -"mimic-function@npm:^5.0.0": - version: 5.0.1 - resolution: "mimic-function@npm:5.0.1" - checksum: 10/eb5893c99e902ccebbc267c6c6b83092966af84682957f79313311edb95e8bb5f39fb048d77132b700474d1c86d90ccc211e99bae0935447a4834eb4c882982c - languageName: node - linkType: hard - -"min-indent@npm:^1.0.0": +"min-indent@npm:^1.0.0, min-indent@npm:^1.0.1": version: 1.0.1 resolution: "min-indent@npm:1.0.1" checksum: 10/bfc6dd03c5eaf623a4963ebd94d087f6f4bbbfd8c41329a7f09706b0cb66969c4ddd336abeb587bc44bc6f08e13bf90f0b374f9d71f9f01e04adc2cd6f083ef1 @@ -5642,6 +5707,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:^10.0.0": + version: 10.0.1 + resolution: "minimatch@npm:10.0.1" + dependencies: + brace-expansion: "npm:^2.0.1" + checksum: 10/082e7ccbc090d5f8c4e4e029255d5a1d1e3af37bda837da2b8b0085b1503a1210c91ac90d9ebfe741d8a5f286ece820a1abb4f61dc1f82ce602a055d461d93f3 + languageName: node + linkType: hard + "minimatch@npm:^3.0.4, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -5669,16 +5743,7 @@ __metadata: languageName: node linkType: hard -"minimatch@npm:^9.0.0, minimatch@npm:^9.0.1, minimatch@npm:^9.0.4": - version: 9.0.4 - resolution: "minimatch@npm:9.0.4" - dependencies: - brace-expansion: "npm:^2.0.1" - checksum: 10/4cdc18d112b164084513e890d6323370db14c22249d536ad1854539577a895e690a27513dc346392f61a4a50afbbd8abc88f3f25558bfbbbb862cd56508b20f5 - languageName: node - linkType: hard - -"minimatch@npm:^9.0.5": +"minimatch@npm:^9.0.0, minimatch@npm:^9.0.4, minimatch@npm:^9.0.5": version: 9.0.5 resolution: "minimatch@npm:9.0.5" dependencies: @@ -5788,14 +5853,7 @@ __metadata: languageName: node linkType: hard -"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3": - version: 7.0.4 - resolution: "minipass@npm:7.0.4" - checksum: 10/e864bd02ceb5e0707696d58f7ce3a0b89233f0d686ef0d447a66db705c0846a8dc6f34865cd85256c1472ff623665f616b90b8ff58058b2ad996c5de747d2d18 - languageName: node - linkType: hard - -"minipass@npm:^7.1.2": +"minipass@npm:^5.0.0 || ^6.0.2 || ^7.0.0, minipass@npm:^7.0.2, minipass@npm:^7.0.3, minipass@npm:^7.1.2": version: 7.1.2 resolution: "minipass@npm:7.1.2" checksum: 10/c25f0ee8196d8e6036661104bacd743785b2599a21de5c516b32b3fa2b83113ac89a2358465bc04956baab37ffb956ae43be679b2262bf7be15fce467ccd7950 @@ -5821,6 +5879,15 @@ __metadata: languageName: node linkType: hard +"mkdirp@npm:^3.0.1": + version: 3.0.1 + resolution: "mkdirp@npm:3.0.1" + bin: + mkdirp: dist/cjs/src/bin.js + checksum: 10/16fd79c28645759505914561e249b9a1f5fe3362279ad95487a4501e4467abeb714fd35b95307326b8fd03f3c7719065ef11a6f97b7285d7888306d1bd2232ba + languageName: node + linkType: hard + "modify-values@npm:^1.0.1": version: 1.0.1 resolution: "modify-values@npm:1.0.1" @@ -5835,14 +5902,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.2": - version: 2.1.2 - resolution: "ms@npm:2.1.2" - checksum: 10/673cdb2c3133eb050c745908d8ce632ed2c02d85640e2edb3ace856a2266a813b30c613569bf3354fdf4ea7d1a1494add3bfa95e2713baa27d0c2c71fc44f58f - languageName: node - linkType: hard - -"ms@npm:^2.0.0": +"ms@npm:^2.0.0, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: 10/aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -5876,6 +5936,13 @@ __metadata: languageName: node linkType: hard +"mute-stream@npm:^2.0.0": + version: 2.0.0 + resolution: "mute-stream@npm:2.0.0" + checksum: 10/d2e4fd2f5aa342b89b98134a8d899d8ef9b0a6d69274c4af9df46faa2d97aeb1f2ce83d867880d6de63643c52386579b99139801e24e7526c3b9b0a6d1e18d6c + languageName: node + linkType: hard + "mz@npm:^2.4.0": version: 2.7.0 resolution: "mz@npm:2.7.0" @@ -5887,12 +5954,23 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.7": - version: 3.3.7 - resolution: "nanoid@npm:3.3.7" +"nano-staged@npm:^0.8.0": + version: 0.8.0 + resolution: "nano-staged@npm:0.8.0" + dependencies: + picocolors: "npm:^1.0.0" + bin: + nano-staged: lib/bin.js + checksum: 10/33051331ee280e42fcb4863662678d9eabb54869282dda4d1425880d1f179a9a720369f9e9b66d551cda334cb41c447209d5884a9172783b0393069f96ae549e + languageName: node + linkType: hard + +"nanoid@npm:^3.3.8": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" bin: nanoid: bin/nanoid.cjs - checksum: 10/ac1eb60f615b272bccb0e2b9cd933720dad30bf9708424f691b8113826bb91aca7e9d14ef5d9415a6ba15c266b37817256f58d8ce980c82b0ba3185352565679 + checksum: 10/2d1766606cf0d6f47b6f0fdab91761bb81609b2e3d367027aff45e6ee7006f660fb7e7781f4a34799fe6734f1268eeed2e37a5fdee809ade0c2d4eb11b0f9c40 languageName: node linkType: hard @@ -5943,20 +6021,6 @@ __metadata: languageName: node linkType: hard -"node-fetch@npm:^2.6.7": - version: 2.6.12 - resolution: "node-fetch@npm:2.6.12" - dependencies: - whatwg-url: "npm:^5.0.0" - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - checksum: 10/370ed4d906edad9709a81b54a0141d37d2973a27dc80c723d8ac14afcec6dc67bc6c70986a96992b64ec75d08159cc4b65ce6aa9063941168ea5ac73b24df9f8 - languageName: node - linkType: hard - "node-gyp@npm:^10.0.0": version: 10.0.1 resolution: "node-gyp@npm:10.0.1" @@ -6005,10 +6069,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.14": - version: 2.0.14 - resolution: "node-releases@npm:2.0.14" - checksum: 10/0f7607ec7db5ef1dc616899a5f24ae90c869b6a54c2d4f36ff6d84a282ab9343c7ff3ca3670fe4669171bb1e8a9b3e286e1ef1c131f09a83d70554f855d54f24 +"node-releases@npm:^2.0.19": + version: 2.0.19 + resolution: "node-releases@npm:2.0.19" + checksum: 10/c2b33b4f0c40445aee56141f13ca692fa6805db88510e5bbb3baadb2da13e1293b738e638e15e4a8eb668bb9e97debb08e7a35409b477b5cc18f171d35a83045 languageName: node linkType: hard @@ -6023,18 +6087,7 @@ __metadata: languageName: node linkType: hard -"nopt@npm:^7.0.0": - version: 7.2.0 - resolution: "nopt@npm:7.2.0" - dependencies: - abbrev: "npm:^2.0.0" - bin: - nopt: bin/nopt.js - checksum: 10/1e7489f17cbda452c8acaf596a8defb4ae477d2a9953b76eb96f4ec3f62c6b421cd5174eaa742f88279871fde9586d8a1d38fb3f53fa0c405585453be31dff4c - languageName: node - linkType: hard - -"nopt@npm:^7.2.1": +"nopt@npm:^7.0.0, nopt@npm:^7.2.1": version: 7.2.1 resolution: "nopt@npm:7.2.1" dependencies: @@ -6069,19 +6122,7 @@ __metadata: languageName: node linkType: hard -"normalize-package-data@npm:^6.0.0": - version: 6.0.0 - resolution: "normalize-package-data@npm:6.0.0" - dependencies: - hosted-git-info: "npm:^7.0.0" - is-core-module: "npm:^2.8.1" - semver: "npm:^7.3.5" - validate-npm-package-license: "npm:^3.0.4" - checksum: 10/e31e31a2ebaef93ef107feb9408f105044eeae9cb7d0d4619544ab2323cd4b15ca648b0d558ac29db2fece161c7b8658206bb27ebe9340df723f7174b3e2759d - languageName: node - linkType: hard - -"normalize-package-data@npm:^6.0.1": +"normalize-package-data@npm:^6.0.0, normalize-package-data@npm:^6.0.1": version: 6.0.2 resolution: "normalize-package-data@npm:6.0.2" dependencies: @@ -6092,25 +6133,23 @@ __metadata: languageName: node linkType: hard -"npm-bundled@npm:^3.0.0": +"normalize-path@npm:^3.0.0, normalize-path@npm:~3.0.0": version: 3.0.0 - resolution: "npm-bundled@npm:3.0.0" - dependencies: - npm-normalize-package-bin: "npm:^3.0.0" - checksum: 10/704fce20114d36d665c20edc56d3f9f7778c52ca1cd48731ec31f65af9e65805f9308ca7ed9e5a6bd9fe22327a63aa5d83a8c5aaee0c715e5047de1fa659e8bf + resolution: "normalize-path@npm:3.0.0" + checksum: 10/88eeb4da891e10b1318c4b2476b6e2ecbeb5ff97d946815ffea7794c31a89017c70d7f34b3c2ebf23ef4e9fc9fb99f7dffe36da22011b5b5c6ffa34f4873ec20 languageName: node linkType: hard -"npm-install-checks@npm:^6.0.0": - version: 6.1.1 - resolution: "npm-install-checks@npm:6.1.1" +"npm-bundled@npm:^3.0.0": + version: 3.0.0 + resolution: "npm-bundled@npm:3.0.0" dependencies: - semver: "npm:^7.1.1" - checksum: 10/8fb3ed05cfd3fdeb20d2fd22d45a89cd509afac3b05d188af7d9bcdf07ed745d1346943692782a4dca4c42b2c1fec34eb42fdf20e2ef8bb5b249fbb5a811ce3b + npm-normalize-package-bin: "npm:^3.0.0" + checksum: 10/704fce20114d36d665c20edc56d3f9f7778c52ca1cd48731ec31f65af9e65805f9308ca7ed9e5a6bd9fe22327a63aa5d83a8c5aaee0c715e5047de1fa659e8bf languageName: node linkType: hard -"npm-install-checks@npm:^6.2.0": +"npm-install-checks@npm:^6.0.0, npm-install-checks@npm:^6.2.0": version: 6.3.0 resolution: "npm-install-checks@npm:6.3.0" dependencies: @@ -6126,7 +6165,7 @@ __metadata: languageName: node linkType: hard -"npm-package-arg@npm:11.0.2, npm-package-arg@npm:^11.0.2": +"npm-package-arg@npm:11.0.2, npm-package-arg@npm:^11.0.0, npm-package-arg@npm:^11.0.2": version: 11.0.2 resolution: "npm-package-arg@npm:11.0.2" dependencies: @@ -6138,19 +6177,7 @@ __metadata: languageName: node linkType: hard -"npm-package-arg@npm:^11.0.0": - version: 11.0.1 - resolution: "npm-package-arg@npm:11.0.1" - dependencies: - hosted-git-info: "npm:^7.0.0" - proc-log: "npm:^3.0.0" - semver: "npm:^7.3.5" - validate-npm-package-name: "npm:^5.0.0" - checksum: 10/a16e632703e106b3e9a6b4902d14a3493c8371745bcf8ba8f4ea9f152e12d5ed927487931e9adf817d05ba97b04941b33fec1d140dbd7da09181b546fde35b3c - languageName: node - linkType: hard - -"npm-packlist@npm:8.0.2": +"npm-packlist@npm:8.0.2, npm-packlist@npm:^8.0.0": version: 8.0.2 resolution: "npm-packlist@npm:8.0.2" dependencies: @@ -6159,28 +6186,7 @@ __metadata: languageName: node linkType: hard -"npm-packlist@npm:^8.0.0": - version: 8.0.1 - resolution: "npm-packlist@npm:8.0.1" - dependencies: - ignore-walk: "npm:^6.0.4" - checksum: 10/470b56b1c5b93dab40adac99d59e206600263e7387005bc4c9c6635a0d166a3931501b8dda6c3809f15579666b11445d0850a354b12209742a4076c0705711df - languageName: node - linkType: hard - -"npm-pick-manifest@npm:^9.0.0": - version: 9.0.0 - resolution: "npm-pick-manifest@npm:9.0.0" - dependencies: - npm-install-checks: "npm:^6.0.0" - npm-normalize-package-bin: "npm:^3.0.0" - npm-package-arg: "npm:^11.0.0" - semver: "npm:^7.3.5" - checksum: 10/29dca2a838ed35c714df1a76f76616df2df51ce31bc3ca5943a0668b2eca2a5aab448f9f89cadf7a77eb5e3831c554cebaf7802f3e432838acb34c1a74fa2786 - languageName: node - linkType: hard - -"npm-pick-manifest@npm:^9.0.1": +"npm-pick-manifest@npm:^9.0.0, npm-pick-manifest@npm:^9.0.1": version: 9.0.1 resolution: "npm-pick-manifest@npm:9.0.1" dependencies: @@ -6217,15 +6223,6 @@ __metadata: languageName: node linkType: hard -"npm-run-path@npm:^5.1.0": - version: 5.1.0 - resolution: "npm-run-path@npm:5.1.0" - dependencies: - path-key: "npm:^4.0.0" - checksum: 10/dc184eb5ec239d6a2b990b43236845332ef12f4e0beaa9701de724aa797fe40b6bbd0157fb7639d24d3ab13f5d5cf22d223a19c6300846b8126f335f788bee66 - languageName: node - linkType: hard - "npmlog@npm:^6.0.0": version: 6.0.2 resolution: "npmlog@npm:6.0.2" @@ -6238,40 +6235,39 @@ __metadata: languageName: node linkType: hard -"nx@npm:19.0.4, nx@npm:>=17.1.2 < 20": - version: 19.0.4 - resolution: "nx@npm:19.0.4" +"nx@npm:>=17.1.2 < 21": + version: 20.0.8 + resolution: "nx@npm:20.0.8" dependencies: - "@nrwl/tao": "npm:19.0.4" - "@nx/nx-darwin-arm64": "npm:19.0.4" - "@nx/nx-darwin-x64": "npm:19.0.4" - "@nx/nx-freebsd-x64": "npm:19.0.4" - "@nx/nx-linux-arm-gnueabihf": "npm:19.0.4" - "@nx/nx-linux-arm64-gnu": "npm:19.0.4" - "@nx/nx-linux-arm64-musl": "npm:19.0.4" - "@nx/nx-linux-x64-gnu": "npm:19.0.4" - "@nx/nx-linux-x64-musl": "npm:19.0.4" - "@nx/nx-win32-arm64-msvc": "npm:19.0.4" - "@nx/nx-win32-x64-msvc": "npm:19.0.4" + "@napi-rs/wasm-runtime": "npm:0.2.4" + "@nx/nx-darwin-arm64": "npm:20.0.8" + "@nx/nx-darwin-x64": "npm:20.0.8" + "@nx/nx-freebsd-x64": "npm:20.0.8" + "@nx/nx-linux-arm-gnueabihf": "npm:20.0.8" + "@nx/nx-linux-arm64-gnu": "npm:20.0.8" + "@nx/nx-linux-arm64-musl": "npm:20.0.8" + "@nx/nx-linux-x64-gnu": "npm:20.0.8" + "@nx/nx-linux-x64-musl": "npm:20.0.8" + "@nx/nx-win32-arm64-msvc": "npm:20.0.8" + "@nx/nx-win32-x64-msvc": "npm:20.0.8" "@yarnpkg/lockfile": "npm:^1.1.0" "@yarnpkg/parsers": "npm:3.0.0-rc.46" - "@zkochan/js-yaml": "npm:0.0.6" - axios: "npm:^1.6.0" + "@zkochan/js-yaml": "npm:0.0.7" + axios: "npm:^1.7.4" chalk: "npm:^4.1.0" cli-cursor: "npm:3.1.0" cli-spinners: "npm:2.6.1" cliui: "npm:^8.0.1" - dotenv: "npm:~16.3.1" - dotenv-expand: "npm:~10.0.0" + dotenv: "npm:~16.4.5" + dotenv-expand: "npm:~11.0.6" enquirer: "npm:~2.3.6" figures: "npm:3.2.0" flat: "npm:^5.0.2" - fs-extra: "npm:^11.1.0" + front-matter: "npm:^4.0.2" ignore: "npm:^5.0.4" jest-diff: "npm:^29.4.1" - js-yaml: "npm:4.1.0" jsonc-parser: "npm:3.2.0" - lines-and-columns: "npm:~2.0.3" + lines-and-columns: "npm:2.0.3" minimatch: "npm:9.0.3" node-machine-id: "npm:1.1.12" npm-run-path: "npm:^4.0.1" @@ -6279,7 +6275,6 @@ __metadata: ora: "npm:5.3.0" semver: "npm:^7.5.3" string-width: "npm:^4.2.3" - strong-log-transformer: "npm:^2.1.0" tar-stream: "npm:~2.2.0" tmp: "npm:~0.2.1" tsconfig-paths: "npm:^4.1.2" @@ -6318,7 +6313,7 @@ __metadata: bin: nx: bin/nx.js nx-cloud: bin/nx-cloud.js - checksum: 10/37f63af1dc9bbdfe88e6d00ba73a7181e7fb631aa5944ec942e6f4a5b6fff189168974bef332008fc3ec38aaa5341cd92609d834f3306b80f96a631e254994c9 + checksum: 10/2b11a447e3a9e0503d9fc12e6b7010e47c3ca837bc9fcbcc45a93b61ce8ad1e5208d82b0347ca22103212c877ef08cff286de76826796bbec70512a723173641 languageName: node linkType: hard @@ -6347,24 +6342,6 @@ __metadata: languageName: node linkType: hard -"onetime@npm:^6.0.0": - version: 6.0.0 - resolution: "onetime@npm:6.0.0" - dependencies: - mimic-fn: "npm:^4.0.0" - checksum: 10/0846ce78e440841335d4e9182ef69d5762e9f38aa7499b19f42ea1c4cd40f0b4446094c455c713f9adac3f4ae86f613bb5e30c99e52652764d06a89f709b3788 - languageName: node - linkType: hard - -"onetime@npm:^7.0.0": - version: 7.0.0 - resolution: "onetime@npm:7.0.0" - dependencies: - mimic-function: "npm:^5.0.0" - checksum: 10/eb08d2da9339819e2f9d52cab9caf2557d80e9af8c7d1ae86e1a0fef027d00a88e9f5bd67494d350df360f7c559fbb44e800b32f310fb989c860214eacbb561c - languageName: node - linkType: hard - "open@npm:^8.4.0": version: 8.4.2 resolution: "open@npm:8.4.2" @@ -6627,7 +6604,7 @@ __metadata: languageName: node linkType: hard -"parse-json@npm:^5.0.0": +"parse-json@npm:^5.0.0, parse-json@npm:^5.2.0": version: 5.2.0 resolution: "parse-json@npm:5.2.0" dependencies: @@ -6639,6 +6616,17 @@ __metadata: languageName: node linkType: hard +"parse-json@npm:^8.0.0": + version: 8.1.0 + resolution: "parse-json@npm:8.1.0" + dependencies: + "@babel/code-frame": "npm:^7.22.13" + index-to-position: "npm:^0.1.2" + type-fest: "npm:^4.7.1" + checksum: 10/efc4256c91e835b1340e2b4f535272247f174fcba85eead15ff938be23b3ca2d521a04c76e564d1dc2f61c0c9ebcb6157d5433d459c7e736c81d014b49577b31 + languageName: node + linkType: hard + "parse-path@npm:^7.0.0": version: 7.0.0 resolution: "parse-path@npm:7.0.0" @@ -6708,13 +6696,6 @@ __metadata: languageName: node linkType: hard -"path-key@npm:^4.0.0": - version: 4.0.0 - resolution: "path-key@npm:4.0.0" - checksum: 10/8e6c314ae6d16b83e93032c61020129f6f4484590a777eed709c4a01b50e498822b00f76ceaf94bc64dbd90b327df56ceadce27da3d83393790f1219e07721d7 - languageName: node - linkType: hard - "path-parse@npm:^1.0.7": version: 1.0.7 resolution: "path-parse@npm:1.0.7" @@ -6722,17 +6703,7 @@ __metadata: languageName: node linkType: hard -"path-scurry@npm:^1.10.1, path-scurry@npm:^1.6.1": - version: 1.10.1 - resolution: "path-scurry@npm:1.10.1" - dependencies: - lru-cache: "npm:^9.1.1 || ^10.0.0" - minipass: "npm:^5.0.0 || ^6.0.2 || ^7.0.0" - checksum: 10/eebfb8304fef1d4f7e1486df987e4fd77413de4fce16508dea69fcf8eb318c09a6b15a7a2f4c22877cec1cb7ecbd3071d18ca9de79eeece0df874a00f1f0bdc8 - languageName: node - linkType: hard - -"path-scurry@npm:^1.11.1": +"path-scurry@npm:^1.11.1, path-scurry@npm:^1.6.1": version: 1.11.1 resolution: "path-scurry@npm:1.11.1" dependencies: @@ -6742,6 +6713,16 @@ __metadata: languageName: node linkType: hard +"path-scurry@npm:^2.0.0": + version: 2.0.0 + resolution: "path-scurry@npm:2.0.0" + dependencies: + lru-cache: "npm:^11.0.0" + minipass: "npm:^7.1.2" + checksum: 10/285ae0c2d6c34ae91dc1d5378ede21981c9a2f6de1ea9ca5a88b5a270ce9763b83dbadc7a324d512211d8d36b0c540427d3d0817030849d97a60fa840a2c59ec + languageName: node + linkType: hard + "path-type@npm:^3.0.0": version: 3.0.0 resolution: "path-type@npm:3.0.0" @@ -6758,17 +6739,17 @@ __metadata: languageName: node linkType: hard -"path-type@npm:^5.0.0": - version: 5.0.0 - resolution: "path-type@npm:5.0.0" - checksum: 10/15ec24050e8932c2c98d085b72cfa0d6b4eeb4cbde151a0a05726d8afae85784fc5544f733d8dfc68536587d5143d29c0bd793623fad03d7e61cc00067291cd5 +"path-type@npm:^6.0.0": + version: 6.0.0 + resolution: "path-type@npm:6.0.0" + checksum: 10/b9f6eaf7795c48d5c9bc4c6bc3ac61315b8d36975a73497ab2e02b764c0836b71fb267ea541863153f633a069a1c2ed3c247cb781633842fc571c655ac57c00e languageName: node linkType: hard -"pathe@npm:^1.1.2": - version: 1.1.2 - resolution: "pathe@npm:1.1.2" - checksum: 10/f201d796351bf7433d147b92c20eb154a4e0ea83512017bf4ec4e492a5d6e738fb45798be4259a61aa81270179fce11026f6ff0d3fa04173041de044defe9d80 +"pathe@npm:^2.0.3": + version: 2.0.3 + resolution: "pathe@npm:2.0.3" + checksum: 10/01e9a69928f39087d96e1751ce7d6d50da8c39abf9a12e0ac2389c42c83bc76f78c45a475bd9026a02e6a6f79be63acc75667df855862fe567d99a00a540d23d languageName: node linkType: hard @@ -6779,26 +6760,24 @@ __metadata: languageName: node linkType: hard -"picocolors@npm:^1.0.0": - version: 1.0.0 - resolution: "picocolors@npm:1.0.0" - checksum: 10/a2e8092dd86c8396bdba9f2b5481032848525b3dc295ce9b57896f931e63fc16f79805144321f72976383fc249584672a75cc18d6777c6b757603f372f745981 +"picocolors@npm:^1.0.0, picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10/e1cf46bf84886c79055fdfa9dcb3e4711ad259949e3565154b004b260cd356c5d54b31a1437ce9782624bf766272fe6b0154f5f0c744fb7af5d454d2b60db045 languageName: node linkType: hard -"picomatch@npm:^2.3.1": +"picomatch@npm:^2.0.4, picomatch@npm:^2.2.1, picomatch@npm:^2.3.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" checksum: 10/60c2595003b05e4535394d1da94850f5372c9427ca4413b71210f437f7b2ca091dbd611c45e8b37d10036fa8eade25c1b8951654f9d3973bfa66a2ff4d3b08bc languageName: node linkType: hard -"pidtree@npm:~0.6.0": - version: 0.6.0 - resolution: "pidtree@npm:0.6.0" - bin: - pidtree: bin/pidtree.js - checksum: 10/ea67fb3159e170fd069020e0108ba7712df9f0fd13c8db9b2286762856ddce414fb33932e08df4bfe36e91fe860b51852aee49a6f56eb4714b69634343add5df +"picomatch@npm:^4.0.2": + version: 4.0.2 + resolution: "picomatch@npm:4.0.2" + checksum: 10/ce617b8da36797d09c0baacb96ca8a44460452c89362d7cb8f70ca46b4158ba8bc3606912de7c818eb4a939f7f9015cef3c766ec8a0c6bfc725fdc078e39c717 languageName: node linkType: hard @@ -6846,6 +6825,13 @@ __metadata: languageName: node linkType: hard +"polite-json@npm:^5.0.0": + version: 5.0.0 + resolution: "polite-json@npm:5.0.0" + checksum: 10/2faeff490c14a88e08f336e13b39f7e8c80dbfda06b96b5cf858ea295a7392f3c857cac0582ef6a1dd989a2dc81b74a6e01e41017453336b382eff8afcb84f9a + languageName: node + linkType: hard + "postcss-selector-parser@npm:^6.0.10": version: 6.1.0 resolution: "postcss-selector-parser@npm:6.1.0" @@ -6856,14 +6842,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.38": - version: 8.4.38 - resolution: "postcss@npm:8.4.38" +"postcss@npm:^8.4.49": + version: 8.5.1 + resolution: "postcss@npm:8.5.1" dependencies: - nanoid: "npm:^3.3.7" - picocolors: "npm:^1.0.0" - source-map-js: "npm:^1.2.0" - checksum: 10/6e44a7ed835ffa9a2b096e8d3e5dfc6bcf331a25c48aeb862dd54e3aaecadf814fa22be224fd308f87d08adf2299164f88c5fd5ab1c4ef6cbd693ceb295377f4 + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10/1fbd28753143f7f03e4604813639918182b15343c7ad0f4e72f3875fc2cc0b8494c887f55dc05008fad5fbf1e1e908ce2edbbce364a91f84dcefb71edf7cd31d languageName: node linkType: hard @@ -6883,12 +6869,12 @@ __metadata: languageName: node linkType: hard -"prettier@npm:^3.3.3": - version: 3.3.3 - resolution: "prettier@npm:3.3.3" +"prettier@npm:^3.5.3": + version: 3.5.3 + resolution: "prettier@npm:3.5.3" bin: prettier: bin/prettier.cjs - checksum: 10/5beac1f30b5b40162532b8e2f7c3a4eb650910a2695e9c8512a62ffdc09dae93190c29db9107fa7f26d1b6c71aad3628ecb9b5de1ecb0911191099be109434d7 + checksum: 10/7050c08f674d9e49fbd9a4c008291d0715471f64e94cc5e4b01729affce221dfc6875c8de7e66b728c64abc9352eefb7eaae071b5f79d30081be207b53774b78 languageName: node linkType: hard @@ -7030,6 +7016,17 @@ __metadata: languageName: node linkType: hard +"read-package-up@npm:^11.0.0": + version: 11.0.0 + resolution: "read-package-up@npm:11.0.0" + dependencies: + find-up-simple: "npm:^1.0.0" + read-pkg: "npm:^9.0.0" + type-fest: "npm:^4.6.0" + checksum: 10/535b7554d47fae5fb5c2e7aceebd48b5de4142cdfe7b21f942fa9a0f56db03d3b53cce298e19438e1149292279c285e6ba6722eca741d590fd242519c4bdbc17 + languageName: node + linkType: hard + "read-pkg-up@npm:^3.0.0": version: 3.0.0 resolution: "read-pkg-up@npm:3.0.0" @@ -7074,6 +7071,19 @@ __metadata: languageName: node linkType: hard +"read-pkg@npm:^9.0.0": + version: 9.0.1 + resolution: "read-pkg@npm:9.0.1" + dependencies: + "@types/normalize-package-data": "npm:^2.4.3" + normalize-package-data: "npm:^6.0.0" + parse-json: "npm:^8.0.0" + type-fest: "npm:^4.6.0" + unicorn-magic: "npm:^0.1.0" + checksum: 10/5544bea2a58c6e5706db49a96137e8f0768c69395f25363f934064fbba00bdcdaa326fcd2f4281741df38cf81dbf27b76138240dc6de0ed718cf650475e0de3c + languageName: node + linkType: hard + "read@npm:^2.0.0": version: 2.1.0 resolution: "read@npm:2.1.0" @@ -7118,6 +7128,15 @@ __metadata: languageName: node linkType: hard +"readdirp@npm:~3.6.0": + version: 3.6.0 + resolution: "readdirp@npm:3.6.0" + dependencies: + picomatch: "npm:^2.2.1" + checksum: 10/196b30ef6ccf9b6e18c4e1724b7334f72a093d011a99f3b5920470f0b3406a51770867b3e1ae9711f227ef7a7065982f6ee2ce316746b2cb42c88efe44297fe7 + languageName: node + linkType: hard + "redent@npm:^3.0.0": version: 3.0.0 resolution: "redent@npm:3.0.0" @@ -7137,14 +7156,14 @@ __metadata: languageName: node linkType: hard -"regjsparser@npm:^0.10.0": - version: 0.10.0 - resolution: "regjsparser@npm:0.10.0" +"regjsparser@npm:^0.12.0": + version: 0.12.0 + resolution: "regjsparser@npm:0.12.0" dependencies: - jsesc: "npm:~0.5.0" + jsesc: "npm:~3.0.2" bin: regjsparser: bin/parser - checksum: 10/06f7f0e59598de20769ce5637bbd8879387f67c0eeb8ccc8857331c623332718c25d8d20bd74df210bf636dde061474e8bd365cf73af20470f0b3cb42cd42019 + checksum: 10/c2d6506b3308679de5223a8916984198e0493649a67b477c66bdb875357e3785abbf3bedf7c5c2cf8967d3b3a7bdf08b7cbd39e65a70f9e1ffad584aecf5f06a languageName: node linkType: hard @@ -7178,6 +7197,16 @@ __metadata: languageName: node linkType: hard +"resolve-import@npm:^2.0.0": + version: 2.0.0 + resolution: "resolve-import@npm:2.0.0" + dependencies: + glob: "npm:^11.0.0" + walk-up-path: "npm:^4.0.0" + checksum: 10/42806adf37f4bf916334ae7ac95ce0814100e5d9c23e072022bab706d056fe9c7809f45f5a4815db9d216b6ad5d81143643acfc2a50190fada0252cf12460827 + languageName: node + linkType: hard + "resolve-pkg-maps@npm:^1.0.0": version: 1.0.0 resolution: "resolve-pkg-maps@npm:1.0.0" @@ -7221,16 +7250,6 @@ __metadata: languageName: node linkType: hard -"restore-cursor@npm:^5.0.0": - version: 5.1.0 - resolution: "restore-cursor@npm:5.1.0" - dependencies: - onetime: "npm:^7.0.0" - signal-exit: "npm:^4.1.0" - checksum: 10/838dd54e458d89cfbc1a923b343c1b0f170a04100b4ce1733e97531842d7b440463967e521216e8ab6c6f8e89df877acc7b7f4c18ec76e99fb9bf5a60d358d2c - languageName: node - linkType: hard - "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -7245,13 +7264,6 @@ __metadata: languageName: node linkType: hard -"rfdc@npm:^1.4.1": - version: 1.4.1 - resolution: "rfdc@npm:1.4.1" - checksum: 10/2f3d11d3d8929b4bfeefc9acb03aae90f971401de0add5ae6c5e38fec14f0405e6a4aad8fdb76344bfdd20c5193110e3750cbbd28ba86d73729d222b6cf4a729 - languageName: node - linkType: hard - "rimraf@npm:^3.0.0, rimraf@npm:^3.0.2": version: 3.0.2 resolution: "rimraf@npm:3.0.2" @@ -7274,26 +7286,42 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^4.13.0": - version: 4.14.0 - resolution: "rollup@npm:4.14.0" - dependencies: - "@rollup/rollup-android-arm-eabi": "npm:4.14.0" - "@rollup/rollup-android-arm64": "npm:4.14.0" - "@rollup/rollup-darwin-arm64": "npm:4.14.0" - "@rollup/rollup-darwin-x64": "npm:4.14.0" - "@rollup/rollup-linux-arm-gnueabihf": "npm:4.14.0" - "@rollup/rollup-linux-arm64-gnu": "npm:4.14.0" - "@rollup/rollup-linux-arm64-musl": "npm:4.14.0" - "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.14.0" - "@rollup/rollup-linux-riscv64-gnu": "npm:4.14.0" - "@rollup/rollup-linux-s390x-gnu": "npm:4.14.0" - "@rollup/rollup-linux-x64-gnu": "npm:4.14.0" - "@rollup/rollup-linux-x64-musl": "npm:4.14.0" - "@rollup/rollup-win32-arm64-msvc": "npm:4.14.0" - "@rollup/rollup-win32-ia32-msvc": "npm:4.14.0" - "@rollup/rollup-win32-x64-msvc": "npm:4.14.0" - "@types/estree": "npm:1.0.5" +"rimraf@npm:^6.0.0": + version: 6.0.1 + resolution: "rimraf@npm:6.0.1" + dependencies: + glob: "npm:^11.0.0" + package-json-from-dist: "npm:^1.0.0" + bin: + rimraf: dist/esm/bin.mjs + checksum: 10/0eb7edf08aa39017496c99ba675552dda11a20811ba78f8232da2ba945308c91e9cd673f95998b1a8202bc7436d33390831d23ea38ae52751038d56373ad99e2 + languageName: node + linkType: hard + +"rollup@npm:^4.23.0": + version: 4.31.0 + resolution: "rollup@npm:4.31.0" + dependencies: + "@rollup/rollup-android-arm-eabi": "npm:4.31.0" + "@rollup/rollup-android-arm64": "npm:4.31.0" + "@rollup/rollup-darwin-arm64": "npm:4.31.0" + "@rollup/rollup-darwin-x64": "npm:4.31.0" + "@rollup/rollup-freebsd-arm64": "npm:4.31.0" + "@rollup/rollup-freebsd-x64": "npm:4.31.0" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.31.0" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.31.0" + "@rollup/rollup-linux-arm64-gnu": "npm:4.31.0" + "@rollup/rollup-linux-arm64-musl": "npm:4.31.0" + "@rollup/rollup-linux-loongarch64-gnu": "npm:4.31.0" + "@rollup/rollup-linux-powerpc64le-gnu": "npm:4.31.0" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.31.0" + "@rollup/rollup-linux-s390x-gnu": "npm:4.31.0" + "@rollup/rollup-linux-x64-gnu": "npm:4.31.0" + "@rollup/rollup-linux-x64-musl": "npm:4.31.0" + "@rollup/rollup-win32-arm64-msvc": "npm:4.31.0" + "@rollup/rollup-win32-ia32-msvc": "npm:4.31.0" + "@rollup/rollup-win32-x64-msvc": "npm:4.31.0" + "@types/estree": "npm:1.0.6" fsevents: "npm:~2.3.2" dependenciesMeta: "@rollup/rollup-android-arm-eabi": @@ -7304,12 +7332,20 @@ __metadata: optional: true "@rollup/rollup-darwin-x64": optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true "@rollup/rollup-linux-arm-gnueabihf": optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true "@rollup/rollup-linux-arm64-gnu": optional: true "@rollup/rollup-linux-arm64-musl": optional: true + "@rollup/rollup-linux-loongarch64-gnu": + optional: true "@rollup/rollup-linux-powerpc64le-gnu": optional: true "@rollup/rollup-linux-riscv64-gnu": @@ -7330,7 +7366,7 @@ __metadata: optional: true bin: rollup: dist/bin/rollup - checksum: 10/803b45976dfc73843a48083dc345821860e960aede010b0e765201cc2827fe131b6f29296da3186a48813b83f823cd26b77adcafcf32ba859efb1b62adb8f4e0 + checksum: 10/4f5fac0a0df7878ca810512c283df0e81b21d42fed262943b412c488a30beceb0149a4be36dbf2750b6c5cbfa4d4cf5097a134266f1425a9e213c2a2a09853fc languageName: node linkType: hard @@ -7357,7 +7393,7 @@ __metadata: languageName: node linkType: hard -"rxjs@npm:^7.5.5, rxjs@npm:^7.8.1": +"rxjs@npm:^7.5.5": version: 7.8.1 resolution: "rxjs@npm:7.8.1" dependencies: @@ -7366,6 +7402,15 @@ __metadata: languageName: node linkType: hard +"rxjs@npm:^7.8.2": + version: 7.8.2 + resolution: "rxjs@npm:7.8.2" + dependencies: + tslib: "npm:^2.1.0" + checksum: 10/03dff09191356b2b87d94fbc1e97c4e9eb3c09d4452399dddd451b09c2f1ba8d56925a40af114282d7bc0c6fe7514a2236ca09f903cf70e4bbf156650dddb49d + languageName: node + linkType: hard + "safe-buffer@npm:~5.1.0, safe-buffer@npm:~5.1.1": version: 5.1.2 resolution: "safe-buffer@npm:5.1.2" @@ -7396,12 +7441,21 @@ __metadata: languageName: node linkType: hard -"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.1": - version: 7.6.2 - resolution: "semver@npm:7.6.2" +"semver@npm:^7.0.0, semver@npm:^7.1.1, semver@npm:^7.3.4, semver@npm:^7.3.5, semver@npm:^7.3.7, semver@npm:^7.3.8, semver@npm:^7.5.3, semver@npm:^7.5.4, semver@npm:^7.6.0, semver@npm:^7.6.3": + version: 7.6.3 + resolution: "semver@npm:7.6.3" bin: semver: bin/semver.js - checksum: 10/296b17d027f57a87ef645e9c725bff4865a38dfc9caf29b26aa084b85820972fbe7372caea1ba6857162fa990702c6d9c1d82297cecb72d56c78ab29070d2ca2 + checksum: 10/36b1fbe1a2b6f873559cd57b238f1094a053dbfd997ceeb8757d79d1d2089c56d1321b9f1069ce263dc64cfa922fa1d2ad566b39426fe1ac6c723c1487589e10 + languageName: node + linkType: hard + +"semver@npm:^7.7.1": + version: 7.7.1 + resolution: "semver@npm:7.7.1" + bin: + semver: bin/semver.js + checksum: 10/4cfa1eb91ef3751e20fc52e47a935a0118d56d6f15a837ab814da0c150778ba2ca4f1a4d9068b33070ea4273629e615066664c2cfcd7c272caf7a8a0f6518b2c languageName: node linkType: hard @@ -7472,14 +7526,14 @@ __metadata: languageName: node linkType: hard -"sirv@npm:^2.0.4": - version: 2.0.4 - resolution: "sirv@npm:2.0.4" +"sirv@npm:^3.0.1": + version: 3.0.1 + resolution: "sirv@npm:3.0.1" dependencies: "@polka/url": "npm:^1.0.0-next.24" mrmime: "npm:^2.0.0" totalist: "npm:^3.0.0" - checksum: 10/24f42cf06895017e589c9d16fc3f1c6c07fe8b0dbafce8a8b46322cfba67b7f2498610183954cb0e9d089c8cb60002a7ee7e8bca6a91a0d7042bfbc3473c95c3 + checksum: 10/b110ebe28eb1740772fbbfacb6c71c58d1ec8ec17a5ae2852a5418c3ef41d52d473663613de808f8a6337ec29dd446414d0d059e75bfd13fb9630d18651c99f2 languageName: node linkType: hard @@ -7506,26 +7560,6 @@ __metadata: languageName: node linkType: hard -"slice-ansi@npm:^5.0.0": - version: 5.0.0 - resolution: "slice-ansi@npm:5.0.0" - dependencies: - ansi-styles: "npm:^6.0.0" - is-fullwidth-code-point: "npm:^4.0.0" - checksum: 10/7e600a2a55e333a21ef5214b987c8358fe28bfb03c2867ff2cbf919d62143d1812ac27b4297a077fdaf27a03da3678e49551c93e35f9498a3d90221908a1180e - languageName: node - linkType: hard - -"slice-ansi@npm:^7.1.0": - version: 7.1.0 - resolution: "slice-ansi@npm:7.1.0" - dependencies: - ansi-styles: "npm:^6.2.1" - is-fullwidth-code-point: "npm:^5.0.0" - checksum: 10/10313dd3cf7a2e4b265f527b1684c7c568210b09743fd1bd74f2194715ed13ffba653dc93a5fa79e3b1711518b8990a732cb7143aa01ddafe626e99dfa6474b2 - languageName: node - linkType: hard - "smart-buffer@npm:^4.2.0": version: 4.2.0 resolution: "smart-buffer@npm:4.2.0" @@ -7574,10 +7608,10 @@ __metadata: languageName: node linkType: hard -"source-map-js@npm:^1.2.0": - version: 1.2.0 - resolution: "source-map-js@npm:1.2.0" - checksum: 10/74f331cfd2d121c50790c8dd6d3c9de6be21926de80583b23b37029b0f37aefc3e019fa91f9a10a5e120c08135297e1ecf312d561459c45908cb1e0e365f49e5 +"source-map-js@npm:^1.2.0, source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10/ff9d8c8bf096d534a5b7707e0382ef827b4dd360a577d3f34d2b9f48e12c9d230b5747974ee7c607f0df65113732711bb701fe9ece3c7edbd43cb2294d707df3 languageName: node linkType: hard @@ -7647,16 +7681,7 @@ __metadata: languageName: node linkType: hard -"ssri@npm:^10.0.0": - version: 10.0.4 - resolution: "ssri@npm:10.0.4" - dependencies: - minipass: "npm:^5.0.0" - checksum: 10/3f3dc4a0bbde19a67a4e7bdbef0c94ea92643a5f835565c09107f0c3696de9079f65742e641b449e978db69751ac6e85dfdc3f2c2abfe221d1c346d5b7ed077f - languageName: node - linkType: hard - -"ssri@npm:^10.0.6": +"ssri@npm:^10.0.0, ssri@npm:^10.0.6": version: 10.0.6 resolution: "ssri@npm:10.0.6" dependencies: @@ -7672,17 +7697,10 @@ __metadata: languageName: node linkType: hard -"std-env@npm:^3.7.0": - version: 3.7.0 - resolution: "std-env@npm:3.7.0" - checksum: 10/6ee0cca1add3fd84656b0002cfbc5bfa20340389d9ba4720569840f1caa34bce74322aef4c93f046391583e50649d0cf81a5f8fe1d411e50b659571690a45f12 - languageName: node - linkType: hard - -"string-argv@npm:~0.3.2": - version: 0.3.2 - resolution: "string-argv@npm:0.3.2" - checksum: 10/f9d3addf887026b4b5f997a271149e93bf71efc8692e7dc0816e8807f960b18bcb9787b45beedf0f97ff459575ee389af3f189d8b649834cac602f2e857e75af +"std-env@npm:^3.8.0": + version: 3.8.0 + resolution: "std-env@npm:3.8.0" + checksum: 10/034176196cfcaaab16dbdd96fc9e925a9544799fb6dc5a3e36fe43270f3a287c7f779d785b89edaf22cef2b5f1dcada2aae67430b8602e785ee74bdb3f671768 languageName: node linkType: hard @@ -7708,17 +7726,6 @@ __metadata: languageName: node linkType: hard -"string-width@npm:^7.0.0": - version: 7.0.0 - resolution: "string-width@npm:7.0.0" - dependencies: - emoji-regex: "npm:^10.3.0" - get-east-asian-width: "npm:^1.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10/bc0de5700a2690895169fce447ec4ed44bc62de80312c2093d5606bfd48319bb88e48a99e97f269dff2bc9577448b91c26b3804c16e7d9b389699795e4655c3b - languageName: node - linkType: hard - "string_decoder@npm:^1.1.1": version: 1.3.0 resolution: "string_decoder@npm:1.3.0" @@ -7746,7 +7753,7 @@ __metadata: languageName: node linkType: hard -"strip-ansi@npm:^7.0.1, strip-ansi@npm:^7.1.0": +"strip-ansi@npm:^7.0.1": version: 7.1.0 resolution: "strip-ansi@npm:7.1.0" dependencies: @@ -7776,13 +7783,6 @@ __metadata: languageName: node linkType: hard -"strip-final-newline@npm:^3.0.0": - version: 3.0.0 - resolution: "strip-final-newline@npm:3.0.0" - checksum: 10/23ee263adfa2070cd0f23d1ac14e2ed2f000c9b44229aec9c799f1367ec001478469560abefd00c5c99ee6f0b31c137d53ec6029c53e9f32a93804e18c201050 - languageName: node - linkType: hard - "strip-indent@npm:^3.0.0": version: 3.0.0 resolution: "strip-indent@npm:3.0.0" @@ -7792,6 +7792,15 @@ __metadata: languageName: node linkType: hard +"strip-indent@npm:^4.0.0": + version: 4.0.0 + resolution: "strip-indent@npm:4.0.0" + dependencies: + min-indent: "npm:^1.0.1" + checksum: 10/06cbcd93da721c46bc13caeb1c00af93a9b18146a1c95927672d2decab6a25ad83662772417cea9317a2507fb143253ecc23c4415b64f5828cef9b638a744598 + languageName: node + linkType: hard + "strip-json-comments@npm:^3.1.1": version: 3.1.1 resolution: "strip-json-comments@npm:3.1.1" @@ -7799,7 +7808,7 @@ __metadata: languageName: node linkType: hard -"strong-log-transformer@npm:2.1.0, strong-log-transformer@npm:^2.1.0": +"strong-log-transformer@npm:2.1.0": version: 2.1.0 resolution: "strong-log-transformer@npm:2.1.0" dependencies: @@ -7847,6 +7856,21 @@ __metadata: languageName: node linkType: hard +"sync-content@npm:^2.0.1": + version: 2.0.1 + resolution: "sync-content@npm:2.0.1" + dependencies: + glob: "npm:^11.0.0" + mkdirp: "npm:^3.0.1" + path-scurry: "npm:^2.0.0" + rimraf: "npm:^6.0.0" + tshy: "npm:^3.0.0" + bin: + sync-content: dist/esm/bin.mjs + checksum: 10/43d7afcc3a706c6a254960c6c210ed9cdaeb88c07f5578c1d4f33ce7ae338be637456a28ff4311eeaf74cae7aaeb060af3cff6013d997589c7586fa32daa8a2b + languageName: node + linkType: hard + "synckit@npm:^0.9.1": version: 0.9.1 resolution: "synckit@npm:0.9.1" @@ -7916,13 +7940,6 @@ __metadata: languageName: node linkType: hard -"text-table@npm:^0.2.0": - version: 0.2.0 - resolution: "text-table@npm:0.2.0" - checksum: 10/4383b5baaeffa9bb4cda2ac33a4aa2e6d1f8aaf811848bf73513a9b88fd76372dc461f6fd6d2e9cb5100f48b473be32c6f95bd983509b7d92bb4d92c10747452 - languageName: node - linkType: hard - "thenify-all@npm:^1.0.0": version: 1.6.0 resolution: "thenify-all@npm:1.6.0" @@ -7958,31 +7975,48 @@ __metadata: languageName: node linkType: hard -"tinybench@npm:^2.8.0": - version: 2.8.0 - resolution: "tinybench@npm:2.8.0" - checksum: 10/9731d070bedee6d44f3bb565862c284776e6adfd70d81a051a5c79b77479408509b448ad8d467d538d18bc0ae857b3ead8168d7e98d7f1355f8a0b01aa2f163b +"tinybench@npm:^2.9.0": + version: 2.9.0 + resolution: "tinybench@npm:2.9.0" + checksum: 10/cfa1e1418e91289219501703c4693c70708c91ffb7f040fd318d24aef419fb5a43e0c0160df9471499191968b2451d8da7f8087b08c3133c251c40d24aced06c languageName: node linkType: hard -"tinypool@npm:^1.0.0": - version: 1.0.0 - resolution: "tinypool@npm:1.0.0" - checksum: 10/4041a9ae62200626dceedbf4e58589d067a203eadcb88588d5681369b9a3c68987de14ce220b32a7e4ebfabaaf51ab9fa69408a7758827b7873f8204cdc79aa1 +"tinyexec@npm:^0.3.2": + version: 0.3.2 + resolution: "tinyexec@npm:0.3.2" + checksum: 10/b9d5fed3166fb1acd1e7f9a89afcd97ccbe18b9c1af0278e429455f6976d69271ba2d21797e7c36d57d6b05025e525d2882d88c2ab435b60d1ddf2fea361de57 languageName: node linkType: hard -"tinyrainbow@npm:^1.2.0": - version: 1.2.0 - resolution: "tinyrainbow@npm:1.2.0" - checksum: 10/2924444db6804355e5ba2b6e586c7f77329d93abdd7257a069a0f4530dff9f16de484e80479094e3f39273462541b003a65ee3a6afc2d12555aa745132deba5d +"tinyglobby@npm:^0.2.12": + version: 0.2.12 + resolution: "tinyglobby@npm:0.2.12" + dependencies: + fdir: "npm:^6.4.3" + picomatch: "npm:^4.0.2" + checksum: 10/4ad28701fa9118b32ef0e27f409e0a6c5741e8b02286d50425c1f6f71e6d6c6ded9dd5bbbbb714784b08623c4ec4d150151f1d3d996cfabe0495f908ab4f7002 languageName: node linkType: hard -"tinyspy@npm:^3.0.0": - version: 3.0.0 - resolution: "tinyspy@npm:3.0.0" - checksum: 10/b5b686acff2b88de60ff8ecf89a2042320406aaeee2fba1828a7ea8a925fad3ed9f5e4d7a068154a9134473c472aa03da8ca92ee994bc57a741c5ede5fa7de4d +"tinypool@npm:^1.0.2": + version: 1.0.2 + resolution: "tinypool@npm:1.0.2" + checksum: 10/6109322f14b3763f65c8fa49fddab72cd3edd96b82dd50e05e63de74867329ff5353bff4377281ec963213d9314f37f4a353e9ee34bbac85fd4c1e4a568d6076 + languageName: node + linkType: hard + +"tinyrainbow@npm:^2.0.0": + version: 2.0.0 + resolution: "tinyrainbow@npm:2.0.0" + checksum: 10/94d4e16246972614a5601eeb169ba94f1d49752426312d3cf8cc4f2cc663a2e354ffc653aa4de4eebccbf9eeebdd0caef52d1150271fdfde65d7ae7f3dcb9eb5 + languageName: node + linkType: hard + +"tinyspy@npm:^3.0.2": + version: 3.0.2 + resolution: "tinyspy@npm:3.0.2" + checksum: 10/5db671b2ff5cd309de650c8c4761ca945459d7204afb1776db9a04fb4efa28a75f08517a8620c01ee32a577748802231ad92f7d5b194dc003ee7f987a2a06337 languageName: node linkType: hard @@ -8004,13 +8038,6 @@ __metadata: languageName: node linkType: hard -"to-fast-properties@npm:^2.0.0": - version: 2.0.0 - resolution: "to-fast-properties@npm:2.0.0" - checksum: 10/be2de62fe58ead94e3e592680052683b1ec986c72d589e7b21e5697f8744cdbf48c266fa72f6c15932894c10187b5f54573a3bcf7da0bfd964d5caf23d436168 - languageName: node - linkType: hard - "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -8048,19 +8075,12 @@ __metadata: languageName: node linkType: hard -"ts-api-utils@npm:^1.3.0": - version: 1.3.0 - resolution: "ts-api-utils@npm:1.3.0" +"ts-api-utils@npm:^2.0.1": + version: 2.0.1 + resolution: "ts-api-utils@npm:2.0.1" peerDependencies: - typescript: ">=4.2.0" - checksum: 10/3ee44faa24410cd649b5c864e068d438aa437ef64e9e4a66a41646a6d3024d3097a695eeb3fb26ee364705d3cb9653a65756d009e6a53badb6066a5f447bf7ed - languageName: node - linkType: hard - -"ts-expose-internals-conditionally@npm:1.0.0-empty.0": - version: 1.0.0-empty.0 - resolution: "ts-expose-internals-conditionally@npm:1.0.0-empty.0" - checksum: 10/6b4f546fc59f04f68d579f1bc0704541ec17521f84d32a15b45bef5dbc7a787143a065e19541cc5b64ff494f16f223bce59f3f5bf10ec538e5739e23c0efb878 + typescript: ">=4.8.4" + checksum: 10/2e68938cd5acad6b5157744215ce10cd097f9f667fd36b5fdd5efdd4b0c51063e855459d835f94f6777bb8a0f334916b6eb5c1eedab8c325feb34baa39238898 languageName: node linkType: hard @@ -8113,6 +8133,27 @@ __metadata: languageName: node linkType: hard +"tshy@npm:^3.0.0, tshy@npm:^3.0.2": + version: 3.0.2 + resolution: "tshy@npm:3.0.2" + dependencies: + chalk: "npm:^5.3.0" + chokidar: "npm:^3.6.0" + foreground-child: "npm:^3.1.1" + minimatch: "npm:^10.0.0" + mkdirp: "npm:^3.0.1" + polite-json: "npm:^5.0.0" + resolve-import: "npm:^2.0.0" + rimraf: "npm:^6.0.0" + sync-content: "npm:^2.0.1" + typescript: "npm:^5.5.3" + walk-up-path: "npm:^4.0.0" + bin: + tshy: dist/esm/index.js + checksum: 10/48ae27425cd1bc37fe07323e9d3ca120e53c7ff5de57a1d189e72bffdc573193abd3ba283009777b08653445615c31e42445006c5648765331d27780a8930f30 + languageName: node + linkType: hard + "tslib@npm:^2.1.0, tslib@npm:^2.3.0, tslib@npm:^2.4.0, tslib@npm:^2.6.2": version: 2.6.2 resolution: "tslib@npm:2.6.2" @@ -8131,58 +8172,58 @@ __metadata: languageName: node linkType: hard -"turbo-darwin-64@npm:2.1.1": - version: 2.1.1 - resolution: "turbo-darwin-64@npm:2.1.1" +"turbo-darwin-64@npm:2.4.4": + version: 2.4.4 + resolution: "turbo-darwin-64@npm:2.4.4" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"turbo-darwin-arm64@npm:2.1.1": - version: 2.1.1 - resolution: "turbo-darwin-arm64@npm:2.1.1" +"turbo-darwin-arm64@npm:2.4.4": + version: 2.4.4 + resolution: "turbo-darwin-arm64@npm:2.4.4" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"turbo-linux-64@npm:2.1.1": - version: 2.1.1 - resolution: "turbo-linux-64@npm:2.1.1" +"turbo-linux-64@npm:2.4.4": + version: 2.4.4 + resolution: "turbo-linux-64@npm:2.4.4" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"turbo-linux-arm64@npm:2.1.1": - version: 2.1.1 - resolution: "turbo-linux-arm64@npm:2.1.1" +"turbo-linux-arm64@npm:2.4.4": + version: 2.4.4 + resolution: "turbo-linux-arm64@npm:2.4.4" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"turbo-windows-64@npm:2.1.1": - version: 2.1.1 - resolution: "turbo-windows-64@npm:2.1.1" +"turbo-windows-64@npm:2.4.4": + version: 2.4.4 + resolution: "turbo-windows-64@npm:2.4.4" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"turbo-windows-arm64@npm:2.1.1": - version: 2.1.1 - resolution: "turbo-windows-arm64@npm:2.1.1" +"turbo-windows-arm64@npm:2.4.4": + version: 2.4.4 + resolution: "turbo-windows-arm64@npm:2.4.4" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"turbo@npm:^2.1.1": - version: 2.1.1 - resolution: "turbo@npm:2.1.1" - dependencies: - turbo-darwin-64: "npm:2.1.1" - turbo-darwin-arm64: "npm:2.1.1" - turbo-linux-64: "npm:2.1.1" - turbo-linux-arm64: "npm:2.1.1" - turbo-windows-64: "npm:2.1.1" - turbo-windows-arm64: "npm:2.1.1" +"turbo@npm:^2.4.4": + version: 2.4.4 + resolution: "turbo@npm:2.4.4" + dependencies: + turbo-darwin-64: "npm:2.4.4" + turbo-darwin-arm64: "npm:2.4.4" + turbo-linux-64: "npm:2.4.4" + turbo-linux-arm64: "npm:2.4.4" + turbo-windows-64: "npm:2.4.4" + turbo-windows-arm64: "npm:2.4.4" dependenciesMeta: turbo-darwin-64: optional: true @@ -8198,7 +8239,7 @@ __metadata: optional: true bin: turbo: bin/turbo - checksum: 10/4137d17936d1773cdf393ef503ebf6faf3bf08b366bc9b515b14c64a77841e81cff584d094883301d58e496516ac690f80368b5d926be8994b046ef06399c09f + checksum: 10/ea60911d280e85068ec31c58cf079e5eb423db9dfa3fc1f1fdb5456debb0c6395ef20040384b4d6400e22cfbc1590381a61c4be1bdc7a06bbdf6b9b92573c42a languageName: node linkType: hard @@ -8225,77 +8266,77 @@ __metadata: languageName: node linkType: hard -"typescript-eslint@npm:^8.3.0": - version: 8.3.0 - resolution: "typescript-eslint@npm:8.3.0" +"typescript-eslint@npm:^8.26.0": + version: 8.26.0 + resolution: "typescript-eslint@npm:8.26.0" dependencies: - "@typescript-eslint/eslint-plugin": "npm:8.3.0" - "@typescript-eslint/parser": "npm:8.3.0" - "@typescript-eslint/utils": "npm:8.3.0" - peerDependenciesMeta: - typescript: - optional: true - checksum: 10/15b98cf65edc4234a491eedb7ea251365052f4a509af4e11dee8fbdbcbf31f47ca08036aae25c8009b1be07fd3c093ebaa946d83cfe233920081a9f1b35cfa61 + "@typescript-eslint/eslint-plugin": "npm:8.26.0" + "@typescript-eslint/parser": "npm:8.26.0" + "@typescript-eslint/utils": "npm:8.26.0" + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: ">=4.8.4 <5.9.0" + checksum: 10/e9bcaf43932baed4e1af52715def5a6508af9eaac271c3dd8638734aed8e8e0681eb647447ae2565682d6d0bcc52b06722934eafa090259f2feff38d35f2e66c languageName: node linkType: hard -"typescript@npm:5.3.3": - version: 5.3.3 - resolution: "typescript@npm:5.3.3" +"typescript@npm:5.6.1-rc": + version: 5.6.1-rc + resolution: "typescript@npm:5.6.1-rc" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/6e4e6a14a50c222b3d14d4ea2f729e79f972fa536ac1522b91202a9a65af3605c2928c4a790a4a50aa13694d461c479ba92cedaeb1e7b190aadaa4e4b96b8e18 + checksum: 10/5716659d5baf142b5c84b96209b30730a5e9dcc0202f879349f9974823f7452ec4ef3904397b6d89d861c688acdbb1dad0a449d753163519fae2ee06ea4a68be languageName: node linkType: hard -"typescript@npm:>=3 < 6": - version: 5.4.5 - resolution: "typescript@npm:5.4.5" +"typescript@npm:>=3 < 6, typescript@npm:^5.5.3": + version: 5.7.3 + resolution: "typescript@npm:5.7.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/d04a9e27e6d83861f2126665aa8d84847e8ebabcea9125b9ebc30370b98cb38b5dff2508d74e2326a744938191a83a69aa9fddab41f193ffa43eabfdf3f190a5 + checksum: 10/6a7e556de91db3d34dc51cd2600e8e91f4c312acd8e52792f243c7818dfadb27bae677175fad6947f9c81efb6c57eb6b2d0c736f196a6ee2f1f7d57b74fc92fa languageName: node linkType: hard -"typescript@npm:^5.5.4": - version: 5.5.4 - resolution: "typescript@npm:5.5.4" +"typescript@npm:^5.8.2": + version: 5.8.2 + resolution: "typescript@npm:5.8.2" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/1689ccafef894825481fc3d856b4834ba3cc185a9c2878f3c76a9a1ef81af04194849840f3c69e7961e2312771471bb3b460ca92561e1d87599b26c37d0ffb6f + checksum: 10/dbc2168a55d56771f4d581997be52bab5cbc09734fec976cfbaabd787e61fb4c6cf9125fd48c6f98054ce549c77ecedefc7f64252a830dd8e9c3381f61fbeb78 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A5.3.3#optional!builtin": - version: 5.3.3 - resolution: "typescript@patch:typescript@npm%3A5.3.3#optional!builtin::version=5.3.3&hash=e012d7" +"typescript@patch:typescript@npm%3A5.6.1-rc#optional!builtin": + version: 5.6.1-rc + resolution: "typescript@patch:typescript@npm%3A5.6.1-rc#optional!builtin::version=5.6.1-rc&hash=8c6c40" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/c93786fcc9a70718ba1e3819bab56064ead5817004d1b8186f8ca66165f3a2d0100fee91fa64c840dcd45f994ca5d615d8e1f566d39a7470fc1e014dbb4cf15d + checksum: 10/462e0bb46c63abfc5bfc43f2bb00b9777a4228f3ed52d8930b46404dce71dbada63c27a99262ff4570b5ff7d01455701bfd36823bd3c766e443b6fa33cd31dea languageName: node linkType: hard -"typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin": - version: 5.4.5 - resolution: "typescript@patch:typescript@npm%3A5.4.5#optional!builtin::version=5.4.5&hash=5adc0c" +"typescript@patch:typescript@npm%3A>=3 < 6#optional!builtin, typescript@patch:typescript@npm%3A^5.5.3#optional!builtin": + version: 5.7.3 + resolution: "typescript@patch:typescript@npm%3A5.7.3#optional!builtin::version=5.7.3&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/760f7d92fb383dbf7dee2443bf902f4365db2117f96f875cf809167f6103d55064de973db9f78fe8f31ec08fff52b2c969aee0d310939c0a3798ec75d0bca2e1 + checksum: 10/dc58d777eb4c01973f7fbf1fd808aad49a0efdf545528dab9b07d94fdcb65b8751742804c3057e9619a4627f2d9cc85547fdd49d9f4326992ad0181b49e61d81 languageName: node linkType: hard -"typescript@patch:typescript@npm%3A^5.5.4#optional!builtin": - version: 5.5.4 - resolution: "typescript@patch:typescript@npm%3A5.5.4#optional!builtin::version=5.5.4&hash=379a07" +"typescript@patch:typescript@npm%3A^5.8.2#optional!builtin": + version: 5.8.2 + resolution: "typescript@patch:typescript@npm%3A5.8.2#optional!builtin::version=5.8.2&hash=5786d5" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 10/746fdd0865c5ce4f15e494c57ede03a9e12ede59cfdb40da3a281807853fe63b00ef1c912d7222143499aa82f18b8b472baa1830df8804746d09b55f6cf5b1cc + checksum: 10/97920a082ffc57583b1cb6bc4faa502acc156358e03f54c7fc7fdf0b61c439a717f4c9070c449ee9ee683d4cfc3bb203127c2b9794b2950f66d9d307a4ff262c languageName: node linkType: hard @@ -8308,10 +8349,10 @@ __metadata: languageName: node linkType: hard -"undici-types@npm:~6.19.2": - version: 6.19.6 - resolution: "undici-types@npm:6.19.6" - checksum: 10/0ea9bc25762a86597d095b3772f6cec0bcabb796c339f7dfa2bd601c745a480289eb2939848dc285a56d4f94f50c475868160d8d6d3f54e823f1faf7ea9e9468 +"undici-types@npm:~6.20.0": + version: 6.20.0 + resolution: "undici-types@npm:6.20.0" + checksum: 10/583ac7bbf4ff69931d3985f4762cde2690bb607844c16a5e2fbb92ed312fe4fa1b365e953032d469fa28ba8b224e88a595f0b10a449332f83fa77c695e567dbe languageName: node linkType: hard @@ -8329,6 +8370,13 @@ __metadata: languageName: node linkType: hard +"unicorn-magic@npm:^0.3.0": + version: 0.3.0 + resolution: "unicorn-magic@npm:0.3.0" + checksum: 10/bdd7d7c522f9456f32a0b77af23f8854f9a7db846088c3868ec213f9550683ab6a2bdf3803577eacbafddb4e06900974385841ccb75338d17346ccef45f9cb01 + languageName: node + linkType: hard + "unique-filename@npm:^3.0.0": version: 3.0.0 resolution: "unique-filename@npm:3.0.0" @@ -8368,17 +8416,17 @@ __metadata: languageName: node linkType: hard -"update-browserslist-db@npm:^1.0.13": - version: 1.0.13 - resolution: "update-browserslist-db@npm:1.0.13" +"update-browserslist-db@npm:^1.1.1": + version: 1.1.3 + resolution: "update-browserslist-db@npm:1.1.3" dependencies: - escalade: "npm:^3.1.1" - picocolors: "npm:^1.0.0" + escalade: "npm:^3.2.0" + picocolors: "npm:^1.1.1" peerDependencies: browserslist: ">= 4.21.0" bin: update-browserslist-db: cli.js - checksum: 10/9074b4ef34d2ed931f27d390aafdd391ee7c45ad83c508e8fed6aaae1eb68f81999a768ed8525c6f88d4001a4fbf1b8c0268f099d0e8e72088ec5945ac796acf + checksum: 10/87af2776054ffb9194cf95e0201547d041f72ee44ce54b144da110e65ea7ca01379367407ba21de5c9edd52c74d95395366790de67f3eb4cc4afa0fe4424e76f languageName: node linkType: hard @@ -8424,110 +8472,117 @@ __metadata: languageName: node linkType: hard -"validate-npm-package-name@npm:5.0.1": +"validate-npm-package-name@npm:5.0.1, validate-npm-package-name@npm:^5.0.0": version: 5.0.1 resolution: "validate-npm-package-name@npm:5.0.1" checksum: 10/0d583a1af23aeffea7748742cf22b6802458736fb8b60323ba5949763824d46f796474b0e1b9206beb716f9d75269e19dbd7795d6b038b29d561be95dd827381 languageName: node linkType: hard -"validate-npm-package-name@npm:^5.0.0": - version: 5.0.0 - resolution: "validate-npm-package-name@npm:5.0.0" - dependencies: - builtins: "npm:^5.0.0" - checksum: 10/5342a994986199b3c28e53a8452a14b2bb5085727691ea7aa0d284a6606b127c371e0925ae99b3f1ef7cc7d2c9de75f52eb61a3d1cc45e39bca1e3a9444cbb4e - languageName: node - linkType: hard - -"vite-node@npm:2.0.5": - version: 2.0.5 - resolution: "vite-node@npm:2.0.5" +"vite-node@npm:3.0.8": + version: 3.0.8 + resolution: "vite-node@npm:3.0.8" dependencies: cac: "npm:^6.7.14" - debug: "npm:^4.3.5" - pathe: "npm:^1.1.2" - tinyrainbow: "npm:^1.2.0" - vite: "npm:^5.0.0" + debug: "npm:^4.4.0" + es-module-lexer: "npm:^1.6.0" + pathe: "npm:^2.0.3" + vite: "npm:^5.0.0 || ^6.0.0" bin: vite-node: vite-node.mjs - checksum: 10/de259cdf4b9ff82f39ba92ffca99db8a80783efd2764d3553b62cd8c8864488d590114a75bc93a93bf5ba2a2086bea1bee4b0029da9e62c4c0d3bf6c1f364eed + checksum: 10/9a06d27d9f56f17cf9586cd36f19e4c275227f55f0d9b71c0002d7dbe1a76398cac836b639e2c2537be67f16adb33c40d6d64d3640a97696ebfdfd731e5ea13f languageName: node linkType: hard -"vite@npm:^5.0.0": - version: 5.2.8 - resolution: "vite@npm:5.2.8" +"vite@npm:^5.0.0 || ^6.0.0": + version: 6.0.9 + resolution: "vite@npm:6.0.9" dependencies: - esbuild: "npm:^0.20.1" + esbuild: "npm:^0.24.2" fsevents: "npm:~2.3.3" - postcss: "npm:^8.4.38" - rollup: "npm:^4.13.0" + postcss: "npm:^8.4.49" + rollup: "npm:^4.23.0" peerDependencies: - "@types/node": ^18.0.0 || >=20.0.0 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: ">=1.21.0" less: "*" lightningcss: ^1.21.0 sass: "*" + sass-embedded: "*" stylus: "*" sugarss: "*" - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 dependenciesMeta: fsevents: optional: true peerDependenciesMeta: "@types/node": optional: true + jiti: + optional: true less: optional: true lightningcss: optional: true sass: optional: true + sass-embedded: + optional: true stylus: optional: true sugarss: optional: true terser: optional: true + tsx: + optional: true + yaml: + optional: true bin: vite: bin/vite.js - checksum: 10/caa40343c2c4e6d8e257fccb4c3029f62909c319a86063ce727ed550925c0a834460b0d1ca20c4d6c915f35302aa1052f6ec5193099a47ce21d74b9b817e69e1 - languageName: node - linkType: hard - -"vitest@npm:^2.0.5": - version: 2.0.5 - resolution: "vitest@npm:2.0.5" - dependencies: - "@ampproject/remapping": "npm:^2.3.0" - "@vitest/expect": "npm:2.0.5" - "@vitest/pretty-format": "npm:^2.0.5" - "@vitest/runner": "npm:2.0.5" - "@vitest/snapshot": "npm:2.0.5" - "@vitest/spy": "npm:2.0.5" - "@vitest/utils": "npm:2.0.5" - chai: "npm:^5.1.1" - debug: "npm:^4.3.5" - execa: "npm:^8.0.1" - magic-string: "npm:^0.30.10" - pathe: "npm:^1.1.2" - std-env: "npm:^3.7.0" - tinybench: "npm:^2.8.0" - tinypool: "npm:^1.0.0" - tinyrainbow: "npm:^1.2.0" - vite: "npm:^5.0.0" - vite-node: "npm:2.0.5" + checksum: 10/6f4f27c602f997537df26cc9665763b402f5978a7381146f6c0b146888ee257484a7f140df79e495b922082ca608bd1f563b0be9e272d22c689aad2b1e1da440 + languageName: node + linkType: hard + +"vitest@npm:^3.0.8": + version: 3.0.8 + resolution: "vitest@npm:3.0.8" + dependencies: + "@vitest/expect": "npm:3.0.8" + "@vitest/mocker": "npm:3.0.8" + "@vitest/pretty-format": "npm:^3.0.8" + "@vitest/runner": "npm:3.0.8" + "@vitest/snapshot": "npm:3.0.8" + "@vitest/spy": "npm:3.0.8" + "@vitest/utils": "npm:3.0.8" + chai: "npm:^5.2.0" + debug: "npm:^4.4.0" + expect-type: "npm:^1.1.0" + magic-string: "npm:^0.30.17" + pathe: "npm:^2.0.3" + std-env: "npm:^3.8.0" + tinybench: "npm:^2.9.0" + tinyexec: "npm:^0.3.2" + tinypool: "npm:^1.0.2" + tinyrainbow: "npm:^2.0.0" + vite: "npm:^5.0.0 || ^6.0.0" + vite-node: "npm:3.0.8" why-is-node-running: "npm:^2.3.0" peerDependencies: "@edge-runtime/vm": "*" - "@types/node": ^18.0.0 || >=20.0.0 - "@vitest/browser": 2.0.5 - "@vitest/ui": 2.0.5 + "@types/debug": ^4.1.12 + "@types/node": ^18.0.0 || ^20.0.0 || >=22.0.0 + "@vitest/browser": 3.0.8 + "@vitest/ui": 3.0.8 happy-dom: "*" jsdom: "*" peerDependenciesMeta: "@edge-runtime/vm": optional: true + "@types/debug": + optional: true "@types/node": optional: true "@vitest/browser": @@ -8540,7 +8595,7 @@ __metadata: optional: true bin: vitest: vitest.mjs - checksum: 10/abb916e3496a3fa9e9d05ecd806332dc4000aa0e433f0cb1e99f9dd1fa5c06d2c66656874b9860a683cec0f32abe1519599babef02e5c0ca80e9afbcdbddfdbd + checksum: 10/83b246ded7dab20db40a0dfa93a45a7a4de3d41f1860889b53d2896761db48ca42b88d1a5d8920681d6f5b96b76a46d5ab27456affb89be7ea2138d95531c87e languageName: node linkType: hard @@ -8551,6 +8606,13 @@ __metadata: languageName: node linkType: hard +"walk-up-path@npm:^4.0.0": + version: 4.0.0 + resolution: "walk-up-path@npm:4.0.0" + checksum: 10/6a230b20e5de296895116dc12b09dafaec1f72b8060c089533d296e241aff059dfaebe0d015c77467f857e4b40c78e08f7481add76f340233a1f34fa8af9ed63 + languageName: node + linkType: hard + "wcwidth@npm:^1.0.0, wcwidth@npm:^1.0.1": version: 1.0.1 resolution: "wcwidth@npm:1.0.1" @@ -8660,17 +8722,6 @@ __metadata: languageName: node linkType: hard -"wrap-ansi@npm:^9.0.0": - version: 9.0.0 - resolution: "wrap-ansi@npm:9.0.0" - dependencies: - ansi-styles: "npm:^6.2.1" - string-width: "npm:^7.0.0" - strip-ansi: "npm:^7.1.0" - checksum: 10/b9d91564c091cf3978a7c18ca0f3e4d4606e83549dbe59cf76f5e77feefdd5ec91443155e8102630524d10a8c275efac8a7082c0f26fa43e6b989dc150d176ce - languageName: node - linkType: hard - "wrappy@npm:1": version: 1.0.2 resolution: "wrappy@npm:1.0.2" @@ -8745,15 +8796,6 @@ __metadata: languageName: node linkType: hard -"yaml@npm:~2.5.0": - version: 2.5.0 - resolution: "yaml@npm:2.5.0" - bin: - yaml: bin.mjs - checksum: 10/72e903fdbe3742058885205db4a6c9ff38e5f497f4e05e631264f7756083c05e7d10dfb5e4ce9d7a95de95338f9b20d19dd0b91c60c65f7d7608b6b3929820ad - languageName: node - linkType: hard - "yargs-parser@npm:21.1.1, yargs-parser@npm:^21.1.1": version: 21.1.1 resolution: "yargs-parser@npm:21.1.1"