diff --git a/.github/ISSUE_TEMPLATE/bug.yml b/.github/ISSUE_TEMPLATE/bug.yml index 43473ce..e8cfb9a 100644 --- a/.github/ISSUE_TEMPLATE/bug.yml +++ b/.github/ISSUE_TEMPLATE/bug.yml @@ -16,7 +16,7 @@ body: attributes: value: | ## Ask for help through appropriate channels - If you feel unsure about the cause of the problem, consider asking for help on for example [StackOverflow](https://stackoverflow.com/questions/ask) or our [Discord](https://discord.gg/mZyBkA936X) before posting a bug report. The issue tracker is not a help forum. + If you feel unsure about the cause of the problem, consider asking for help on for example [StackOverflow](https://stackoverflow.com/questions/ask) or our [Discord](https://discord.gg/JdEbBAKw6X) before posting a bug report. The issue tracker is not a help forum. - type: markdown attributes: value: | diff --git a/.github/ISSUE_TEMPLATE/question.yml b/.github/ISSUE_TEMPLATE/question.yml index f93f1fb..2acd841 100644 --- a/.github/ISSUE_TEMPLATE/question.yml +++ b/.github/ISSUE_TEMPLATE/question.yml @@ -13,7 +13,7 @@ body: For anything else, such as questions or getting help, please see: - [The Athenna help page](https://athenna.io/help) - - [Our `#help` channel in Discord](https://discord.gg/j6FKKQQrW9) + - [Our `#help` channel in Discord](https://discord.gg/JdEbBAKw6X) - The [AthennaIO](https://stackoverflow.com/questions/tagged/AthennaIO) tag on [StackOverflow](https://stackoverflow.com/questions/ask) - type: checkboxes id: no-post diff --git a/.github/SUPPORT.md b/.github/SUPPORT.md index 4ffe318..45f9168 100644 --- a/.github/SUPPORT.md +++ b/.github/SUPPORT.md @@ -1,3 +1,3 @@ -Please note this issue tracker is not a help forum. We recommend using [StackOverflow](https://stackoverflow.com/questions/tagged/athennaio) or [Discord channel](https://discord.gg/mZyBkA936X) for questions. +Please note this issue tracker is not a help forum. We recommend using [StackOverflow](https://stackoverflow.com/questions/tagged/athennaio) or [Discord channel](https://discord.gg/JdEbBAKw6X) for questions. diff --git a/.github/workflows/cd.yml b/.github/workflows/cd.yml index 33d0647..2fb4dac 100644 --- a/.github/workflows/cd.yml +++ b/.github/workflows/cd.yml @@ -15,7 +15,7 @@ jobs: fetch-depth: 0 - uses: actions/setup-node@v1 with: - node-version: '18.x' + node-version: '20.x' registry-url: 'https://registry.npmjs.org' - name: Install dependencies @@ -24,17 +24,8 @@ jobs: - name: Compile code run: npm run build - - name: Copy README to build - run: cp README.md build/README.md | true - - - name: Copy LICENSE to build - run: cp LICENSE.md build/LICENSE.md | true - - - name: Copy templates to build - run: cp -r templates build/templates | true - - - name: Copy configurer to build - run: cp -r configurer build/configurer | true + - name: Install production dependencies + run: cd build && npm ci --omit=dev - name: Automatic GitHub Release uses: justincy/github-action-npm-release@2.0.1 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9e75bfa..0cfdb76 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -14,8 +14,7 @@ jobs: strategy: matrix: node-version: - - 16.13.1 - - 18.x + - 20.x steps: - uses: actions/checkout@v2 with: @@ -39,8 +38,7 @@ jobs: strategy: matrix: node-version: - - 16.13.1 - - 18.x + - 20.x steps: - uses: actions/checkout@v2 - name: Use Node.js ${{ matrix.node-version }} diff --git a/bin/artisan.ts b/bin/artisan.ts deleted file mode 100644 index 65bd403..0000000 --- a/bin/artisan.ts +++ /dev/null @@ -1,74 +0,0 @@ -#!/usr/bin/env node --input-type=module --experimental-import-meta-resolve - -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Ignite } from '#src' - -/* -|-------------------------------------------------------------------------- -| Core testing -|-------------------------------------------------------------------------- -| -| This property helps the @athenna/core package to test the implementation -| of the Ignite class. With this env as "true", Athenna will not resolve -| the application root path because the package is not inside a node_modu -| les folder when running locally and in pipelines. -| -*/ - -process.env.CORE_TESTING = 'false' - -Config.set('rc.commands', { - 'make:exception': '#src/commands/MakeExceptionCommand', - 'make:facade': '#src/commands/MakeFacadeCommand', - 'make:provider': '#src/commands/MakeProviderCommand', - 'make:service': '#src/commands/MakeServiceCommand', - 'make:test': '#src/commands/MakeTestCommand', - serve: { - entrypoint: '#bin/http', - path: '#src/commands/ServeCommand' - }, - test: { - entrypoint: '#bin/test', - path: '#src/commands/TestCommand' - }, - repl: { - entrypoint: '#bin/repl', - path: '#src/commands/ReplCommand' - }, - greet: '#tests/fixtures/commands/GreetCommand' -}) - -/* -|-------------------------------------------------------------------------- -| Ignite -|-------------------------------------------------------------------------- -| -| Here is where your application will bootstrap. Ignite class will be res -| ponsible to bootstrap your application partial or complete. Is not reco -| mmended to bootstrap the Athenna application completely by calling the -| "fire" method, you should always let the type of application determine if -| the application should be fully bootstrapped or not. -| -*/ - -const ignite = await new Ignite().load(import.meta.url, { bootLogs: false }) - -/* -|-------------------------------------------------------------------------- -| Artisan -|-------------------------------------------------------------------------- -| -| Bootstrap the Artisan application setting the Node.js argv and custom op -| tions. -| -*/ - -await ignite.artisan(process.argv, { displayName: 'Artisan' }) diff --git a/bin/http.ts b/bin/http.ts deleted file mode 100644 index 5b43eb1..0000000 --- a/bin/http.ts +++ /dev/null @@ -1,50 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Ignite } from '#src' - -/* -|-------------------------------------------------------------------------- -| Core testing -|-------------------------------------------------------------------------- -| -| This property helps the @athenna/core package to test the implementation -| of the Ignite class. With this env as "true", Athenna will not resolve -| the application root path because the package is not inside a node_modu -| les folder when running locally and in pipelines. -| -*/ - -process.env.CORE_TESTING = 'true' - -/* -|-------------------------------------------------------------------------- -| Ignite -|-------------------------------------------------------------------------- -| -| Here is where your application will bootstrap. Ignite class will be res -| ponsible to bootstrap your application partial or complete. Is not reco -| mmended to bootstrap the Athenna application completelly by calling the -| "fire" method, you should always let the type of application determine if -| the application should be fully bootstrapped or not. -| -*/ - -const ignite = await new Ignite().load(import.meta.url) - -/* -|-------------------------------------------------------------------------- -| Http server -|-------------------------------------------------------------------------- -| -| Bootstrap the http application setting the Node.js setting custom options. -| -*/ - -await ignite.httpServer() diff --git a/bin/main.ts b/bin/main.ts new file mode 100644 index 0000000..46ead82 --- /dev/null +++ b/bin/main.ts @@ -0,0 +1,12 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +console.log('Hello from #bin/main!') +console.log(process.env.APP_ENV) +console.log(process.env.NODE_ENV) diff --git a/bin/repl.ts b/bin/repl.ts index 42499fc..c8225e1 100644 --- a/bin/repl.ts +++ b/bin/repl.ts @@ -7,44 +7,6 @@ * file that was distributed with this source code. */ -import { Ignite } from '#src' - -/* -|-------------------------------------------------------------------------- -| Core testing -|-------------------------------------------------------------------------- -| -| This property helps the @athenna/core package to test the implementation -| of the Ignite class. With this env as "true", Athenna will not resolve -| the application root path because the package is not inside a node_modu -| les folder when running locally and in pipelines. -| -*/ - -process.env.CORE_TESTING = 'false' - -/* -|-------------------------------------------------------------------------- -| Ignite -|-------------------------------------------------------------------------- -| -| Here is where your application will bootstrap. Ignite class will be res -| ponsible to bootstrap your application partial or complete. Is not reco -| mmended to bootstrap the Athenna application completelly by calling the -| "fire" method, you should always let the type of application determine if -| the application should be fully bootstrapped or not. -| -*/ - -const ignite = await new Ignite().load(import.meta.url, { bootLogs: false }) - -/* -|-------------------------------------------------------------------------- -| REPL Session -|-------------------------------------------------------------------------- -| -| Bootstrap the repl application. -| -*/ - -await ignite.repl() +console.log('Hello from #bin/repl!') +console.log(process.env.APP_ENV) +console.log(process.env.NODE_ENV) diff --git a/bin/test.ts b/bin/test.ts index 30041ef..9f01e22 100644 --- a/bin/test.ts +++ b/bin/test.ts @@ -11,7 +11,13 @@ import { request } from '@athenna/http/testing/plugins' import { command } from '@athenna/artisan/testing/plugins' import { Runner, assert, specReporter } from '@athenna/test' -process.env.CORE_TESTING = 'true' +if (process.argv.includes('--cmd')) { + console.log(process.argv) + console.log('Hello from #bin/test!') + console.log(process.env.APP_ENV) + console.log(process.env.NODE_ENV) + process.exit(0) +} await Runner.setTsEnv() .addPlugin(assert()) diff --git a/bin/tsconfig.build.json b/bin/tsconfig.build.json deleted file mode 100644 index 88ef64e..0000000 --- a/bin/tsconfig.build.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "extends": "../tsconfig.json", - "include": ["../src", "../templates", "../configurer", "../package.json"], - "exclude": ["../bin", "../build", "../tests", "../node_modules"] -} diff --git a/node b/node deleted file mode 100755 index 5a47d02..0000000 --- a/node +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash - -# This file is useful for development purposes because -# it allows you to run TypeScript files without having -# to add the --loader option every time. - -# Usage: - -# ./node --version -# ./node bin/test.ts -# ./node --inspect bin/test.ts - -# Usage with "sh" or "bash": - -# sh node --version -# sh node bin/test.ts -# sh node --inspect bin/test.ts - -# Node.js executable with all arguments required to run the application. -node="node --loader=ts-node/esm --experimental-import-meta-resolve --no-warnings" - -$node "$@" diff --git a/package-lock.json b/package-lock.json index ebb00c3..73b379a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,32 +1,30 @@ { "name": "@athenna/core", - "version": "4.9.0", + "version": "4.10.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@athenna/core", - "version": "4.9.0", + "version": "4.10.0", "license": "MIT", "dependencies": { "pretty-repl": "^3.1.2", "semver": "^7.5.4" }, "devDependencies": { - "@athenna/artisan": "^4.10.0", - "@athenna/common": "^4.13.1", - "@athenna/config": "^4.4.0", - "@athenna/http": "^4.8.0", - "@athenna/ioc": "^4.4.0", - "@athenna/logger": "^4.5.0", - "@athenna/test": "^4.7.0", - "@athenna/view": "^4.3.0", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", - "c8": "^7.12.0", + "@athenna/artisan": "^4.15.0", + "@athenna/common": "^4.18.0", + "@athenna/config": "^4.7.0", + "@athenna/http": "^4.11.0", + "@athenna/ioc": "^4.7.0", + "@athenna/logger": "^4.8.0", + "@athenna/test": "^4.12.0", + "@athenna/tsconfig": "^4.9.2", + "@athenna/view": "^4.6.0", + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", "commitizen": "^4.2.6", - "copyfiles": "^2.4.1", - "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", "eslint": "^8.36.0", "eslint-config-prettier": "^8.8.0", @@ -37,11 +35,19 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^3.1.0", "lint-staged": "^12.5.0", - "prettier": "^2.8.7", - "reflect-metadata": "^0.1.13", - "rimraf": "^5.0.1", - "ts-node": "^10.9.1", - "typescript": "^5.0.2" + "prettier": "^2.8.7" + }, + "engines": { + "node": ">=20.0.0" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@apidevtools/json-schema-ref-parser": { @@ -56,6 +62,24 @@ "js-yaml": "^4.1.0" } }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@apidevtools/json-schema-ref-parser/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@apidevtools/openapi-schemas": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", @@ -72,9 +96,9 @@ "dev": true }, "node_modules/@athenna/artisan": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/@athenna/artisan/-/artisan-4.10.0.tgz", - "integrity": "sha512-GKXnl2/K3ouUcEZHK6YrKPJQ6XnnpKKjfiDIXIJQLPigNpi6jIdZYF+P4Eu92on7xV4SGJFjLyFLQk1EbGeWdg==", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/@athenna/artisan/-/artisan-4.15.0.tgz", + "integrity": "sha512-w3cgelmuO1GeQE3cswsOFDPPSvTVYpXE6H3VOlIaCetELPDnwp7b3PUG70WdvXUQD/j690LjiFFbY2qgM1pAlQ==", "dev": true, "dependencies": { "chalk-rainbow": "^1.0.0", @@ -82,797 +106,461 @@ "cli-table3": "^0.6.3", "columnify": "^1.6.0", "commander": "^9.5.0", - "cross-env": "^7.0.3", "figlet": "^1.6.0", - "inquirer": "^9.2.10", + "inquirer": "^9.2.11", "log-update": "^5.0.1", "ora": "^6.3.1" - } - }, - "node_modules/@athenna/artisan/node_modules/ansi-regex": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", - "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", - "dev": true, - "engines": { - "node": ">=12" }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@athenna/artisan/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "node_modules/@athenna/common": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@athenna/common/-/common-4.18.0.tgz", + "integrity": "sha512-vYUEcQu80V5zjFf0WjKJ7f9XmhmtziFUL1l6VfH+h6ZHnNWvcjlIYoHU1pONTnVC9b8vFElrJHWz7xo5IDFvIA==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@fastify/formbody": "^7.4.0", + "bytes": "^3.1.2", + "callsite": "^1.0.0", + "chalk": "^5.3.0", + "change-case": "^4.1.2", + "collect.js": "^4.36.1", + "execa": "^8.0.1", + "fastify": "^4.23.2", + "got": "^12.6.1", + "http-status-codes": "^2.2.0", + "is-wsl": "^2.2.0", + "kind-of": "^6.0.3", + "lodash": "^4.17.21", + "mime-types": "^2.1.35", + "minimatch": "^5.1.6", + "ms": "^2.1.3", + "parent-module": "^3.0.0", + "pluralize": "^8.0.0", + "prepend-file": "^2.0.1", + "uuid": "^8.3.2", + "validator-brazil": "^1.2.2", + "youch": "^3.3.1", + "youch-terminal": "^2.2.2" }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@athenna/artisan/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", + "node_modules/@athenna/config": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@athenna/config/-/config-4.7.0.tgz", + "integrity": "sha512-WXx5Tsx6BBVq+QlX5Tm+HMUp+b/ft15YC4oFvdRi3Gj6HBXIcEPpw2zsdLS+Qa/TDDuwa2bYLrToBtLd8EpXpw==", "dev": true, "dependencies": { - "restore-cursor": "^4.0.0" + "dotenv": "^16.3.1", + "magicast": "^0.2.11", + "syntax-error": "^1.4.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20.0.0" } }, - "node_modules/@athenna/artisan/node_modules/cli-width": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", - "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "node_modules/@athenna/http": { + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/@athenna/http/-/http-4.11.0.tgz", + "integrity": "sha512-H49Sz+Iop1iq8t4r8uKu1HMuCmgOGzRXhWQYZ6/vdpFYWIXj/ARrbJUqvlDjgCZfgu37uoYuE5EG+QsfgkdYVQ==", "dev": true, "engines": { - "node": ">= 12" + "node": ">=20.0.0" } }, - "node_modules/@athenna/artisan/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/@athenna/ioc": { + "version": "4.7.0", + "resolved": "https://registry.npmjs.org/@athenna/ioc/-/ioc-4.7.0.tgz", + "integrity": "sha512-TTyNLjtNPk+P5DHmKT/IuMiNFdXKI7yMsiJyA6DSlLTZSSt8tPzbSPQYY0EvfQX19EFihiaSXX5/I+De8MUnpQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "awilix": "^7.0.3" }, "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/@athenna/artisan/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/@athenna/artisan/node_modules/escape-string-regexp": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", - "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", - "dev": true, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20.0.0" } }, - "node_modules/@athenna/artisan/node_modules/figures": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", - "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", + "node_modules/@athenna/logger": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/@athenna/logger/-/logger-4.8.0.tgz", + "integrity": "sha512-V88sEF8D/pwCmuh2zDZu+BhgL/M4e0MQrmxUvefa82//pytFuDYpNowqKFdUjPEL1zcuocskEeE0nnquOW3rIw==", "dev": true, "dependencies": { - "escape-string-regexp": "^5.0.0", - "is-unicode-supported": "^1.2.0" + "cls-rtracer": "^2.6.3", + "telegraf": "^4.13.1" }, "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=20.0.0" } }, - "node_modules/@athenna/artisan/node_modules/figures/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/@athenna/test": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/@athenna/test/-/test-4.12.0.tgz", + "integrity": "sha512-rBEOCVXomQtVR9568L7icSQHOE+PmkVbsDjb4Ac0icICR/Nji0O4l9O7DfizSpaAttH4bB9SLhVaFBsrBQNjAw==", "dev": true, - "engines": { - "node": ">=12" + "dependencies": { + "@japa/assert": "^1.4.1", + "@japa/run-failed-tests": "^1.1.0", + "@japa/runner": "^2.2.2", + "@japa/spec-reporter": "^1.3.3", + "@types/sinon": "^10.0.16", + "c8": "^8.0.1", + "sinon": "^15.1.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=20.0.0" } }, - "node_modules/@athenna/artisan/node_modules/inquirer": { - "version": "9.2.10", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.10.tgz", - "integrity": "sha512-tVVNFIXU8qNHoULiazz612GFl+yqNfjMTbLuViNJE/d860Qxrd3NMrse8dm40VUQLOQeULvaQF8lpAhvysjeyA==", + "node_modules/@athenna/tsconfig": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/@athenna/tsconfig/-/tsconfig-4.9.2.tgz", + "integrity": "sha512-7+NbU5ULAX5a2yJtr1nVu1KxF+IlkbneAs+r3J1ICb01m5+s9qIxhxB/txuRhR4Rior2hNzp6lp0TSOAofzeKg==", "dev": true, "dependencies": { - "@ljharb/through": "^2.3.9", - "ansi-escapes": "^4.3.2", - "chalk": "^5.3.0", - "cli-cursor": "^3.1.0", - "cli-width": "^4.1.0", - "external-editor": "^3.1.0", - "figures": "^5.0.0", + "copyfiles": "^2.4.1", + "cross-env": "^7.0.3", "lodash": "^4.17.21", - "mute-stream": "1.0.0", - "ora": "^5.4.1", - "run-async": "^3.0.0", - "rxjs": "^7.8.1", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^6.2.0" - }, - "engines": { - "node": ">=14.18.0" + "reflect-metadata": "^0.1.13", + "rimraf": "^5.0.5", + "ts-node": "^10.9.1", + "typescript": "^5.2.2" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "node_modules/@athenna/view": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@athenna/view/-/view-4.6.0.tgz", + "integrity": "sha512-K/IJNB7blaNCqvHCjFwzMgd+m6Gh1Qt1mBkUKi0KIgNFY1GHZ/GqD+/8n11RSfwReEpP0Loj42uynN+icw/ELA==", "dev": true, + "dependencies": { + "edge.js": "^5.5.1" + }, "engines": { - "node": ">=8" + "node": ">=20.0.0" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/@babel/code-frame": { + "version": "7.22.13", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz", + "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "@babel/highlight": "^7.22.13", + "chalk": "^2.4.2" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=6.9.0" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/cli-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "node_modules/@babel/code-frame/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/@babel/code-frame/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=0.8.0" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/restore-cursor": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", - "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "node_modules/@babel/code-frame/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, - "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "node_modules/@babel/code-frame/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "node_modules/@babel/helper-string-parser": { + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", + "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@athenna/artisan/node_modules/inquirer/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "node_modules/@babel/helper-validator-identifier": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@athenna/artisan/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/@babel/highlight": { + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz", + "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==", "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0" + }, "engines": { - "node": ">=8" + "node": ">=6.9.0" } }, - "node_modules/@athenna/artisan/node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/@athenna/artisan/node_modules/log-update/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "type-fest": "^1.0.2" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/@athenna/artisan/node_modules/log-update/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.8.0" } }, - "node_modules/@athenna/artisan/node_modules/mute-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", - "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + "node": ">=4" } }, - "node_modules/@athenna/artisan/node_modules/ora": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", - "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "chalk": "^5.0.0", - "cli-cursor": "^4.0.0", - "cli-spinners": "^2.6.1", - "is-interactive": "^2.0.0", - "is-unicode-supported": "^1.1.0", - "log-symbols": "^5.1.0", - "stdin-discarder": "^0.1.0", - "strip-ansi": "^7.0.1", - "wcwidth": "^1.0.1" + "has-flag": "^3.0.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, - "node_modules/@athenna/artisan/node_modules/ora/node_modules/is-interactive": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", - "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", + "node_modules/@babel/parser": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz", + "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==", "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, "engines": { - "node": ">=12" + "node": ">=6.0.0" + } + }, + "node_modules/@babel/types": { + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz", + "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==", + "dev": true, + "dependencies": { + "@babel/helper-string-parser": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20", + "to-fast-properties": "^2.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@athenna/artisan/node_modules/ora/node_modules/is-unicode-supported": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", - "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "node_modules/@bcoe/v8-coverage": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", + "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", + "dev": true + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true, + "optional": true, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=0.1.90" } }, - "node_modules/@athenna/artisan/node_modules/ora/node_modules/log-symbols": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", - "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", + "node_modules/@commitlint/config-validator": { + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-17.6.7.tgz", + "integrity": "sha512-vJSncmnzwMvpr3lIcm0I8YVVDJTzyjy7NZAeXbTXy+MPUdAr9pKyyg7Tx/ebOQ9kqzE6O9WT6jg2164br5UdsQ==", "dev": true, + "optional": true, "dependencies": { - "chalk": "^5.0.0", - "is-unicode-supported": "^1.1.0" + "@commitlint/types": "^17.4.4", + "ajv": "^8.11.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=v14" } }, - "node_modules/@athenna/artisan/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dev": true, + "optional": true, "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/@athenna/artisan/node_modules/run-async": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", - "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true, + "optional": true + }, + "node_modules/@commitlint/execute-rule": { + "version": "17.4.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-17.4.0.tgz", + "integrity": "sha512-LIgYXuCSO5Gvtc0t9bebAMSwd68ewzmqLypqI2Kke1rqOqqDbMpYcYfoPfFlv9eyLIh4jocHWwCK5FS7z9icUA==", + "dev": true, + "optional": true, "engines": { - "node": ">=0.12.0" + "node": ">=v14" } }, - "node_modules/@athenna/artisan/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/@commitlint/load": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-17.7.2.tgz", + "integrity": "sha512-XA7WTnsjHZ4YH6ZYsrnxgLdXzriwMMq+utZUET6spbOEEIPBCDLdOQXS26P+v3TTO4hUHOEhzUquaBv3jbBixw==", "dev": true, + "optional": true, "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "@commitlint/config-validator": "^17.6.7", + "@commitlint/execute-rule": "^17.4.0", + "@commitlint/resolve-extends": "^17.6.7", + "@commitlint/types": "^17.4.4", + "@types/node": "20.5.1", + "chalk": "^4.1.0", + "cosmiconfig": "^8.0.0", + "cosmiconfig-typescript-loader": "^4.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0", + "resolve-from": "^5.0.0", + "ts-node": "^10.8.1", + "typescript": "^4.6.4 || ^5.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=v14" } }, - "node_modules/@athenna/artisan/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "node_modules/@commitlint/load/node_modules/@types/node": { + "version": "20.5.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.1.tgz", + "integrity": "sha512-4tT2UrL5LBqDwoed9wZ6N3umC4Yhz3W3FloMmiiG4JwmUJWpie0c7lcnUNd4gtMKuDEO4wRVS8B6Xa0uMRsMKg==", + "dev": true, + "optional": true + }, + "node_modules/@commitlint/load/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "optional": true, "dependencies": { - "ansi-regex": "^6.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/@athenna/artisan/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, + "optional": true, "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { - "node": ">=12" + "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/@athenna/common": { - "version": "4.13.1", - "resolved": "https://registry.npmjs.org/@athenna/common/-/common-4.13.1.tgz", - "integrity": "sha512-9Dq7azVqW2qAjxO/T6RARaz8VXZ4U4bXAiaNVkxtpgB0+Gr8pbKmNnRqJzMgAYhD/Bxx2WWqgcYjZEfRKgnYqA==", + "node_modules/@commitlint/load/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, - "dependencies": { - "@fastify/formbody": "^7.4.0", - "bytes": "^3.1.2", - "callsite": "^1.0.0", - "chalk": "^5.3.0", - "change-case": "^4.1.2", - "collect.js": "^4.36.1", - "fastify": "^4.22.1", - "got": "^12.6.1", - "http-status-codes": "^2.2.0", - "is-wsl": "^2.2.0", - "kind-of": "^6.0.3", - "lodash": "^4.17.21", - "mime-types": "^2.1.35", - "minimatch": "^5.1.6", - "ms": "^2.1.3", - "parent-module": "^3.0.0", - "pluralize": "^8.0.0", - "prepend-file": "^2.0.1", - "uuid": "^8.3.2", - "validator-brazil": "^1.2.2", - "youch": "^3.2.3", - "youch-terminal": "^2.2.2" - } - }, - "node_modules/@athenna/config": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@athenna/config/-/config-4.4.0.tgz", - "integrity": "sha512-Xu8jku7pWIqqq+eb/mk73rFmBCZ94mTT3mKhrj9zzgnqaWD9uDWJNqnUTKVfbHSxR6ojM7TMaVdfNDICgM+/qA==", - "dev": true, - "dependencies": { - "dotenv": "^16.3.1", - "magicast": "^0.2.10", - "syntax-error": "^1.4.0" - } - }, - "node_modules/@athenna/http": { - "version": "4.8.0", - "resolved": "https://registry.npmjs.org/@athenna/http/-/http-4.8.0.tgz", - "integrity": "sha512-oogmQRt4dJTPdNc1tPEHXy5vDPUDV2rFnR+i6oU05rKlD3gNYVTXbaQHDAvvwrAs+BdofNMRakPx2NvpLs5WbQ==", - "dev": true - }, - "node_modules/@athenna/ioc": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@athenna/ioc/-/ioc-4.4.0.tgz", - "integrity": "sha512-rMgfpVMRB6wNLmQZ+wJw8aJRRcKXSCG8cElsO4e6gS1u1TzEKGyrAYwfih0HBH2ot1VPbRveYCUgLtqZHAUhFg==", - "dev": true, - "dependencies": { - "awilix": "^7.0.3" - } - }, - "node_modules/@athenna/logger": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/@athenna/logger/-/logger-4.5.0.tgz", - "integrity": "sha512-/2a99UHFWQxuUX7gO0QgQZED5SxUKGvM5MWz5N8mxUEbN5+28aK3h+xKC/9Zq8DxuC9uuwMnnhZhGeOmqnQutQ==", - "dev": true, - "dependencies": { - "cls-rtracer": "^2.6.3", - "telegraf": "^4.12.2" - } - }, - "node_modules/@athenna/test": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@athenna/test/-/test-4.7.0.tgz", - "integrity": "sha512-2g5M9SVY55IIJ/ucznwUPIJIdRJXt5a1r4eR2oLGLR/EEdvCyDEf4oRCjCIfsM5KBq3H0ubHRm5ec7dAISg4HQ==", - "dev": true, - "dependencies": { - "@japa/assert": "^1.4.1", - "@japa/run-failed-tests": "^1.1.0", - "@japa/runner": "^2.2.2", - "@japa/spec-reporter": "^1.3.3", - "@types/sinon": "^10.0.16", - "sinon": "^15.1.0" - } - }, - "node_modules/@athenna/view": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@athenna/view/-/view-4.3.0.tgz", - "integrity": "sha512-tgvIKZh0h3I8I9Nigsy7SdjmsHfkE3fGd9ZI1cZwQUrU2u1UqwWgJuVfae4YnjAT3yAdtiG0MmAs8kmaAFlh6A==", - "dev": true, - "dependencies": { - "edge.js": "^5.5.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.16.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", - "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.16.7" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz", - "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.5.tgz", - "integrity": "sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.17.9", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.17.9.tgz", - "integrity": "sha512-J9PfEKCbFIv2X5bjTMiZu6Vf341N05QIY+d6FvVKynkG1S7G0j3I0QoRtWIrXhZ+/Nlb5Q0MzqL7TokEJ5BNHg==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.16.7", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.10.tgz", - "integrity": "sha512-lNbdGsQb9ekfsnjFGhEiF4hfFqGgfOP3H3d27re3n+CGhNuTSUEQdfWk556sTLNTloczcdM5TYF2LhzmDQKyvQ==", - "dev": true, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/types": { - "version": "7.22.10", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.10.tgz", - "integrity": "sha512-obaoigiLrlDZ7TUQln/8m4mSqIW2QFeOrCQc9r+xsaHGNoplVNYlRVpsfE8Vj35GEm2ZH4ZhrNYogs/3fj85kg==", - "dev": true, - "dependencies": { - "@babel/helper-string-parser": "^7.22.5", - "@babel/helper-validator-identifier": "^7.22.5", - "to-fast-properties": "^2.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@commitlint/config-validator": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-16.2.1.tgz", - "integrity": "sha512-hogSe0WGg7CKmp4IfNbdNES3Rq3UEI4XRPB8JL4EPgo/ORq5nrGTVzxJh78omibNuB8Ho4501Czb1Er1MoDWpw==", - "dev": true, - "optional": true, - "dependencies": { - "@commitlint/types": "^16.2.1", - "ajv": "^6.12.6" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/execute-rule": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-16.2.1.tgz", - "integrity": "sha512-oSls82fmUTLM6cl5V3epdVo4gHhbmBFvCvQGHBRdQ50H/690Uq1Dyd7hXMuKITCIdcnr9umyDkr8r5C6HZDF3g==", - "dev": true, - "optional": true, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/load": { - "version": "16.2.3", - "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-16.2.3.tgz", - "integrity": "sha512-Hb4OUlMnBUK6UxJEZ/VJ5k0LocIS7PtEMbRXEAA7eSpOgORIFexC4K/RaRpVd5UTtu3M0ST3ddPPijF9rdW6nw==", - "dev": true, - "optional": true, - "dependencies": { - "@commitlint/config-validator": "^16.2.1", - "@commitlint/execute-rule": "^16.2.1", - "@commitlint/resolve-extends": "^16.2.1", - "@commitlint/types": "^16.2.1", - "@types/node": ">=12", - "chalk": "^4.0.0", - "cosmiconfig": "^7.0.0", - "cosmiconfig-typescript-loader": "^1.0.0", - "lodash": "^4.17.19", - "resolve-from": "^5.0.0", - "typescript": "^4.4.3" - }, - "engines": { - "node": ">=v12" - } - }, - "node_modules/@commitlint/load/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "optional": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/@commitlint/load/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "optional": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/@commitlint/load/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "optional": true, + "optional": true, "dependencies": { "color-name": "~1.1.4" }, @@ -887,49 +575,35 @@ "dev": true, "optional": true }, - "node_modules/@commitlint/load/node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "optional": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, "node_modules/@commitlint/resolve-extends": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-16.2.1.tgz", - "integrity": "sha512-NbbCMPKTFf2J805kwfP9EO+vV+XvnaHRcBy6ud5dF35dxMsvdJqke54W3XazXF1ZAxC4a3LBy4i/GNVBAthsEg==", + "version": "17.6.7", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-17.6.7.tgz", + "integrity": "sha512-PfeoAwLHtbOaC9bGn/FADN156CqkFz6ZKiVDMjuC2N5N0740Ke56rKU7Wxdwya8R8xzLK9vZzHgNbuGhaOVKIg==", "dev": true, "optional": true, "dependencies": { - "@commitlint/config-validator": "^16.2.1", - "@commitlint/types": "^16.2.1", + "@commitlint/config-validator": "^17.6.7", + "@commitlint/types": "^17.4.4", "import-fresh": "^3.0.0", - "lodash": "^4.17.19", + "lodash.mergewith": "^4.6.2", "resolve-from": "^5.0.0", "resolve-global": "^1.0.0" }, "engines": { - "node": ">=v12" + "node": ">=v14" } }, "node_modules/@commitlint/types": { - "version": "16.2.1", - "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-16.2.1.tgz", - "integrity": "sha512-7/z7pA7BM0i8XvMSBynO7xsB3mVQPUZbVn6zMIlp/a091XJ3qAXRXc+HwLYhiIdzzS5fuxxNIHZMGHVD4HJxdA==", + "version": "17.4.4", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-17.4.4.tgz", + "integrity": "sha512-amRN8tRLYOsxRr6mTnGGGvB5EmW/4DDjLMgiwK3CCVEmN6Sr/6xePGEpWaspKkckILuUORCwe6VfDBw6uj4axQ==", "dev": true, "optional": true, "dependencies": { - "chalk": "^4.0.0" + "chalk": "^4.1.0" }, "engines": { - "node": ">=v12" + "node": ">=v14" } }, "node_modules/@commitlint/types/node_modules/ansi-styles": { @@ -1013,23 +687,23 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.1.tgz", - "integrity": "sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==", + "version": "4.9.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.1.tgz", + "integrity": "sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } }, "node_modules/@eslint/eslintrc": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.1.tgz", - "integrity": "sha512-eFRmABvW2E5Ho6f5fHLqgena46rOj7r7OKHYfLElqcBfGFHHpjBhivyi5+jOEQuSpdc/1phIZJlbC2te+tZNIw==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz", + "integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==", "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", - "espree": "^9.5.0", + "espree": "^9.6.0", "globals": "^13.19.0", "ignore": "^5.2.0", "import-fresh": "^3.2.1", @@ -1044,9 +718,15 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "dependencies": { @@ -1054,6 +734,18 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1067,9 +759,9 @@ } }, "node_modules/@eslint/js": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.36.0.tgz", - "integrity": "sha512-lxJ9R5ygVm8ZWgYdUweoq5ownDlJ4upvoWmO4eLxBYHdMo+vZ/Rx0EN6MbKWDJOSUGrqJy2Gt+Dyv/VKml0fjg==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.50.0.tgz", + "integrity": "sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -1115,9 +807,9 @@ "dev": true }, "node_modules/@fastify/error": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.3.0.tgz", - "integrity": "sha512-dj7vjIn1Ar8sVXj2yAXiMNCJDmS9MQ9XMlIecX2dIzzhjSHCyKo4DdXjXMs7wKW2kj6yvVRSpuQjOZ3YLrh56w==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.0.tgz", + "integrity": "sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==", "dev": true }, "node_modules/@fastify/fast-json-stringify-compiler": { @@ -1140,9 +832,9 @@ } }, "node_modules/@humanwhocodes/config-array": { - "version": "0.11.8", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", - "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "version": "0.11.11", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz", + "integrity": "sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==", "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^1.2.1", @@ -1235,6 +927,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/@isaacs/cliui/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -1309,23 +1007,20 @@ } }, "node_modules/@japa/base-reporter": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@japa/base-reporter/-/base-reporter-1.1.1.tgz", - "integrity": "sha512-ahhlu5kni6rp5zlANDM1oeqqFADlNLMY/ZV6EAywKz5SBik3AgFVeTt5nw+aX8L5FIYEh9xPPvnfLSzgzxha2Q==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@japa/base-reporter/-/base-reporter-1.1.2.tgz", + "integrity": "sha512-6MYs/EsXjouFPNUQL3VGllryZ5enI5rqhvQbY2Dzh3Zmhu22DWw6v9d2pxucrFptDTtQ38MBPVL/BIeZAafmOw==", "dev": true, "dependencies": { "@japa/errors-printer": "^2.1.0", "@poppinss/cliui": "^3.0.5", "ms": "^2.1.3" - }, - "peerDependencies": { - "@japa/core": "^7.0.0" } }, "node_modules/@japa/core": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/@japa/core/-/core-7.3.1.tgz", - "integrity": "sha512-5RjVmiVjqpwo8tiPxYZ289YxMEfFEByZv5mEqhrWVnZVmzx1T/6IsBc17DY8uhP7xOKfAiphw3NTyOeQob+WKw==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/@japa/core/-/core-7.3.3.tgz", + "integrity": "sha512-3mkWlzWVALZANFfMK6Q6xtYGM3mpzZeeGGUVQGDt2OOxvL8FDADVxHrRn9BFc1V4fVJO4jR/QH5utrb+RfCF5g==", "dev": true, "dependencies": { "@poppinss/hooks": "^6.0.2-0", @@ -1361,27 +1056,13 @@ "@japa/runner": "^2.2.3" } }, - "node_modules/@japa/run-failed-tests/node_modules/fs-extra": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.0.tgz", - "integrity": "sha512-0rcTq621PD5jM/e0a3EJoGC/1TC5ZBCERW82LQuwfGnCa1V8w7dpYH1yNu+SLb6E5dkeCBzKEyLGlFrnr+dUyw==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^6.0.1", - "universalify": "^2.0.0" - }, - "engines": { - "node": ">=14.14" - } - }, "node_modules/@japa/runner": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-2.2.3.tgz", - "integrity": "sha512-DUAzEOHQr31vEEi9qi3G9/uZjlDOeA0iYkIKmpu1ezCZseR1g846af6Em+Vn0Tdk02+dIaMAT1JPOfJT2lEebg==", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/@japa/runner/-/runner-2.5.1.tgz", + "integrity": "sha512-p1zjniMCiGxRnZkUs5WtZjTQhbXcnK0aM2Wu4Qc+w+MBpmOrw5J2zJuge0FweepTUR9CT3r2x65uw4qIshy8XQ==", "dev": true, "dependencies": { - "@japa/core": "^7.3.1", + "@japa/core": "^7.3.2", "@japa/errors-printer": "^2.1.0", "@poppinss/cliui": "^3.0.5", "@poppinss/hooks": "^6.0.2-0", @@ -1403,12 +1084,12 @@ } }, "node_modules/@jest/schemas": { - "version": "29.4.2", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.4.2.tgz", - "integrity": "sha512-ZrGzGfh31NtdVH8tn0mgJw4khQuNHiKqdzJAFbCaERbyCP9tHlxWuL/mnMu8P7e/+k4puWjI1NOzi/sFsjce/g==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", "dev": true, "dependencies": { - "@sinclair/typebox": "^0.25.16" + "@sinclair/typebox": "^0.27.8" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -1476,18 +1157,18 @@ "dev": true }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", - "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.11", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", - "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { @@ -1575,6 +1256,83 @@ "string-width": "^4.2.2" } }, + "node_modules/@poppinss/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@poppinss/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@poppinss/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@poppinss/cliui/node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@poppinss/cliui/node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@poppinss/cliui/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, "node_modules/@poppinss/colors": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@poppinss/colors/-/colors-3.0.3.tgz", @@ -1635,9 +1393,9 @@ } }, "node_modules/@sinclair/typebox": { - "version": "0.25.21", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.25.21.tgz", - "integrity": "sha512-gFukHN4t8K4+wVC+ECqeqwzBDeFeTzBXroBTqE6vcWrQGbEUpHO7LYdG0f4xnvYq4VOEwITSlHlp0JBAIFMS/g==", + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sindresorhus/is": { @@ -1696,51 +1454,6 @@ "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", "dev": true }, - "node_modules/@swc/core": { - "version": "1.3.34", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.3.34.tgz", - "integrity": "sha512-kaOCGRpciMEs2FpCUFaPJSNHgggFteOGZToM88uL5k/CEy0nU/6wzl8kUO5J+rI/8/8vN7qyhM1Ajhyj3WCSsw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "peer": true, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.3.34", - "@swc/core-darwin-x64": "1.3.34", - "@swc/core-linux-arm-gnueabihf": "1.3.34", - "@swc/core-linux-arm64-gnu": "1.3.34", - "@swc/core-linux-arm64-musl": "1.3.34", - "@swc/core-linux-x64-gnu": "1.3.34", - "@swc/core-linux-x64-musl": "1.3.34", - "@swc/core-win32-arm64-msvc": "1.3.34", - "@swc/core-win32-ia32-msvc": "1.3.34", - "@swc/core-win32-x64-msvc": "1.3.34" - } - }, - "node_modules/@swc/core-darwin-arm64": { - "version": "1.3.34", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.34.tgz", - "integrity": "sha512-m7+kybVLO9uo/TiGBlf/ISmpmm27I/NrFEBGOVBF2xNOs5BY1XHHM6ddbPPckQa38C19nWeAzdJPwGzJw+qO3A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "peer": true, - "engines": { - "node": ">=10" - } - }, "node_modules/@szmarczak/http-timer": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-5.0.1.tgz", @@ -1753,52 +1466,58 @@ "node": ">=14.16" } }, + "node_modules/@telegraf/types": { + "version": "6.9.1", + "resolved": "https://registry.npmjs.org/@telegraf/types/-/types-6.9.1.tgz", + "integrity": "sha512-bzqwhicZq401T0e09tu8b1KvGfJObPmzKU/iKCT5V466AsAZZWQrBYQ5edbmD1VZuHLEwopoOVY5wPP4HaLtug==", + "dev": true + }, "node_modules/@tsconfig/node10": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.8.tgz", - "integrity": "sha512-6XFfSQmMgq0CFLY1MslA/CPUfhIL919M1rMsa5lP2P097N2Wd1sSX0tx1u4olM16fLNhtHZpRhedZJphNJqmZg==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", "dev": true }, "node_modules/@tsconfig/node12": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.9.tgz", - "integrity": "sha512-/yBMcem+fbvhSREH+s14YJi18sp7J9jpuhYByADT2rypfajMZZN4WQ6zBGgBKp53NKmqI36wFYDb3yaMPurITw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", "dev": true }, "node_modules/@tsconfig/node14": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.1.tgz", - "integrity": "sha512-509r2+yARFfHHE7T6Puu2jjkoycftovhXRqW328PDXTVGKihlb1P8Z9mMZH04ebyajfRY7dedfGynlrFHJUQCg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", "dev": true }, "node_modules/@tsconfig/node16": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.2.tgz", - "integrity": "sha512-eZxlbI8GZscaGS7kkc/trHTT5xgrjH3/1n2JDwusC9iahPKWMRvRjJSAN5mCXviuTGQ/lHnhvv8Q1YTpnfz9gA==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", "dev": true }, "node_modules/@types/bytes": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.1.tgz", - "integrity": "sha512-lOGyCnw+2JVPKU3wIV0srU0NyALwTBJlVSx5DfMQOFuuohA8y9S8orImpuIQikZ0uIQ8gehrRjxgQC1rLRi11w==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@types/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-92b6q7CSYBMVZDtMZh5PuKm3LjZwcU7s6H8e9sU20Z1tOrTuXN+Hz3VuP9E8axiQRaCoiEOMN1duqPCEIhamrQ==", "dev": true }, "node_modules/@types/chai": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", - "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.6.tgz", + "integrity": "sha512-VOVRLM1mBxIRxydiViqPcKn6MIxZytrbMpd6RJLIWKxUNr3zux8no0Oc7kJx0WAPIitgZ0gkrDS+btlqQpubpw==", "dev": true }, "node_modules/@types/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.0.tgz", - "integrity": "sha512-uH2smqTN4uGReAiKedIVzoLUAXIYLBTbSofhx3hbNqj74Ua6KqFsLYszduTrLCMEAEAozF73DbGi/SC1bzQq4g==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@types/he/-/he-1.2.1.tgz", + "integrity": "sha512-CdNmJMcSqX1BiP3iSsWt+VgixndRIDGzWyaGpBnW3i5heATSk5bJu2j3buutsoBQNjyryqxaNpr8M7fRsGL15w==", "dev": true }, "node_modules/@types/http-cache-semantics": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.1.tgz", - "integrity": "sha512-SZs7ekbP8CN0txVG2xVRH6EgKmEm31BOxA07vkFaETzZz1xh+cbt8BcI0slpymvwhx5dlFnQG2rTlPVQn+iRPQ==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.2.tgz", + "integrity": "sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==", "dev": true }, "node_modules/@types/istanbul-lib-coverage": { @@ -1808,9 +1527,9 @@ "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -1827,99 +1546,94 @@ } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.13", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.13.tgz", + "integrity": "sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==", "dev": true }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "dev": true }, "node_modules/@types/node": { - "version": "17.0.29", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.29.tgz", - "integrity": "sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA==", - "dev": true + "version": "20.8.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.8.2.tgz", + "integrity": "sha512-Vvycsc9FQdwhxE3y3DzeIxuEJbWGDsnrxvMADzTDF/lcdR9/K+AQIeAghTQsHtotg/q0j3WEOYS/jQgSdWue3w==", + "dev": true, + "peer": true }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.2.tgz", + "integrity": "sha512-lqa4UEhhv/2sjjIQgjX8B+RBjj47eo0mzGasklVJ78UKGQY1r0VpB9XHDaZZO9qzEFDdy4MrXLuEaSmPrPSe/A==", "dev": true }, - "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true, - "optional": true - }, "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==", "dev": true }, "node_modules/@types/sinon": { - "version": "10.0.16", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.16.tgz", - "integrity": "sha512-j2Du5SYpXZjJVJtXBokASpPRj+e2z+VUhCPHmM6WMfe3dpHu6iVKJMU6AiBcMp/XTAYnEj6Wc1trJUWwZ0QaAQ==", + "version": "10.0.18", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-10.0.18.tgz", + "integrity": "sha512-OpQC9ug8BcnNxue2WF5aTruMaDRFn6NyfaE4DmAKOlQMn54b7CnCvDFV3wj5fk/HbSSTYmOYs2bTb5ShANjyQg==", "dev": true, "dependencies": { "@types/sinonjs__fake-timers": "*" } }, "node_modules/@types/sinonjs__fake-timers": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.2.tgz", - "integrity": "sha512-9GcLXF0/v3t80caGs5p2rRfkB+a8VBGLJZVih6CNFkx8IZ994wiKKLSRs9nuFwk1HevWs/1mnUmkApGrSGsShA==", + "version": "8.1.3", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.3.tgz", + "integrity": "sha512-4g+2YyWe0Ve+LBh+WUm1697PD0Kdi6coG1eU0YjQbwx61AZ8XbEpL1zIT6WjuUKrCMCROpEaYQPDjBnDouBVAQ==", "dev": true }, "node_modules/@types/yargs": { - "version": "15.0.15", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.15.tgz", - "integrity": "sha512-IziEYMU9XoVj8hWg7k+UJrXALkGFjWJhn5QFEv9q4p+v40oZhSuC135M38st8XPjICL7Ey4TV64ferBGUoJhBg==", + "version": "15.0.16", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.16.tgz", + "integrity": "sha512-2FeD5qezW3FvLpZ0JpfuaEWepgNLl9b2gQYiz/ce0NhoB1W/D+VZu98phITXkADYerfr/jb7JcDcVhITsc9bwg==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==", "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz", - "integrity": "sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.7.4.tgz", + "integrity": "sha512-DAbgDXwtX+pDkAHwiGhqP3zWUGpW49B7eqmgpPtg+BKJXwdct79ut9+ifqOFPJGClGKSHXn2PTBatCnldJRUoA==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/type-utils": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/type-utils": "6.7.4", + "@typescript-eslint/utils": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha", + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1928,25 +1642,26 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.56.0.tgz", - "integrity": "sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.7.4.tgz", + "integrity": "sha512-I5zVZFY+cw4IMZUeNCU7Sh2PO5O57F7Lr0uyhgCJmhN/BuTlnc55KxPonR4+EM3GBdfiCyGZye6DgMjtubQkmA==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1955,16 +1670,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz", - "integrity": "sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.7.4.tgz", + "integrity": "sha512-SdGqSLUPTXAXi7c3Ob7peAGVnmMoGzZ361VswK2Mqf8UOYcODiYvs8rs5ILqEdfvX1lE7wEZbLyELCW+Yrql1A==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0" + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -1972,25 +1687,25 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz", - "integrity": "sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.7.4.tgz", + "integrity": "sha512-n+g3zi1QzpcAdHFP9KQF+rEFxMb2KxtnJGID3teA/nxKHOVi3ylKovaqEzGBbVY2pBttU6z85gp0D00ufLzViQ==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.56.0", - "@typescript-eslint/utils": "5.56.0", + "@typescript-eslint/typescript-estree": "6.7.4", + "@typescript-eslint/utils": "6.7.4", "debug": "^4.3.4", - "tsutils": "^3.21.0" + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "*" + "eslint": "^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { "typescript": { @@ -1999,12 +1714,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.56.0.tgz", - "integrity": "sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.7.4.tgz", + "integrity": "sha512-o9XWK2FLW6eSS/0r/tgjAGsYasLAnOWg7hvZ/dGYSSNjCh+49k5ocPN8OmG5aZcSJ8pclSOyVKP2x03Sj+RrCA==", "dev": true, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2012,21 +1727,21 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz", - "integrity": "sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.7.4.tgz", + "integrity": "sha512-ty8b5qHKatlNYd9vmpHooQz3Vki3gG+3PchmtsA4TgrZBKWHNjWfkQid7K7xQogBqqc7/BhGazxMD5vr6Ha+iQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/visitor-keys": "5.56.0", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/visitor-keys": "6.7.4", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2039,64 +1754,41 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.56.0.tgz", - "integrity": "sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.7.4.tgz", + "integrity": "sha512-PRQAs+HUn85Qdk+khAxsVV+oULy3VkbH3hQ8hxLRJXWBEd7iI+GbQxH5SEUSH7kbEoTp6oT1bOwyga24ELALTA==", "dev": true, "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.56.0", - "@typescript-eslint/types": "5.56.0", - "@typescript-eslint/typescript-estree": "5.56.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "6.7.4", + "@typescript-eslint/types": "6.7.4", + "@typescript-eslint/typescript-estree": "6.7.4", + "semver": "^7.5.4" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/typescript-eslint" }, "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/@typescript-eslint/utils/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" + "eslint": "^7.0.0 || ^8.0.0" } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.56.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz", - "integrity": "sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==", + "version": "6.7.4", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.7.4.tgz", + "integrity": "sha512-pOW37DUhlTZbvph50x5zZCkFn3xzwkGtNoJHzIM3svpiSkJzwOYr/kVBaXmf+RAQiUDs1AHEZVNPg6UJCJpwRA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.56.0", - "eslint-visitor-keys": "^3.3.0" + "@typescript-eslint/types": "6.7.4", + "eslint-visitor-keys": "^3.4.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + "node": "^16.0.0 || >=18.0.0" }, "funding": { "type": "opencollective", @@ -2122,9 +1814,9 @@ "dev": true }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -2428,28 +2120,6 @@ "node": ">=8" } }, - "node_modules/api-schema-builder/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/api-schema-builder/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/archy": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", @@ -2463,21 +2133,37 @@ "dev": true }, "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -2496,15 +2182,34 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2515,14 +2220,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -2532,25 +2237,47 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/as-table": { - "version": "1.0.55", - "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", - "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", "dev": true, "dependencies": { - "printable-characters": "^1.0.42" + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/as-table": { + "version": "1.0.55", + "resolved": "https://registry.npmjs.org/as-table/-/as-table-1.0.55.tgz", + "integrity": "sha512-xvsWESUJn0JN421Xb9MQw6AsMHRCUknCe0Wjlxvjud80mU4E6hQf1A6NzQKcYNmYw62MfzEtXc+badstZP3JpQ==", + "dev": true, + "dependencies": { + "printable-characters": "^1.0.42" } }, "node_modules/assert": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/assert/-/assert-2.0.0.tgz", - "integrity": "sha512-se5Cd+js9dXJnu6Ag2JFc00t+HmHOen+8Q+L7O9zI0PqQXr20uk2J0XQqMxZEeo5U50o8Nvmmx7dZrl+Ufr35A==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-2.1.0.tgz", + "integrity": "sha512-eLHpSK/Y4nhMJ07gDaAzoX/XAKS8PSaojml3M0DM4JpV1LAi5JOJ/p6H/XWrl8L+DzVEvVCW1z3vWAaB9oTsQw==", "dev": true, "dependencies": { - "es6-object-assign": "^1.1.0", - "is-nan": "^1.2.1", - "object-is": "^1.0.1", - "util": "^0.12.0" + "call-bind": "^1.0.2", + "is-nan": "^1.3.2", + "object-is": "^1.1.5", + "object.assign": "^4.1.4", + "util": "^0.12.5" } }, "node_modules/assertion-error": { @@ -2584,9 +2311,9 @@ } }, "node_modules/astring": { - "version": "1.8.4", - "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.4.tgz", - "integrity": "sha512-97a+l2LBU3Op3bBQEff79i/E4jMD2ZLFD8rHx9B6mXyB2uQwhJQYfiDqUwtfjF4QA1F2qs//N6Cw8LetMbQjcw==", + "version": "1.8.6", + "resolved": "https://registry.npmjs.org/astring/-/astring-1.8.6.tgz", + "integrity": "sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==", "dev": true, "bin": { "astring": "bin/astring" @@ -2682,16 +2409,39 @@ ] }, "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", + "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", "dev": true, "dependencies": { - "buffer": "^5.5.0", + "buffer": "^6.0.3", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, + "node_modules/bl/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/bl/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -2714,9 +2464,9 @@ } }, "node_modules/buffer": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", - "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", + "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", "dev": true, "funding": [ { @@ -2734,7 +2484,7 @@ ], "dependencies": { "base64-js": "^1.3.1", - "ieee754": "^1.1.13" + "ieee754": "^1.2.1" } }, "node_modules/buffer-alloc": { @@ -2778,9 +2528,9 @@ } }, "node_modules/c8": { - "version": "7.12.0", - "resolved": "https://registry.npmjs.org/c8/-/c8-7.12.0.tgz", - "integrity": "sha512-CtgQrHOkyxr5koX1wEUmN/5cfDa2ckbHRA4Gy5LAL0zaCFtVWJS5++n+w4/sr2GWGerBxgTjpKeDclk/Qk6W/A==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/c8/-/c8-8.0.1.tgz", + "integrity": "sha512-EINpopxZNH1mETuI0DzRA4MZpAUH+IFiRhnmFD3vFr3vdrgxqi3VfE3KL0AIL+zDq8rC9bZqwM/VDmmoe04y7w==", "dev": true, "dependencies": { "@bcoe/v8-coverage": "^0.2.3", @@ -2788,19 +2538,19 @@ "find-up": "^5.0.0", "foreground-child": "^2.0.0", "istanbul-lib-coverage": "^3.2.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-reports": "^3.1.4", + "istanbul-lib-report": "^3.0.1", + "istanbul-reports": "^3.1.6", "rimraf": "^3.0.2", "test-exclude": "^6.0.0", "v8-to-istanbul": "^9.0.0", - "yargs": "^16.2.0", - "yargs-parser": "^20.2.9" + "yargs": "^17.7.2", + "yargs-parser": "^21.1.1" }, "bin": { "c8": "bin/c8.js" }, "engines": { - "node": ">=10.12.0" + "node": ">=12" } }, "node_modules/c8/node_modules/rimraf": { @@ -2828,12 +2578,12 @@ } }, "node_modules/cacheable-request": { - "version": "10.2.13", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.13.tgz", - "integrity": "sha512-3SD4rrMu1msNGEtNSt8Od6enwdo//U9s4ykmXfA2TD58kcLkCobtCDiby7kNyj7a/Q7lz/mAesAFI54rTdnvBA==", + "version": "10.2.14", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-10.2.14.tgz", + "integrity": "sha512-zkDT5WAF4hSSoUgyfg5tFIxz8XQK+25W/TLVojJTMKBaxevLBBtLxgqguAuVQB8PVW79FVjHcU+GJ9tVbDZ9mQ==", "dev": true, "dependencies": { - "@types/http-cache-semantics": "^4.0.1", + "@types/http-cache-semantics": "^4.0.2", "get-stream": "^6.0.1", "http-cache-semantics": "^4.1.1", "keyv": "^4.5.3", @@ -2888,7 +2638,7 @@ "node_modules/caller-callsite": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", - "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "integrity": "sha512-JuG3qI4QOftFsZyOn1qq87fq5grLIyk1JYd5lJmdA+fG7aQ9pA/i3JIJGcO3q0MrRcHlOt1U+ZeHW8Dq9axALQ==", "dev": true, "dependencies": { "callsites": "^2.0.0" @@ -2900,7 +2650,7 @@ "node_modules/caller-callsite/node_modules/callsites": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", - "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "integrity": "sha512-ksWePWBloaWPxJYQ8TL0JHvtci6G5QTKwQ95RcWAa/lzoAKuAOflGdAK92hpHXjkwb8zLxoLNUoNYZgVsaJzvQ==", "dev": true, "engines": { "node": ">=4" @@ -2909,7 +2659,7 @@ "node_modules/caller-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", - "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "integrity": "sha512-MCL3sf6nCSXOwCTzvPKhN18TU7AHTvdtam8DAogxcrJ8Rjfbbg7Lgng64H9Iy+vUV6VGFClN/TyxBkAebLRR4A==", "dev": true, "dependencies": { "caller-callsite": "^2.0.0" @@ -2928,12 +2678,15 @@ } }, "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.1.0.tgz", + "integrity": "sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/camel-case": { @@ -2958,18 +2711,18 @@ } }, "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -3096,10 +2849,13 @@ } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -3144,9 +2900,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", - "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.1.tgz", + "integrity": "sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==", "dev": true, "engines": { "node": ">=6" @@ -3198,6 +2954,12 @@ "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, "node_modules/cli-truncate/node_modules/string-width": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", @@ -3216,9 +2978,9 @@ } }, "node_modules/cli-truncate/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -3231,23 +2993,76 @@ } }, "node_modules/cli-width": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", - "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "engines": { - "node": ">= 10" + "node": ">= 12" } }, "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", "dev": true, "dependencies": { "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", + "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/cliui/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cliui/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cliui/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cliui/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/clone": { @@ -3286,10 +3101,14 @@ } }, "node_modules/cls-rtracer/node_modules/uuid": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", - "integrity": "sha512-MXcSTerfPa4uqyzStbRoTgt5XIe3x5+42+q1sDuy3R5MDk66URdLMOZe5aPX/SQd+kuYAh0FdP/pO28IkQyTeg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -3300,107 +3119,371 @@ "integrity": "sha512-jd97xWPKgHn6uvK31V6zcyPd40lUJd7gpYxbN2VOVxGWO4tyvS9Li4EpsFjXepGTo2tYcOTC4a8YsbQXMJ4XUw==", "dev": true }, - "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "dev": true + }, + "node_modules/columnify": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", + "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "dev": true, + "dependencies": { + "strip-ansi": "^6.0.1", + "wcwidth": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/commander": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", + "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || >=14" + } + }, + "node_modules/commitizen": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz", + "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==", + "dev": true, + "dependencies": { + "cachedir": "2.3.0", + "cz-conventional-changelog": "3.3.0", + "dedent": "0.7.0", + "detect-indent": "6.1.0", + "find-node-modules": "^2.1.2", + "find-root": "1.1.0", + "fs-extra": "9.1.0", + "glob": "7.2.3", + "inquirer": "8.2.5", + "is-utf8": "^0.2.1", + "lodash": "4.17.21", + "minimist": "1.2.7", + "strip-bom": "4.0.0", + "strip-json-comments": "3.1.1" + }, + "bin": { + "commitizen": "bin/commitizen", + "cz": "bin/git-cz", + "git-cz": "bin/git-cz" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/commitizen/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/commitizen/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/commitizen/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/commitizen/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/commitizen/node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/commitizen/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/commitizen/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/commitizen/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/commitizen/node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/commitizen/node_modules/fs-extra": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", + "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "dev": true, + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/commitizen/node_modules/inquirer": { + "version": "8.2.5", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", + "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.5.5", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/commitizen/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/commitizen/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/commitizen/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "dev": true, "dependencies": { - "color-name": "1.1.3" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "node_modules/commitizen/node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", "dev": true }, - "node_modules/color-support": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", - "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "node_modules/commitizen/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, - "bin": { - "color-support": "bin.js" + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/columnify": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/columnify/-/columnify-1.6.0.tgz", - "integrity": "sha512-lomjuFZKfM6MSAnV9aCZC9sc0qGbmZdfygNv+nCpqVkSKdCxCklLtd16O0EILGkImHw9ZpHkAnHaB+8Zxq5W6Q==", + "node_modules/commitizen/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { - "strip-ansi": "^6.0.1", - "wcwidth": "^1.0.0" + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" }, "engines": { - "node": ">=8.0.0" + "node": ">= 6" } }, - "node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", + "node_modules/commitizen/node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", "dev": true, "engines": { - "node": "^12.20.0 || >=14" + "node": ">=0.12.0" } }, - "node_modules/commitizen": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/commitizen/-/commitizen-4.3.0.tgz", - "integrity": "sha512-H0iNtClNEhT0fotHvGV3E9tDejDeS04sN1veIebsKYGMuGscFaswRoYJKmT3eW85eIJAs0F28bG2+a/9wCOfPw==", + "node_modules/commitizen/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "dependencies": { - "cachedir": "2.3.0", - "cz-conventional-changelog": "3.3.0", - "dedent": "0.7.0", - "detect-indent": "6.1.0", - "find-node-modules": "^2.1.2", - "find-root": "1.1.0", - "fs-extra": "9.1.0", - "glob": "7.2.3", - "inquirer": "8.2.5", - "is-utf8": "^0.2.1", - "lodash": "4.17.21", - "minimist": "1.2.7", - "strip-bom": "4.0.0", - "strip-json-comments": "3.1.1" - }, - "bin": { - "commitizen": "bin/commitizen", - "cz": "bin/git-cz", - "git-cz": "bin/git-cz" - }, - "engines": { - "node": ">= 12" + "safe-buffer": "~5.2.0" } }, - "node_modules/commitizen/node_modules/minimist": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", - "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "node_modules/commitizen/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, "funding": { - "url": "https://github.com/sponsors/ljharb" + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", "dev": true }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, "node_modules/constant-case": { @@ -3430,13 +3513,10 @@ } }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true }, "node_modules/cookie": { "version": "0.5.0", @@ -3466,6 +3546,21 @@ "copyup": "copyfiles" } }, + "node_modules/copyfiles/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/copyfiles/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -3476,6 +3571,35 @@ "concat-map": "0.0.1" } }, + "node_modules/copyfiles/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/copyfiles/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/copyfiles/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/copyfiles/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3488,6 +3612,50 @@ "node": "*" } }, + "node_modules/copyfiles/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/copyfiles/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/copyfiles/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -3495,40 +3663,66 @@ "dev": true }, "node_modules/cosmiconfig": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", - "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "optional": true, "dependencies": { - "@types/parse-json": "^4.0.0", - "import-fresh": "^3.2.1", - "parse-json": "^5.0.0", - "path-type": "^4.0.0", - "yaml": "^1.10.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } } }, "node_modules/cosmiconfig-typescript-loader": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-1.0.9.tgz", - "integrity": "sha512-tRuMRhxN4m1Y8hP9SNYfz7jRwt8lZdWxdjg/ohg5esKmsndJIn4yT96oJVcf5x0eA11taXl+sIp+ielu529k6g==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-4.4.0.tgz", + "integrity": "sha512-BabizFdC3wBHhbI4kJh0VkQP9GkBfoHPydD0COMce1nJ1kJAB3F2TmJ/I7diULBKtmEWSwEbuN/KDtgnmUUVmw==", "dev": true, "optional": true, - "dependencies": { - "cosmiconfig": "^7", - "ts-node": "^10.7.0" - }, "engines": { - "node": ">=12", - "npm": ">=6" + "node": ">=v14.21.3" }, "peerDependencies": { "@types/node": "*", "cosmiconfig": ">=7", - "typescript": ">=3" + "ts-node": ">=10", + "typescript": ">=4" + } + }, + "node_modules/cosmiconfig/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "optional": true + }, + "node_modules/cosmiconfig/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "optional": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" } }, "node_modules/create-require": { @@ -3634,7 +3828,7 @@ "node_modules/cz-conventional-changelog/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", "dev": true, "engines": { "node": ">=0.8.0" @@ -3643,7 +3837,7 @@ "node_modules/cz-conventional-changelog/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -3732,7 +3926,7 @@ "node_modules/dedent": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", - "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "integrity": "sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==", "dev": true }, "node_modules/deep-eql": { @@ -3754,18 +3948,21 @@ "dev": true }, "node_modules/defaults": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", - "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", + "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==", "dev": true, "dependencies": { "clone": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/defaults/node_modules/clone": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", - "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==", "dev": true, "engines": { "node": ">=0.8" @@ -3777,15 +3974,30 @@ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", "dev": true, "engines": { - "node": ">=10" + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.0.tgz", + "integrity": "sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/define-properties": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", - "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3799,7 +4011,7 @@ "node_modules/detect-file": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", - "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "integrity": "sha512-DtCOLG98P007x7wiiOmfI0fi3eIKyWiLTGJ2MDnVi/E04lWGbf+JzrRHMm0rgIIZJGtHpKpbVgLWHrv8xXpc3Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -3815,18 +4027,18 @@ } }, "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", + "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", "dev": true, "engines": { "node": ">=0.3.1" } }, "node_modules/diff-sequences": { - "version": "29.4.2", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.4.2.tgz", - "integrity": "sha512-R6P0Y6PrsH3n4hUXxL3nns0rbRk6Q33js3ygJBeEpbzLzgcNuJ61+u0RXasFpTKISw99TxUzFnumSnRLsjhLaw==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -3941,9 +4153,9 @@ } }, "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, "node_modules/emphasize": { @@ -4024,18 +4236,19 @@ } }, "node_modules/es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.2.tgz", + "integrity": "sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==", "dev": true, "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.1", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", @@ -4043,25 +4256,30 @@ "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", "is-negative-zero": "^2.0.2", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", + "object-inspect": "^1.12.3", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -4110,12 +4328,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es6-object-assign": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/es6-object-assign/-/es6-object-assign-1.1.0.tgz", - "integrity": "sha512-MEl9uirslVwqQU369iHNWZXsI8yaZYGg/D65aOgZkeyFJwHYSxilf7rQzXKI7DdDuBPrBXbfk3sl9hJhmd5AUw==", - "dev": true - }, "node_modules/escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4147,27 +4359,27 @@ } }, "node_modules/eslint": { - "version": "8.36.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.36.0.tgz", - "integrity": "sha512-Y956lmS7vDqomxlaaQAHVmeb4tNMp2FWIvU/RnU5BD3IKMD/MJPr76xdyr68P8tV1iNMvN2mRK0yy3c+UjL+bw==", + "version": "8.50.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.50.0.tgz", + "integrity": "sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.1", - "@eslint/js": "8.36.0", - "@humanwhocodes/config-array": "^0.11.8", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.2", + "@eslint/js": "8.50.0", + "@humanwhocodes/config-array": "^0.11.11", "@humanwhocodes/module-importer": "^1.0.1", "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", + "ajv": "^6.12.4", "chalk": "^4.0.0", "cross-spawn": "^7.0.2", "debug": "^4.3.2", "doctrine": "^3.0.0", "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.1.1", - "eslint-visitor-keys": "^3.3.0", - "espree": "^9.5.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", "esquery": "^1.4.2", "esutils": "^2.0.2", "fast-deep-equal": "^3.1.3", @@ -4175,22 +4387,19 @@ "find-up": "^5.0.0", "glob-parent": "^6.0.2", "globals": "^13.19.0", - "grapheme-splitter": "^1.0.4", + "graphemer": "^1.4.0", "ignore": "^5.2.0", - "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "is-glob": "^4.0.0", "is-path-inside": "^3.0.3", - "js-sdsl": "^4.1.4", "js-yaml": "^4.1.0", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.4.1", "lodash.merge": "^4.6.2", "minimatch": "^3.1.2", "natural-compare": "^1.4.0", - "optionator": "^0.9.1", + "optionator": "^0.9.3", "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", "text-table": "^0.2.0" }, "bin": { @@ -4204,9 +4413,9 @@ } }, "node_modules/eslint-config-prettier": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.8.0.tgz", - "integrity": "sha512-wLbQiFre3tdGgpDv67NQKnJuTlcUVYHas3k+DZCc2U2BadthoEY4B7hLPvAxaqdyOGCzuLfii2fqGph10va7oA==", + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz", + "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==", "dev": true, "bin": { "eslint-config-prettier": "bin/cli.js" @@ -4216,9 +4425,9 @@ } }, "node_modules/eslint-config-standard": { - "version": "17.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", - "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", + "version": "17.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.1.0.tgz", + "integrity": "sha512-IwHwmaBNtDK4zDHQukFDW5u/aTb8+meQWZvNFWkiGmbWjD6bqyuSSBxxXKkCftCUzc1zwCH2m/baCNDLGmuO5Q==", "dev": true, "funding": [ { @@ -4234,22 +4443,25 @@ "url": "https://feross.org/support" } ], + "engines": { + "node": ">=12.0.0" + }, "peerDependencies": { "eslint": "^8.0.1", "eslint-plugin-import": "^2.25.2", - "eslint-plugin-n": "^15.0.0", + "eslint-plugin-n": "^15.0.0 || ^16.0.0 ", "eslint-plugin-promise": "^6.0.0" } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -4262,9 +4474,9 @@ } }, "node_modules/eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", "dev": true, "dependencies": { "debug": "^3.2.7" @@ -4331,26 +4543,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.28.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz", + "integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==", "dev": true, "dependencies": { "array-includes": "^3.1.6", + "array.prototype.findlastindex": "^1.2.2", "array.prototype.flat": "^1.3.1", "array.prototype.flatmap": "^1.3.1", "debug": "^3.2.7", "doctrine": "^2.1.0", "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", + "eslint-module-utils": "^2.8.0", "has": "^1.0.3", - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "is-glob": "^4.0.3", "minimatch": "^3.1.2", + "object.fromentries": "^2.0.6", + "object.groupby": "^1.0.0", "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -4412,9 +4626,9 @@ } }, "node_modules/eslint-plugin-n": { - "version": "15.6.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.6.1.tgz", - "integrity": "sha512-R9xw9OtCRxxaxaszTQmQAlPgM+RdGjaL1akWuY/Fv9fRAi8Wj4CUKc6iYVG8QNRjRuo8/BqVYIpfqberJUEacA==", + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", "dev": true, "dependencies": { "builtins": "^5.0.1", @@ -4492,9 +4706,9 @@ } }, "node_modules/eslint-scope": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", - "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", "dev": true, "dependencies": { "esrecurse": "^4.3.0", @@ -4502,6 +4716,9 @@ }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint-utils": { @@ -4532,12 +4749,15 @@ } }, "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, "node_modules/eslint/node_modules/ansi-styles": { @@ -4555,6 +4775,12 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4599,6 +4825,18 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4612,14 +4850,14 @@ } }, "node_modules/espree": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.0.tgz", - "integrity": "sha512-JPbJGhKc47++oo4JkEoTe2wjy4fmMwvFpgJT9cQzmfXKp22Dr6Hf1tdCteLz1h0P3t+mGvWZ+4Uankvh8+c6zw==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", "dev": true, "dependencies": { - "acorn": "^8.8.0", + "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.3.0" + "eslint-visitor-keys": "^3.4.1" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -4702,94 +4940,32 @@ } }, "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", "dev": true, "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", - "dev": true, - "dependencies": { - "nice-try": "^1.0.4", - "path-key": "^2.0.1", - "semver": "^5.5.0", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "engines": { - "node": ">=4.8" - } - }, - "node_modules/execa/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/execa/node_modules/semver": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", - "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", - "dev": true, - "dependencies": { - "shebang-regex": "^1.0.0" + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" }, "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/execa/node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" + "node": ">=16.17" }, - "bin": { - "which": "bin/which" + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, "node_modules/expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", - "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "integrity": "sha512-A5EmesHW6rfnZ9ysHQjPdJRni0SRar0tjtG5MNtm9n5TUvsYU8oozprtRD4AqHxcZWWlVuAmQo2nWKfN9oyjTw==", "dev": true, "dependencies": { "homedir-polyfill": "^1.0.1" @@ -4831,15 +5007,15 @@ "dev": true }, "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -4909,13 +5085,13 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, "node_modules/fast-querystring": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.0.0.tgz", - "integrity": "sha512-3LQi62IhQoDlmt4ULCYmh17vRO2EtS7hTSsG4WwoKWgV7GLMKBOecEh+aiavASnLx8I2y89OD33AGLo0ccRhzA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fast-querystring/-/fast-querystring-1.1.2.tgz", + "integrity": "sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==", "dev": true, "dependencies": { "fast-decode-uri-component": "^1.0.1" @@ -4961,15 +5137,15 @@ } }, "node_modules/fastify-plugin": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.3.0.tgz", - "integrity": "sha512-M3+i368lV0OYTJ5TfClIoPKEKSOF7112iiPdwgfSR0gN98BjA1Nk+c6oBHtfcVt9KiMxl+EQKHC1QNWo3ZOpYQ==", + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-4.5.1.tgz", + "integrity": "sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==", "dev": true }, "node_modules/fastq": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", - "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", + "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", "dev": true, "dependencies": { "reusify": "^1.0.4" @@ -5000,27 +5176,31 @@ } }, "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" }, "engines": { - "node": ">=8" + "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/figures/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { - "node": ">=0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/file-entry-cache": { @@ -5126,16 +5306,17 @@ } }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz", + "integrity": "sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.7", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { - "node": "^10.12.0 || >=12.0.0" + "node": ">=12.0.0" } }, "node_modules/flat-cache/node_modules/rimraf": { @@ -5154,9 +5335,9 @@ } }, "node_modules/flatted": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", - "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/flattie": { @@ -5190,6 +5371,12 @@ "node": ">=8.0.0" } }, + "node_modules/foreground-child/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/form-data-encoder": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/form-data-encoder/-/form-data-encoder-2.1.4.tgz", @@ -5217,18 +5404,17 @@ } }, "node_modules/fs-extra": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-9.1.0.tgz", - "integrity": "sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==", + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.1.1.tgz", + "integrity": "sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==", "dev": true, "dependencies": { - "at-least-node": "^1.0.0", "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.14" } }, "node_modules/fs-readdir-recursive": { @@ -5240,7 +5426,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, "node_modules/function-bind": { @@ -5250,15 +5436,15 @@ "dev": true }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -5286,22 +5472,23 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" } }, "node_modules/get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", + "has-proto": "^1.0.1", "has-symbols": "^1.0.3" }, "funding": { @@ -5328,15 +5515,15 @@ } }, "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, "engines": { - "node": ">=6" + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/get-symbol-description": { @@ -5418,7 +5605,7 @@ "node_modules/global-dirs": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-0.1.1.tgz", - "integrity": "sha1-sxnA3UYH81PzvpzKTHL8FIxJ9EU=", + "integrity": "sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==", "dev": true, "optional": true, "dependencies": { @@ -5445,7 +5632,7 @@ "node_modules/global-prefix": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", - "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "integrity": "sha512-5lsx1NUDHtSjfg0eHlmYvZKv8/nVqX4ckFbM+FrGcQ+04KWcWFo9P5MxPZYSzUvyzmdTbI7Eix8Q4IbELDqzKg==", "dev": true, "dependencies": { "expand-tilde": "^2.0.2", @@ -5471,9 +5658,9 @@ } }, "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.23.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz", + "integrity": "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -5570,25 +5757,22 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true }, "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.4.tgz", + "integrity": "sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==", "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, "engines": { "node": ">= 0.4.0" } @@ -5740,9 +5924,9 @@ "dev": true }, "node_modules/http-status-codes": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.2.0.tgz", - "integrity": "sha512-feERVo9iWxvnejp3SEfm/+oNG517npqL2/PIA8ORjyOZjGC7TwCRQsZylciLS64i6pJ0wRYz3rkXLRwbtFa8Ng==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz", + "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==", "dev": true }, "node_modules/http2-wrapper": { @@ -5759,12 +5943,12 @@ } }, "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", "dev": true, "engines": { - "node": ">=10.17.0" + "node": ">=16.17.0" } }, "node_modules/husky": { @@ -5810,15 +5994,6 @@ "node": ">=4" } }, - "node_modules/husky/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/husky/node_modules/chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -5848,19 +6023,65 @@ "node": ">=4" } }, + "node_modules/husky/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dev": true, + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, "node_modules/husky/node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/husky/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dev": true, + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/husky/node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, "engines": { - "node": ">=0.8.0" + "node": ">=6" } }, "node_modules/husky/node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { "node": ">=4" @@ -5869,7 +6090,7 @@ "node_modules/husky/node_modules/import-fresh": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", - "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "integrity": "sha512-eZ5H8rcgYazHbKC3PG4ClHNykCSxtAhxSSEM+2mb+7evD2CKF5V7c0dNum7AdpDh0ZdICwZY9sRSn8f+KH96sg==", "dev": true, "dependencies": { "caller-path": "^2.0.0", @@ -5879,23 +6100,31 @@ "node": ">=4" } }, - "node_modules/husky/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "node_modules/husky/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/husky/node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==", "dev": true, "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "path-key": "^2.0.0" }, - "bin": { - "js-yaml": "bin/js-yaml.js" + "engines": { + "node": ">=4" } }, "node_modules/husky/node_modules/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", "dev": true, "dependencies": { "error-ex": "^1.3.1", @@ -5905,15 +6134,60 @@ "node": ">=4" } }, + "node_modules/husky/node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/husky/node_modules/resolve-from": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", - "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "integrity": "sha512-GnlH6vxLymXJNMBo7XP1fJIzBFbdYt49CuTwmB/6N53t+kMPRMFKz783LlQ4tv28XoQfMWinAJX6WCGf2IlaIw==", "dev": true, "engines": { "node": ">=4" } }, + "node_modules/husky/node_modules/semver": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", + "dev": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/husky/node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "dev": true, + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/husky/node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/husky/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/husky/node_modules/supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", @@ -5926,6 +6200,18 @@ "node": ">=4" } }, + "node_modules/husky/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -5959,9 +6245,9 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", "dev": true, "engines": { "node": ">= 4" @@ -5983,6 +6269,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/import-fresh/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/import-fresh/node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -6007,7 +6302,7 @@ "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", "dev": true, "engines": { "node": ">=0.8.19" @@ -6022,6 +6317,15 @@ "parent-module": "^2.0.0" } }, + "node_modules/inclusion/node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/inclusion/node_modules/parent-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-2.0.0.tgz", @@ -6046,7 +6350,7 @@ "node_modules/inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "dev": true, "dependencies": { "once": "^1.3.0", @@ -6066,29 +6370,29 @@ "dev": true }, "node_modules/inquirer": { - "version": "8.2.5", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.5.tgz", - "integrity": "sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==", + "version": "9.2.11", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.11.tgz", + "integrity": "sha512-B2LafrnnhbRzCWfAdOXisUzL89Kg8cVJlYmhqoi3flSiV/TveO+nsXwgKr9h9PIo+J1hz7nBSk6gegRIMBBf7g==", "dev": true, "dependencies": { - "ansi-escapes": "^4.2.1", - "chalk": "^4.1.1", + "@ljharb/through": "^2.3.9", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", "cli-cursor": "^3.1.0", - "cli-width": "^3.0.0", - "external-editor": "^3.0.3", - "figures": "^3.0.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "figures": "^5.0.0", "lodash": "^4.17.21", - "mute-stream": "0.0.8", + "mute-stream": "1.0.0", "ora": "^5.4.1", - "run-async": "^2.4.0", - "rxjs": "^7.5.5", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0", - "through": "^2.3.6", - "wrap-ansi": "^7.0.0" + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.18.0" } }, "node_modules/inquirer/node_modules/ansi-styles": { @@ -6106,7 +6410,97 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/inquirer/node_modules/chalk": { + "node_modules/inquirer/node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/inquirer/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/log-symbols/node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", @@ -6122,24 +6516,68 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/inquirer/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/inquirer/node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/inquirer/node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/readable-stream": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/inquirer/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" } }, - "node_modules/inquirer/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/internal-slot": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", @@ -6180,13 +6618,13 @@ } }, "node_modules/is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", + "get-intrinsic": "^1.2.0", "is-typed-array": "^1.1.10" }, "funding": { @@ -6196,7 +6634,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, "node_modules/is-bigint": { @@ -6246,9 +6684,9 @@ } }, "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz", + "integrity": "sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -6275,7 +6713,7 @@ "node_modules/is-directory": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", - "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "integrity": "sha512-yVChGzahRFvbkscn2MlwGismPO12i9+znNruC5gVEntG3qu0xQMzsGg/JFbrsqDOHtHFPci+V5aP5T9I+yeKqw==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6299,7 +6737,7 @@ "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true, "engines": { "node": ">=0.10.0" @@ -6345,12 +6783,15 @@ } }, "node_modules/is-interactive": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", - "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-2.0.0.tgz", + "integrity": "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-invalid-path": { @@ -6488,12 +6929,15 @@ } }, "node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/is-string": { @@ -6527,16 +6971,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -6546,12 +6986,12 @@ } }, "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -6560,7 +7000,7 @@ "node_modules/is-utf8": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", "dev": true }, "node_modules/is-valid-path": { @@ -6617,7 +7057,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", "dev": true }, "node_modules/isobject": { @@ -6639,23 +7079,38 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" + } + }, + "node_modules/istanbul-lib-report/node_modules/make-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", + "dev": true, + "dependencies": { + "semver": "^7.5.3" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/istanbul-reports": { - "version": "3.1.4", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.4.tgz", - "integrity": "sha512-r1/DshN4KSE7xWEknZLLLLDn5CJybV3nw01VTkp6D5jzLuELlcbudfj/eSQFvrKsJuTVCGnePO7ho82Nw9zzfw==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -6666,9 +7121,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.1.tgz", - "integrity": "sha512-4iSY3Bh1Htv+kLhiiZunUhQ+OYXIn0ze3ulq8JeWrFKmhPAJSySV2+kdtRh2pGcCeF0s6oR8Oc+pYZynJj4t8A==", + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -6684,15 +7139,15 @@ } }, "node_modules/jest-diff": { - "version": "29.4.2", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.4.2.tgz", - "integrity": "sha512-EK8DSajVtnjx9sa1BkjZq3mqChm2Cd8rIzdXkQMA8e0wuXq53ypz6s5o5V8HRZkoEt2ywJ3eeNWFKWeYr8HK4g==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz", + "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==", "dev": true, "dependencies": { "chalk": "^4.0.0", - "diff-sequences": "^29.4.2", - "jest-get-type": "^29.4.2", - "pretty-format": "^29.4.2" + "diff-sequences": "^29.6.3", + "jest-get-type": "^29.6.3", + "pretty-format": "^29.7.0" }, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6748,9 +7203,9 @@ "dev": true }, "node_modules/jest-get-type": { - "version": "29.4.2", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.4.2.tgz", - "integrity": "sha512-vERN30V5i2N6lqlFu4ljdTqQAgrkTFMC9xaIIfOPYBw04pufjXRty5RuXBiB1d72tGbURa/UgoiHB90ruOSivg==", + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz", + "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==", "dev": true, "engines": { "node": "^14.15.0 || ^16.10.0 || >=18.0.0" @@ -6871,16 +7326,6 @@ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "node_modules/js-sdsl": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.3.0.tgz", - "integrity": "sha512-mifzlm2+5nZ+lEcLJMoBK0/IH/bDg8XnJfd/Wq6IP+xoCjLZsTOnV2QpxlVbX9bMnkl5PdEjNtBJ9Cj1NjifhQ==", - "dev": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/js-sdsl" - } - }, "node_modules/js-stringify": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/js-stringify/-/js-stringify-1.0.2.tgz", @@ -6894,12 +7339,13 @@ "dev": true }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", "dev": true, "dependencies": { - "argparse": "^2.0.1" + "argparse": "^1.0.7", + "esprima": "^4.0.0" }, "bin": { "js-yaml": "bin/js-yaml.js" @@ -6951,7 +7397,7 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, "node_modules/json5": { @@ -7116,6 +7562,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/human-signals": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", + "dev": true, + "engines": { + "node": ">=10.17.0" + } + }, "node_modules/lint-staged/node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -7128,6 +7583,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lint-staged/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/lint-staged/node_modules/npm-run-path": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", @@ -7140,10 +7604,40 @@ "node": ">=8" } }, + "node_modules/lint-staged/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lint-staged/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/lint-staged/node_modules/strip-final-newline": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/lint-staged/node_modules/supports-color": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.2.2.tgz", - "integrity": "sha512-XC6g/Kgux+rJXmwokjm9ECpD6k/smUoS5LKlUCcsYr4IY3rW0XyAympon2RmxGrlnZURMpg5T18gWDP9CsHXFA==", + "version": "9.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-9.4.0.tgz", + "integrity": "sha512-VL+lNrEoIXww1coLPOmiEmK/0sGigko5COxI09KzHc2VJXJsQ37UaQ+8quuxjDeA7+KnLGTWRyOXSLLR2Wb4jw==", "dev": true, "engines": { "node": ">=12" @@ -7237,6 +7731,55 @@ "node": ">=8" } }, + "node_modules/listr2/node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/listr2/node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/listr2/node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/listr2/node_modules/slice-ansi": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", @@ -7251,6 +7794,23 @@ "node": ">=8" } }, + "node_modules/listr2/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -7290,10 +7850,17 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true, + "optional": true + }, "node_modules/lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", - "integrity": "sha1-dx7Hg540c9nEzeKLGTlMNWL09tM=", + "integrity": "sha512-worNHGKLDetmcEYDvh2stPCrrQRkP20E4l0iIS7F8EvzMqBBi7ltvFN5m1HvTf1P7Jk1txKhvFcmYsCr8O2F1Q==", "dev": true }, "node_modules/lodash.merge": { @@ -7302,172 +7869,232 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true, + "optional": true + }, "node_modules/lodash.set": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", "integrity": "sha512-4hNPN5jlm/N/HLMCO43v8BXKq9Z7QdAGc/VGrRD61w8gN9g/6jF9A4L1pbUgBLCffi0w9VsXfTOij5x8iTyFvg==", "dev": true }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", + "dev": true, + "optional": true + }, "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-5.1.0.tgz", + "integrity": "sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==", "dev": true, "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" + "chalk": "^5.0.0", + "is-unicode-supported": "^1.1.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/log-update": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", + "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "ansi-escapes": "^5.0.0", + "cli-cursor": "^4.0.0", + "slice-ansi": "^5.0.0", + "strip-ansi": "^7.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-escapes": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", + "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", + "dev": true, + "dependencies": { + "type-fest": "^1.0.2" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "dev": true, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/log-update/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-symbols/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/log-update/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/log-update/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, "engines": { - "node": ">=7.0.0" + "node": ">=6" } }, - "node_modules/log-symbols/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-update": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", - "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "node_modules/log-update/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "ansi-escapes": "^4.3.0", - "cli-cursor": "^3.1.0", - "slice-ansi": "^4.0.0", - "wrap-ansi": "^6.2.0" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=10" + "node": ">=6" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/log-update/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/log-update/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/log-update/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/log-update/node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "node_modules/log-update/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/log-update/node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "node_modules/log-update/node_modules/type-fest": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", + "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/log-update/node_modules/wrap-ansi": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", - "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, "node_modules/longest": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/longest/-/longest-2.0.1.tgz", - "integrity": "sha1-eB4YMpaqlPbU2RbcM10NF676I/g=", + "integrity": "sha512-Ajzxb8CM6WAnFjgiloPsI3bF+WCxcvhdIG3KNA2KN962+tdBsHcuQ4k4qX/EcS/2CRkcc0iAkR956Nib6aXU/Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7534,14 +8161,14 @@ "dev": true }, "node_modules/magicast": { - "version": "0.2.10", - "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.2.10.tgz", - "integrity": "sha512-Ah2qatigknxwmoYCd9hx/mmVyrRNhDKiaWZIuW4gL6dWrAGMoOpCVkQ3VpGWARtkaJVFhe8uIphcsxDzLPQUyg==", + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/magicast/-/magicast-0.2.11.tgz", + "integrity": "sha512-6saXbRDA1HMkqbsvHOU6HBjCVgZT460qheRkLhJQHWAbhXoWESI3Kn/dGGXyKs15FFKR85jsUqFx2sMK0wy/5g==", "dev": true, "dependencies": { - "@babel/parser": "^7.22.7", - "@babel/types": "^7.22.5", - "recast": "^0.23.3" + "@babel/parser": "^7.22.16", + "@babel/types": "^7.22.17", + "recast": "^0.23.4" } }, "node_modules/make-dir": { @@ -7647,12 +8274,15 @@ } }, "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/mimic-response": { @@ -7680,18 +8310,18 @@ } }, "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/minipass": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.3.tgz", - "integrity": "sha512-LhbbwCfz3vsb12j/WkWQPZfKTsgqIe1Nf/ti1pKjYESGLHIVjWU96G9/ljLH4F9mWNVhlQOm0VySdAWzf05dpg==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -7734,21 +8364,18 @@ } }, "node_modules/mute-stream": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", - "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", - "dev": true + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } }, "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", "dev": true }, "node_modules/nice-try": { @@ -7790,9 +8417,9 @@ } }, "node_modules/node-fetch": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.9.tgz", - "integrity": "sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "dev": true, "dependencies": { "whatwg-url": "^5.0.0" @@ -7819,24 +8446,6 @@ "readable-stream": "~1.0.31" } }, - "node_modules/noms/node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "dev": true, - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/noms/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "dev": true - }, "node_modules/normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", @@ -7880,24 +8489,30 @@ } }, "node_modules/npm-run-path": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", - "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", + "integrity": "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==", "dev": true, "dependencies": { - "path-key": "^2.0.0" + "path-key": "^4.0.0" }, "engines": { - "node": ">=4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/npm-run-path/node_modules/path-key": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", - "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", "dev": true, "engines": { - "node": ">=4" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/object-inspect": { @@ -7952,15 +8567,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -7970,30 +8614,33 @@ } }, "node_modules/on-exit-leak-free": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.0.tgz", - "integrity": "sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==", - "dev": true + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-2.1.2.tgz", + "integrity": "sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", "dev": true, "dependencies": { "wrappy": "1" } }, "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", "dev": true, "dependencies": { - "mimic-fn": "^2.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -8026,95 +8673,134 @@ "opencollective-postinstall": "index.js" } }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ora": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-6.3.1.tgz", + "integrity": "sha512-ERAyNnZOfqM+Ao3RAvIXkYh5joP220yf59gVe2X/cI6SiCxIdi4c9HZKZD8R6q/RDXEje1THBju6iExiSsgJaQ==", + "dev": true, + "dependencies": { + "chalk": "^5.0.0", + "cli-cursor": "^4.0.0", + "cli-spinners": "^2.6.1", + "is-interactive": "^2.0.0", + "is-unicode-supported": "^1.1.0", + "log-symbols": "^5.1.0", + "stdin-discarder": "^0.1.0", + "strip-ansi": "^7.0.1", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, "engines": { - "node": ">= 0.8.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/ora": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", - "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "node_modules/ora/node_modules/cli-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", + "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", "dev": true, "dependencies": { - "bl": "^4.1.0", - "chalk": "^4.1.0", - "cli-cursor": "^3.1.0", - "cli-spinners": "^2.5.0", - "is-interactive": "^1.0.0", - "is-unicode-supported": "^0.1.0", - "log-symbols": "^4.1.0", - "strip-ansi": "^6.0.0", - "wcwidth": "^1.0.1" + "restore-cursor": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/ora/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ora/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "mimic-fn": "^2.1.0" }, "engines": { - "node": ">=8" + "node": ">=6" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/ora/node_modules/restore-cursor": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", + "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ora/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "node_modules/ora/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/ora/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "color-name": "~1.1.4" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=7.0.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, - "node_modules/ora/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -8136,7 +8822,7 @@ "node_modules/p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "integrity": "sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==", "dev": true, "engines": { "node": ">=4" @@ -8196,6 +8882,15 @@ "node": ">=10" } }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/param-case": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", @@ -8207,12 +8902,12 @@ } }, "node_modules/parent-module": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-3.0.0.tgz", - "integrity": "sha512-zJXn5iKdXXUV51iC7O4nHiPs/eWnkd0obrHDlOKQ6/MafFrxljinW6hCkr0UTsAGq7B+NXT2wIfLshcD+5RvIw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-3.1.0.tgz", + "integrity": "sha512-FX4TpKXX6CesSm1D9y5IcF0/KdDjP/w0c1AKqreGZne2QyWiPWHfoApMaJl8zvH3DTh+xtVmlLIUqSSoPYjqLQ==", "dev": true, "dependencies": { - "callsites": "^4.0.0" + "callsites": "^4.1.0" }, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -8221,18 +8916,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/parent-module/node_modules/callsites": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.0.0.tgz", - "integrity": "sha512-y3jRROutgpKdz5vzEhWM34TidDU8vkJppF8dszITeb1PQmSqV3DTxyV8G/lyO/DNvtE1YTedehmw9MPZsCBHxQ==", - "dev": true, - "engines": { - "node": ">=12.20" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/parse-json": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", @@ -8254,7 +8937,7 @@ "node_modules/parse-passwd": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", - "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8292,7 +8975,7 @@ "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8390,9 +9073,9 @@ } }, "node_modules/pino": { - "version": "8.15.1", - "resolved": "https://registry.npmjs.org/pino/-/pino-8.15.1.tgz", - "integrity": "sha512-Cp4QzUQrvWCRJaQ8Lzv0mJzXVk4z2jlq8JNKMGaixC2Pz5L4l2p95TkuRvYbrEbe85NQsDKrAd4zalf7Ml6WiA==", + "version": "8.15.6", + "resolved": "https://registry.npmjs.org/pino/-/pino-8.15.6.tgz", + "integrity": "sha512-GuxHr61R0ZFD1npu58tB3a3FSVjuy21OwN/haw4OuKiZBL63Pg11Y51WWeD52RENS2mjwPZOwt+2OQOSkck6kQ==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0", @@ -8421,30 +9104,6 @@ "split2": "^4.0.0" } }, - "node_modules/pino-abstract-transport/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/pino-abstract-transport/node_modules/readable-stream": { "version": "4.4.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.4.2.tgz", @@ -8461,6 +9120,15 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, + "node_modules/pino-abstract-transport/node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, "node_modules/pino-std-serializers": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-6.2.2.tgz", @@ -8531,15 +9199,6 @@ "node": ">=8" } }, - "node_modules/pkg-dir/node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/please-upgrade-node": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", @@ -8580,9 +9239,9 @@ } }, "node_modules/prettier": { - "version": "2.8.7", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.7.tgz", - "integrity": "sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==", + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "bin": { "prettier": "bin-prettier.js" @@ -8607,12 +9266,12 @@ } }, "node_modules/pretty-format": { - "version": "29.4.2", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.4.2.tgz", - "integrity": "sha512-qKlHR8yFVCbcEWba0H0TOC8dnLlO4vPlyEjRPw31FZ2Rupy9nLa8ZLbYny8gWEl8CkEhJqAE6IzdNELTBVcBEg==", + "version": "29.7.0", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz", + "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==", "dev": true, "dependencies": { - "@jest/schemas": "^29.4.2", + "@jest/schemas": "^29.6.3", "ansi-styles": "^5.0.0", "react-is": "^18.0.0" }, @@ -8691,7 +9350,7 @@ "node_modules/printable-characters": { "version": "1.0.42", "resolved": "https://registry.npmjs.org/printable-characters/-/printable-characters-1.0.42.tgz", - "integrity": "sha1-Pxjpd6m9jrN/zE/1ZZ176Qhos9g=", + "integrity": "sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==", "dev": true }, "node_modules/process": { @@ -8739,9 +9398,9 @@ } }, "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", "dev": true, "engines": { "node": ">=6" @@ -8816,17 +9475,15 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", "dev": true, "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" } }, "node_modules/real-require": { @@ -8839,9 +9496,9 @@ } }, "node_modules/recast": { - "version": "0.23.3", - "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.3.tgz", - "integrity": "sha512-HbCVFh2ANP6a09nzD4lx7XthsxMOJWKX5pIcUwtLrmeEIl3I0DwjCoVXDE0Aobk+7k/mS3H50FK4iuYArpcT6Q==", + "version": "0.23.4", + "resolved": "https://registry.npmjs.org/recast/-/recast-0.23.4.tgz", + "integrity": "sha512-qtEDqIZGVcSZCHniWwZWbRy79Dc6Wp3kT/UmDA2RJKBPg7+7k51aQBZirHmUGn5uvHf2rg8DkjizrN26k61ATw==", "dev": true, "dependencies": { "assert": "^2.0.0", @@ -8861,14 +9518,14 @@ "dev": true }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -8901,7 +9558,7 @@ "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", "dev": true, "engines": { "node": ">=0.10.0" @@ -8917,12 +9574,12 @@ } }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.6", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.6.tgz", + "integrity": "sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==", "dev": true, "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -8942,7 +9599,7 @@ "node_modules/resolve-dir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", - "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "integrity": "sha512-R7uiTjECzvOsWSfdM0QKFNBVFcK27aHOUwdvK53BcW8zqnGdYp0Fbj82cy54+2A4P2tFM22J5kRfe1R+lM/1yg==", "dev": true, "dependencies": { "expand-tilde": "^2.0.0", @@ -9002,6 +9659,36 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, "node_modules/ret": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", @@ -9037,15 +9724,15 @@ "dev": true }, "node_modules/rimraf": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.1.tgz", - "integrity": "sha512-OfFZdwtd3lZ+XZzYP/6gTACubwFcHdLRqS9UX3UwpU2dnGQYkPFISRwvM3w9IiB2w7bW5qGo/uAwE4SmXXSKvg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", + "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", "dev": true, "dependencies": { - "glob": "^10.2.5" + "glob": "^10.3.7" }, "bin": { - "rimraf": "dist/cjs/src/bin.js" + "rimraf": "dist/esm/bin.mjs" }, "engines": { "node": ">=14" @@ -9071,19 +9758,19 @@ } }, "node_modules/rimraf/node_modules/glob": { - "version": "10.3.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.3.tgz", - "integrity": "sha512-92vPiMb/iqpmEgsOoIDvTjc50wf9CCCvMzsi6W0JLPeUKE8TWP1a73PgqSrqy7iAZxaSD1YdzU7QZR5LF51MJw==", + "version": "10.3.10", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", + "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.0.3", + "jackspeak": "^2.3.5", "minimatch": "^9.0.1", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", "path-scurry": "^1.10.1" }, "bin": { - "glob": "dist/cjs/src/bin.js" + "glob": "dist/esm/bin.mjs" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -9107,22 +9794,10 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/rimraf/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "dev": true, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/run-async": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", - "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", "dev": true, "engines": { "node": ">=0.12.0" @@ -9172,12 +9847,50 @@ "tslib": "^2.1.0" } }, - "node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/safe-array-concat/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", "dev": true }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/safe-compare": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/safe-compare/-/safe-compare-1.1.4.tgz", @@ -9257,7 +9970,7 @@ "node_modules/semver-compare": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "integrity": "sha512-YM3/ITh2MJ5MtzaM429anh+x2jiLVjqILF4m4oyQB18W7Ggea7BfqdH/wGMK7dDiMghv/6WG7znWMwUDzJiXow==", "dev": true }, "node_modules/sentence-case": { @@ -9277,6 +9990,20 @@ "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", "dev": true }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -9325,10 +10052,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sinon": { "version": "15.2.0", @@ -9348,15 +10081,6 @@ "url": "https://opencollective.com/sinon" } }, - "node_modules/sinon/node_modules/diff": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.1.0.tgz", - "integrity": "sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/slash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", @@ -9383,9 +10107,9 @@ } }, "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.1.0.tgz", - "integrity": "sha512-VbqNsoz55SYGczauuup0MFUyXNQviSpFTj1RQtFzmQLk18qbVSpTFFGMT293rmDaQuKCT6InmbuEyUne4mTuxQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { "node": ">=12" @@ -9414,9 +10138,9 @@ } }, "node_modules/sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.6.0.tgz", + "integrity": "sha512-5Rs7m4IO/mW1WHouC6q6PGJsXO6hSAduwB3ltTsKaDU0Bd7sc5QEUK/jF0YL583g3BG7QV0Dg0rQNZrwZhY6Xg==", "dev": true, "dependencies": { "atomic-sleep": "^1.0.0" @@ -9432,9 +10156,9 @@ } }, "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz", + "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==", "dev": true, "dependencies": { "spdx-expression-parse": "^3.0.0", @@ -9458,9 +10182,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.11", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz", - "integrity": "sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/split2": { @@ -9475,7 +10199,7 @@ "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, "node_modules/stacktracey": { @@ -9503,74 +10227,16 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/stdin-discarder/node_modules/bl": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-5.1.0.tgz", - "integrity": "sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==", - "dev": true, - "dependencies": { - "buffer": "^6.0.3", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, - "node_modules/stdin-discarder/node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string_decoder/node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", + "dev": true }, "node_modules/string-argv": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", - "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.2.tgz", + "integrity": "sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==", "dev": true, "engines": { "node": ">=0.6.19" @@ -9605,12 +10271,6 @@ "node": ">=8" } }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/string-width-cjs/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -9620,12 +10280,6 @@ "node": ">=8" } }, - "node_modules/string-width/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, "node_modules/string-width/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", @@ -9635,29 +10289,46 @@ "node": ">=8" } }, + "node_modules/string.prototype.trim": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9711,19 +10382,22 @@ "node_modules/strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", - "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "integrity": "sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==", "dev": true, "engines": { "node": ">=0.10.0" } }, "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/strip-json-comments": { @@ -9813,19 +10487,19 @@ } }, "node_modules/telegraf": { - "version": "4.12.2", - "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.12.2.tgz", - "integrity": "sha512-PgwqI4wD86cMqVfFtEM9JkGGnMHgvgLJbReZMmwW4z35QeOi4DvbdItONld4bPnYn3A1jcO0SRKs0BXmR+x+Ew==", + "version": "4.14.0", + "resolved": "https://registry.npmjs.org/telegraf/-/telegraf-4.14.0.tgz", + "integrity": "sha512-Nn2EBsuar/Mf3SD6O9tHmJ0FyJWnwAi4rewkJMmzd/O1xWYKglEuzSnCuHHRY7oD5NJ6WNPsavta5DbED8tG3w==", "dev": true, "dependencies": { + "@telegraf/types": "^6.9.0", "abort-controller": "^3.0.0", "debug": "^4.3.4", "mri": "^1.2.0", "node-fetch": "^2.6.8", "p-timeout": "^4.1.0", "safe-compare": "^1.1.4", - "sandwich-stream": "^2.0.2", - "typegram": "^4.3.0" + "sandwich-stream": "^2.0.2" }, "bin": { "telegraf": "lib/cli.mjs" @@ -9920,13 +10594,13 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, "node_modules/thread-stream": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.0.tgz", - "integrity": "sha512-xZYtOtmnA63zj04Q+F9bdEay5r47bvpo1CaNqsKi7TpoJHcotUez8Fkfo2RJWpW91lnnaApdpRbVwCWsy+ifcw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-2.4.1.tgz", + "integrity": "sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==", "dev": true, "dependencies": { "real-require": "^0.2.0" @@ -9935,7 +10609,7 @@ "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "dev": true }, "node_modules/through2": { @@ -9969,6 +10643,12 @@ "util-deprecate": "~1.0.1" } }, + "node_modules/through2/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true + }, "node_modules/through2/node_modules/string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -10027,9 +10707,9 @@ } }, "node_modules/toad-cache": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.2.0.tgz", - "integrity": "sha512-Hj5zSqBS6OHbZoQk9IU8VqIr+0JUpwzunnwSlFJhG8aJSInYUMEuzItl3kJsGteTPd1qtflafdRHlRtUazYeqg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/toad-cache/-/toad-cache-3.3.0.tgz", + "integrity": "sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==", "dev": true, "engines": { "node": ">=12" @@ -10056,6 +10736,18 @@ "integrity": "sha512-cXzueh9pzBCsLzhToB4X4gZCb3KYkrsAcBAX97JnazE74HOl3cpBJYEV7nabHeG/6/WXCU5Yujlde/WPBUwnsg==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz", + "integrity": "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==", + "dev": true, + "engines": { + "node": ">=16.13.0" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-node": { "version": "10.9.1", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", @@ -10108,14 +10800,23 @@ "node": ">=0.4.0" } }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, "node_modules/tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", "dev": true, "dependencies": { "@types/json5": "^0.0.29", - "json5": "^1.0.1", + "json5": "^1.0.2", "minimist": "^1.2.6", "strip-bom": "^3.0.0" } @@ -10123,37 +10824,16 @@ "node_modules/tsconfig-paths/node_modules/strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/tslib": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/tsutils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", "dev": true }, "node_modules/type-check": { @@ -10189,6 +10869,57 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/typed-array-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", @@ -10203,23 +10934,17 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/typegram": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/typegram/-/typegram-4.3.0.tgz", - "integrity": "sha512-pS4STyOZoJ++Mwa9GPMTNjOwEzMkxFfFt1By6IbMOJfheP0utMP/H1ga6J9R4DTjAYBr0UDn4eQg++LpWBvcAg==", - "dev": true - }, "node_modules/typescript": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.2.tgz", - "integrity": "sha512-wVORMBGO/FAs/++blGNeAVdbNKtIh1rbBL2EyQ1+J9lClJ93KiiKe8PmFIVdXhHcyv44SL9oglmfeSsndo0jRw==", + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz", + "integrity": "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==", "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" }, "engines": { - "node": ">=12.20" + "node": ">=14.17" } }, "node_modules/unbox-primitive": { @@ -10298,7 +11023,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", "dev": true }, "node_modules/uuid": { @@ -10317,19 +11042,29 @@ "dev": true }, "node_modules/v8-to-istanbul": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.0.0.tgz", - "integrity": "sha512-HcvgY/xaRm7isYmyx+lFKA4uQmfUbN0J4M0nNItvzTvH/iQ9kW5j/t4YSR+Ge323/lrgDAWJoF46tzGQHwBHFw==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.3.tgz", + "integrity": "sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.7", + "@jridgewell/trace-mapping": "^0.3.12", "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^1.6.0" + "convert-source-map": "^2.0.0" }, "engines": { "node": ">=10.12.0" } }, + "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { + "version": "0.3.19", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz", + "integrity": "sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/valid-url": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", @@ -10364,7 +11099,7 @@ "node_modules/wcwidth": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", - "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==", "dev": true, "dependencies": { "defaults": "^1.0.3" @@ -10418,17 +11153,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz", + "integrity": "sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", "call-bind": "^1.0.2", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -10453,9 +11187,9 @@ "dev": true }, "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", "dev": true, "dependencies": { "ansi-styles": "^4.0.0", @@ -10463,10 +11197,7 @@ "strip-ansi": "^6.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/wrap-ansi-cjs": { @@ -10556,7 +11287,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", "dev": true }, "node_modules/xtend": { @@ -10592,30 +11323,30 @@ } }, "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { - "cliui": "^7.0.2", + "cliui": "^8.0.1", "escalade": "^3.1.1", "get-caller-file": "^2.0.5", "require-directory": "^2.1.1", - "string-width": "^4.2.0", + "string-width": "^4.2.3", "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" + "yargs-parser": "^21.1.1" }, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" } }, "node_modules/yn": { @@ -10640,9 +11371,9 @@ } }, "node_modules/youch": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/youch/-/youch-3.2.3.tgz", - "integrity": "sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/youch/-/youch-3.3.2.tgz", + "integrity": "sha512-9cwz/z7abtcHOIuH45nzmUFCZbyJA1nLqlirKvyNRx4wDMhqsBaifAJzBej7L4fsVPjFxYq3NK3GAcfvZsydFw==", "dev": true, "dependencies": { "cookie": "^0.5.0", @@ -10651,9 +11382,9 @@ } }, "node_modules/youch-terminal": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.2.tgz", - "integrity": "sha512-JfVAsD0r88+vWVz+Im6bMk+c7gErDp1lq6Z1Na5LAyPZTwhB3VgO6HUQsm83I217mRFSuwVwEpnvwkK/TDTNhQ==", + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/youch-terminal/-/youch-terminal-2.2.3.tgz", + "integrity": "sha512-/PE77ZwG072tXBvF47S9RL9/G80u86icZ5QwyjblyM67L4n/T5qQeM3Xrecbu8kkDDr/9T/PTj/X+6G/OSRQug==", "dev": true, "dependencies": { "kleur": "^4.1.5", diff --git a/package.json b/package.json index 96d9af1..b3085b3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/core", - "version": "4.9.1", + "version": "4.10.0", "description": "The plug and play Node.js framework.", "license": "MIT", "author": "João Lenon ", @@ -10,20 +10,25 @@ "keywords": [ "esm", "core", + "cli", + "rest", + "rest-api", + "http-server", + "console", "ignite", "nodejs", "athenna", - "bootstrap" + "bootstrap", + "typescript" ], + "engines": { + "node": ">=20.0.0" + }, "scripts": { - "start": "sh node bin/http.ts", - "http": "sh node bin/http.ts", - "repl": "sh node bin/repl.ts", - "artisan": "sh node bin/artisan.ts", - "build": "rimraf build && tsc --project bin/tsconfig.build.json", + "build": "node node_modules/@athenna/tsconfig/src/build.js", "lint:fix": "eslint \"{bin,src,tests}/**/*.ts\" --fix", - "test": "npm run --silent lint:fix && sh node bin/test.ts", - "test:debug": "cross-env NODE_DEBUG=athenna:* sh node --inspect bin/test.ts", + "test": "npm run --silent lint:fix && node --enable-source-maps --import=@athenna/tsconfig bin/test.ts", + "test:debug": "cross-env NODE_DEBUG=athenna:* node --inspect --enable-source-maps --import=@athenna/tsconfig bin/test.ts", "test:coverage": "c8 npm run --silent test" }, "files": [ @@ -40,6 +45,7 @@ "exports": { ".": "./src/index.js", "./types": "./src/types/index.js", + "./package": "./package.json", "./package.json": "./package.json", "./providers/CoreProvider": "./src/providers/CoreProvider.js", "./commands/MakeExceptionCommand": "./src/commands/MakeExceptionCommand.js", @@ -70,20 +76,18 @@ "semver": "^7.5.4" }, "devDependencies": { - "@athenna/artisan": "^4.10.0", - "@athenna/common": "^4.13.1", - "@athenna/config": "^4.4.0", - "@athenna/http": "^4.8.0", - "@athenna/ioc": "^4.4.0", - "@athenna/logger": "^4.5.0", - "@athenna/test": "^4.7.0", - "@athenna/view": "^4.3.0", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", - "c8": "^7.12.0", + "@athenna/artisan": "^4.15.0", + "@athenna/common": "^4.18.0", + "@athenna/config": "^4.7.0", + "@athenna/http": "^4.11.0", + "@athenna/ioc": "^4.7.0", + "@athenna/logger": "^4.8.0", + "@athenna/test": "^4.12.0", + "@athenna/tsconfig": "^4.9.2", + "@athenna/view": "^4.6.0", + "@typescript-eslint/eslint-plugin": "^6.7.4", + "@typescript-eslint/parser": "^6.7.4", "commitizen": "^4.2.6", - "copyfiles": "^2.4.1", - "cross-env": "^7.0.3", "cz-conventional-changelog": "^3.3.0", "eslint": "^8.36.0", "eslint-config-prettier": "^8.8.0", @@ -94,11 +98,7 @@ "eslint-plugin-promise": "^6.1.1", "husky": "^3.1.0", "lint-staged": "^12.5.0", - "prettier": "^2.8.7", - "reflect-metadata": "^0.1.13", - "rimraf": "^5.0.1", - "ts-node": "^10.9.1", - "typescript": "^5.0.2" + "prettier": "^2.8.7" }, "c8": { "all": true, @@ -106,10 +106,10 @@ "src/**/*.ts" ], "exclude": [ - "src/types/*", - "src/testing/*.ts", - "src/commands/*.ts", - "src/applications/Repl.ts" + "src/testing/BaseCliTest.ts", + "src/testing/BaseRestTest.ts", + "src/repl/helpers/Command.ts", + "src/types/*" ], "reporter": [ "text-summary", @@ -213,48 +213,47 @@ "interceptor": "node_modules/@athenna/http/templates/interceptor.edge", "terminator": "node_modules/@athenna/http/templates/terminator.edge" }, + "directories": { + "bootstrap": "bin" + }, "commands": { - "make:exception": "#src/commands/MakeExceptionCommand", - "make:facade": "#src/commands/MakeFacadeCommand", - "make:provider": "#src/commands/MakeProviderCommand", - "make:service": "#src/commands/MakeServiceCommand", - "make:test": "#src/commands/MakeTestCommand", + "make:exception": { + "path": "#src/commands/MakeExceptionCommand" + }, + "make:facade": { + "path": "#src/commands/MakeFacadeCommand" + }, + "make:provider": { + "path": "#src/commands/MakeProviderCommand" + }, + "make:service": { + "path": "#src/commands/MakeServiceCommand" + }, + "make:test": { + "path": "#src/commands/MakeTestCommand" + }, "serve": { "stayAlive": true, - "entrypoint": "#bin/http", "path": "#src/commands/ServeCommand" }, "test": { "stayAlive": true, - "entrypoint": "#bin/test", "path": "#src/commands/TestCommand" }, "repl": { "stayAlive": true, - "entrypoint": "#bin/repl", "path": "#src/commands/ReplCommand" }, "build": { "path": "#src/commands/BuildCommand", "tsconfig": "./tests/fixtures/tsconfig.json", - "metaFiles": [ - "app/hello.edge", - "LICENSE.md", - ".env" - ] + "outDir": "build" } }, - "services": [ - "#tests/fixtures/services/WelcomeService", - "#tests/fixtures/services/DecoratedWelcomeService" - ], "providers": [ "#src/providers/CoreProvider", "@athenna/http/providers/HttpRouteProvider", "@athenna/http/providers/HttpServerProvider" - ], - "preloads": [ - "#tests/fixtures/routes/http" ] } } diff --git a/src/applications/Artisan.ts b/src/applications/Console.ts similarity index 79% rename from src/applications/Artisan.ts rename to src/applications/Console.ts index dae1311..2be95c9 100644 --- a/src/applications/Artisan.ts +++ b/src/applications/Console.ts @@ -7,18 +7,19 @@ * file that was distributed with this source code. */ +import { debug } from '#src/debug' import { Log } from '@athenna/logger' import { Module, Options } from '@athenna/common' import type { ArtisanImpl } from '@athenna/artisan' -import type { ArtisanOptions } from '#src/types/ArtisanOptions' +import type { ConsoleOptions } from '#src/types/ConsoleOptions' -export class Artisan { +export class Console { /** * Boot the Artisan application and execute the commands of argv. */ public static async boot( argv: string[], - options?: ArtisanOptions + options?: ConsoleOptions ): Promise { options = Options.create(options, { displayName: null, @@ -28,6 +29,12 @@ export class Artisan { const artisan = ioc.safeUse('Athenna/Core/Artisan') + debug( + 'booting console application with argv %o and options %o', + argv, + options + ) + await this.resolveKernel(argv, options) await artisan.parse(argv, options.displayName) @@ -38,10 +45,10 @@ export class Artisan { * Resolve the kernel by importing it and calling the methods to register * commands, routes and console exception handler. */ - private static async resolveKernel(argv: string[], options?: ArtisanOptions) { + private static async resolveKernel(argv: string[], options?: ConsoleOptions) { const Kernel = await Module.resolve( options.kernelPath, - Config.get('rc.meta') + Config.get('rc.parentURL') ) const kernel = new Kernel() diff --git a/src/applications/Http.ts b/src/applications/Http.ts index 7a63d3b..68a228d 100644 --- a/src/applications/Http.ts +++ b/src/applications/Http.ts @@ -7,6 +7,7 @@ * file that was distributed with this source code. */ +import { debug } from '#src/debug' import { Log } from '@athenna/logger' import type { ServerImpl } from '@athenna/http' import { Is, Module, Options } from '@athenna/common' @@ -21,37 +22,39 @@ export class Http { host: Config.get('http.host', '127.0.0.1'), port: Config.get('http.port', 3000), trace: Config.get('http.trace', false), - routePath: Path.routes(`http.${Path.ext()}`), + routePath: Path.routes(`rest.${Path.ext()}`), kernelPath: '@athenna/http/kernels/HttpKernel' }) const server = ioc.safeUse('Athenna/Core/HttpServer') + debug('booting http application with options %o', options) + await this.resolveKernel(options) ioc.safeUse('Athenna/Core/HttpRoute').register() - await server.listen({ host: options.host, port: options.port }).then(() => { - if (Config.is('rc.bootLogs', false)) { - return - } + await server.listen({ host: options.host, port: options.port }) - const host = server.getHost() - const port = server.getPort() - let path = `${host}:${port}` + if (Config.notExists('rc.bootLogs') || Config.is('rc.bootLogs', false)) { + return + } - if (!Is.Ip(host)) { - path = host - } + const host = server.getHost() || options.host + const port = server.getPort() || options.port + let path = `${host}:${port}` - if (host === '::1') { - path = `localhost:${port}` - } + if (!Is.Ip(host)) { + path = host + } - Log.channelOrVanilla('application').success( - `Http server started on ({yellow} ${path})` - ) - }) + if (host === '::1') { + path = `localhost:${port}` + } + + Log.channelOrVanilla('application').success( + `Http server started on ({yellow} ${path})` + ) return server } @@ -64,7 +67,7 @@ export class Http { private static async resolveKernel(options?: HttpOptions) { const Kernel = await Module.resolve( options.kernelPath, - Config.get('rc.meta') + Config.get('rc.parentURL') ) const kernel = new Kernel() @@ -76,11 +79,7 @@ export class Http { await kernel.registerHelmet() await kernel.registerSwagger() await kernel.registerRateLimit() - - if (options.trace) { - await kernel.registerRTracer() - } - + await kernel.registerRTracer(options.trace) await kernel.registerLoggerTerminator() await kernel.registerRoutes(options.routePath) diff --git a/src/applications/Repl.ts b/src/applications/Repl.ts index be2cb03..09588ca 100644 --- a/src/applications/Repl.ts +++ b/src/applications/Repl.ts @@ -10,175 +10,56 @@ import figlet from 'figlet' import chalkRainbow from 'chalk-rainbow' -import { Color } from '@athenna/common' -import type { PrettyREPLServer } from 'pretty-repl' -import { INTERNAL_REPL_PROPS } from '#src/constants/InternalReplProps' +import { debug } from '#src/debug' +import { Log } from '@athenna/logger' +import { Ls } from '#src/repl/commands/Ls' +import { Color, Is } from '@athenna/common' +import { Logger } from '#src/repl/ui/Logger' +import { Clean } from '#src/repl/commands/Clean' +import type { ReplImpl } from '#src/repl/ReplImpl' export class Repl { - /** - * The logger used to display logs before REPL session starts. - */ - private static get log() { - if (Env('CORE_TESTING', false)) { - return { - write: () => null, - red: () => null, - gray: () => null, - green: () => null, - purple: () => null, - yellow: () => null - } - } - - return { - write: m => process.stdout.write(m + '\n'), - red: m => process.stdout.write(Color.red(m + '\n')), - gray: m => process.stdout.write(Color.gray(m + '\n')), - green: m => process.stdout.write(Color.green(m + '\n')), - purple: m => process.stdout.write(Color.purple(m + '\n')), - yellow: m => process.stdout.write(Color.yellow(m + '\n')) - } - } - /** * Boot the Repl application and session. */ - public static async boot(): Promise { - const { start } = await import('pretty-repl') + public static async boot(): Promise { + const repl = ioc.safeUse('Athenna/Core/Repl') - const repl = start({ prompt: '' }).on('exit', Repl.handleExit) + debug('booting repl application') - if (!Env('CORE_TESTING', false)) { - repl.write('delete process.domain._events.error\n') - repl.write('', { ctrl: true, name: 'l' }) - } + await repl.start() - Repl.log.write(chalkRainbow(figlet.textSync('REPL\n'))) - Repl.log.gray('To import your modules use dynamic imports:\n') - Repl.log.gray("const { User } = await import('#app/Models/User')\n") + repl.removeDomainErrorHandler().clean() - Repl.log.write( - `${Color.yellow.bold('To see all commands available type:')} .help\n` - ) + Logger.write(chalkRainbow(figlet.textSync('REPL\n'))) + Logger.gray('To import your modules use dynamic imports:\n') + Logger.gray("const { User } = await import('#app/models/User')\n") - repl.setPrompt(Repl.getPrompt()) - repl.displayPrompt(false) + Logger.write( + `${Color.yellow.bold('To see all commands available type:')} .help\n\n` + ) - Repl.defineLsCommand(repl) - Repl.defineCleanCommand(repl) + repl + .setPrompt(Color.purple.bold('Athenna ') + Color.green.bold('❯ ')) + .displayPrompt(false) + .commandImpl(Ls) + .commandImpl(Clean) return repl } /** - * Handle the exit event of REPL session. + * REPL error handler for errors that + * happens inside the session. */ - private static handleExit() { - if (Env('CORE_TESTING', false)) { - return + public static handleError(error: any) { + if (!Is.Exception(error)) { + error = error.toAthennaException() } - process.exit() - } - - /** - * Get the REPL prompt. - */ - private static getPrompt() { - if (Env('CORE_TESTING', false)) { - return '' - } - - return Color.purple.bold('Athenna ') + Color.green.bold('❯ ') - } - - /** - * Define the .ls command in the session. - */ - private static defineLsCommand(repl: PrettyREPLServer) { - repl.defineCommand('ls', { - help: 'List all Athenna preloaded methods/properties in REPL context and some of the Node.js globals.', - action() { - this.clearBufferedCommand() - - const nodeInternals = [] - const athennaInternals = [] - - Object.keys(repl.context).forEach(key => { - if (INTERNAL_REPL_PROPS.includes(key)) { - if (key.startsWith('__')) { - return - } - - nodeInternals.push(Color.yellow(` - ${key}`)) - return - } - - athennaInternals.push(Color.yellow(` - ${key}`)) - }) - - if (nodeInternals.length) { - Repl.log.write( - `${Color.green.bold('\nFROM NODE:')}\n\n${nodeInternals.join('\n')}` - ) - } - - if (athennaInternals.length) { - Repl.log.write( - `${Color.purple.bold('\nFROM ATHENNA:')}\n\n${athennaInternals.join( - '\n' - )}` - ) - } - - Repl.log.write('') - - this.displayPrompt() - } - }) - } - - /** - * Define the .clean command in the session. - */ - private static defineCleanCommand(repl: PrettyREPLServer) { - repl.defineCommand('clean', { - help: `Clean any property of REPL global context. Example: .clean ${Color.gray( - '(propertyName)' - )}`, - action(property) { - this.clearBufferedCommand() - - Repl.log.write('') - - if (!property) { - Repl.log.red('You have not provided any property to remove.') - Repl.log.write( - `Try like this: .clean ${Color.gray('(propertyName)')}\n` - ) - - return this.displayPrompt() - } - - if (!repl.context[property]) { - Repl.log.red( - `The property "${property}" doesn't exist inside REPL global context.` - ) - Repl.log.red( - 'Use the ".ls" command to check the properties available in REPL global context.' - ) - - return this.displayPrompt() - } - - delete repl.context[property] - - Repl.log.green( - `Property "${property}" successfully removed from REPL global context.\n` - ) - - this.displayPrompt() - } + error.prettify().then(prettified => { + Log.channelOrVanilla('exception').fatal(prettified) + ioc.use('Athenna/Core/Repl').displayPrompt() }) } } diff --git a/src/commands/BuildCommand.ts b/src/commands/BuildCommand.ts index 878f076..9e70d76 100644 --- a/src/commands/BuildCommand.ts +++ b/src/commands/BuildCommand.ts @@ -1,5 +1,5 @@ /** - * @athenna/artisan + * @athenna/core * * (c) João Lenon * @@ -7,9 +7,13 @@ * file that was distributed with this source code. */ +import { rimraf } from 'rimraf' +import { tsc } from '@athenna/tsconfig/tsc' +import { Path, Color } from '@athenna/common' import { BaseCommand } from '@athenna/artisan' +import { copyfiles } from '@athenna/tsconfig/copyfiles' import { isAbsolute, join, parse, sep } from 'node:path' -import { Exec, Path, File, Color } from '@athenna/common' +import { UndefinedOutDirException } from '#src/exceptions/UndefinedOutDirException' export class BuildCommand extends BaseCommand { public static signature(): string { @@ -29,51 +33,32 @@ export class BuildCommand extends BaseCommand { tsConfigPath = join(Path.pwd(), tsConfigPath) } - const tsConfig = await new File(tsConfigPath).getContentAsJson() - const metaFiles = Config.get('rc.commands.build.metaFiles', []).join(' ') - const buildDir = - parse(tsConfigPath).dir + sep + tsConfig.compilerOptions.outDir + const include = Config.get('rc.commands.build.include', []) - if (metaFiles.includes(' .env ')) { - metaFiles.replace(' .env ', '') + if (include.includes('.env')) { + include.splice(include.indexOf('.env'), 1) } + const compiler = Color.yellow.bold('tsc') + const includedFiles = Color.gray(include.join(', ')) + + const outDir = this.getOutDir(tsConfigPath) + const outDirName = Color.yellow.bold(parse(outDir).name) + const tasks = this.logger.task() - tasks.add( - `Delete old ${Color.yellow.bold(parse(buildDir).name)} folder`, - async task => { - await Exec.command(`${Path.nodeModulesBin('rimraf')} ${buildDir}`) - .then(() => task.complete()) - .catch(error => { - task.fail() - throw error - }) - } + tasks.addPromise(`Deleting old ${outDirName} folder`, () => rimraf(outDir)) + + tasks.addPromise( + `Compiling the application with ${compiler} compiler`, + () => tsc(tsConfigPath) ) - tasks.add('Compile the application', async task => { - await Exec.command( - `${Path.nodeModulesBin('tsc')} --project ${tsConfigPath}` + if (include.length) { + tasks.addPromise( + `Copying included paths to ${outDirName} folder: ${includedFiles}`, + () => copyfiles(include, outDir) ) - .then(() => task.complete()) - .catch(error => { - task.fail() - throw error - }) - }) - - if (metaFiles.length) { - tasks.add(`Copy meta files: ${Color.gray(metaFiles)}`, async task => { - await Exec.command( - `${Path.nodeModulesBin('copyfiles')} ${metaFiles} ${buildDir}` - ) - .then(() => task.complete()) - .catch(error => { - task.fail() - throw error - }) - }) } await tasks.run() @@ -82,4 +67,14 @@ export class BuildCommand extends BaseCommand { this.logger.success('Application successfully compiled') } + + private getOutDir(tsConfigPath: string): string { + if (!Config.exists('rc.commands.build.outDir')) { + throw new UndefinedOutDirException() + } + + return ( + parse(tsConfigPath).dir + sep + Config.get('rc.commands.build.outDir') + ) + } } diff --git a/src/commands/ReplCommand.ts b/src/commands/ReplCommand.ts index 3d50817..9da900d 100644 --- a/src/commands/ReplCommand.ts +++ b/src/commands/ReplCommand.ts @@ -28,6 +28,7 @@ export class ReplCommand extends BaseCommand { public async handle(): Promise { if (this.env !== '') { + process.env.APP_ENV = this.env process.env.NODE_ENV = this.env } @@ -36,6 +37,6 @@ export class ReplCommand extends BaseCommand { Path.bootstrap(`repl.${Path.ext()}`) ) - await Module.resolve(entrypoint, Config.get('rc.meta')) + await Module.resolve(entrypoint, Config.get('rc.parentURL')) } } diff --git a/src/commands/ServeCommand.ts b/src/commands/ServeCommand.ts index 311e05a..af8c309 100644 --- a/src/commands/ServeCommand.ts +++ b/src/commands/ServeCommand.ts @@ -28,6 +28,7 @@ export class ServeCommand extends BaseCommand { public async handle(): Promise { if (this.env !== '') { + process.env.APP_ENV = this.env process.env.NODE_ENV = this.env } @@ -36,6 +37,6 @@ export class ServeCommand extends BaseCommand { Path.bootstrap(`main.${Path.ext()}`) ) - await Module.resolve(entrypoint, Config.get('rc.meta')) + await Module.resolve(entrypoint, Config.get('rc.parentURL')) } } diff --git a/src/commands/TestCommand.ts b/src/commands/TestCommand.ts index a24fb0e..20b25c2 100644 --- a/src/commands/TestCommand.ts +++ b/src/commands/TestCommand.ts @@ -48,6 +48,7 @@ export class TestCommand extends BaseCommand { public async handle(): Promise { if (this.env !== '') { + process.env.APP_ENV = this.env process.env.NODE_ENV = this.env } @@ -58,6 +59,6 @@ export class TestCommand extends BaseCommand { process.argv.splice(2, 1) - await Module.resolve(entrypoint, Config.get('rc.meta')) + await Module.resolve(entrypoint, Config.get('rc.parentURL')) } } diff --git a/tests/fixtures/bootstrap/main.ts b/src/debug/index.ts similarity index 68% rename from tests/fixtures/bootstrap/main.ts rename to src/debug/index.ts index d3791b1..50a1e90 100644 --- a/tests/fixtures/bootstrap/main.ts +++ b/src/debug/index.ts @@ -7,7 +7,6 @@ * file that was distributed with this source code. */ -console.log('serving application') -console.log('env:', process.env.NODE_ENV) +import { debuglog } from 'node:util' -process.exit() +export const debug = debuglog('athenna:core') diff --git a/src/exceptions/UndefinedOutDirException.ts b/src/exceptions/UndefinedOutDirException.ts new file mode 100644 index 0000000..cb6ba00 --- /dev/null +++ b/src/exceptions/UndefinedOutDirException.ts @@ -0,0 +1,24 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Color, Exception } from '@athenna/common' + +export class UndefinedOutDirException extends Exception { + public constructor() { + super({ + status: 500, + code: 'E_SIMPLE_CLI', + message: `The ${Color.yellow.bold( + 'commands.build.outDir' + )} setting is not defined in your ${Color.yellow.bold( + '.athennarc.json' + )} file. Please define it to continue.` + }) + } +} diff --git a/tests/fixtures/tests/main.ts b/src/facades/Repl.ts similarity index 55% rename from tests/fixtures/tests/main.ts rename to src/facades/Repl.ts index b507d6a..e704660 100644 --- a/tests/fixtures/tests/main.ts +++ b/src/facades/Repl.ts @@ -7,9 +7,7 @@ * file that was distributed with this source code. */ -console.log('running tests') -console.log('argv:', process.argv) -console.log('env:', process.env.NODE_ENV) -console.log(process.env.DEBUG) +import { Facade } from '@athenna/ioc' +import type { ReplImpl } from '#src/repl/ReplImpl' -process.exit() +export const Repl = Facade.createFor('Athenna/Core/Repl') diff --git a/src/helpers/LoadHelper.ts b/src/helpers/LoadHelper.ts index f34f6ce..942dff1 100644 --- a/src/helpers/LoadHelper.ts +++ b/src/helpers/LoadHelper.ts @@ -8,6 +8,7 @@ */ import { parse } from 'node:path' +import { debug } from '#src/debug' import { Log } from '@athenna/logger' import { Exec, Module } from '@athenna/common' import { ServiceProvider } from '@athenna/ioc' @@ -44,20 +45,20 @@ export class LoadHelper { * Execute the "boot" method of all the providers loaded. */ public static async bootProviders(): Promise { - await Exec.concurrently( - this.providers, - Provider => new Provider().boot() as Promise - ) + await Exec.concurrently(this.providers, Provider => { + debug('running boot() method of provider %s.', Provider.name) + return new Provider().boot() as Promise + }) } /** * Execute the "register" method of all the providers loaded. */ public static async registerProviders(): Promise { - await Exec.concurrently( - this.providers, - Provider => new Provider().register() as Promise - ) + await Exec.concurrently(this.providers, Provider => { + debug('running register() method of provider %s.', Provider.name) + return new Provider().register() as Promise + }) } /** @@ -65,6 +66,8 @@ export class LoadHelper { */ public static async shutdownProviders(): Promise { await Exec.concurrently(this.providers, Provider => { + debug('running shutdown() method of provider %s.', Provider.name) + if (Config.is('rc.shutdownLogs', true)) { Log.channelOrVanilla('application').success( `Provider ({yellow} ${Provider.name}) successfully shutdown` @@ -80,7 +83,10 @@ export class LoadHelper { */ public static async preloadFiles(): Promise { await Exec.concurrently(Config.get('rc.preloads', []), path => { + debug('preloading path %s.', path) + if (this.alreadyPreloaded.includes(path)) { + debug('path %s has already been preloaded and will be skipped.', path) return } @@ -103,10 +109,17 @@ export class LoadHelper { const providers = await Exec.concurrently(paths, this.resolvePath) this.providers = providers.filter(Provider => { + debug('loading provider %s.', Provider.name) + if (!this.isRegistered(Provider) && this.canBeBootstrapped(Provider)) { return true } + debug( + 'provider %s will not be loaded because it is already registered or it cannot bootstrap in the current environment.', + Provider.name + ) + return false }) } @@ -141,6 +154,6 @@ export class LoadHelper { * Resolve the import path by meta URL and import it. */ private static async resolvePath(path: string) { - return Module.resolve(path, Config.get('rc.meta')) + return Module.resolve(path, Config.get('rc.parentURL')) } } diff --git a/src/ignite/Ignite.ts b/src/ignite/Ignite.ts index 8d39a02..cbeebdb 100644 --- a/src/ignite/Ignite.ts +++ b/src/ignite/Ignite.ts @@ -8,21 +8,21 @@ */ import type { - ArtisanOptions, HttpOptions, + ConsoleOptions, IgniteOptions, SemverNode } from '#src/types' import { Ioc } from '@athenna/ioc' import { Http } from '#src/applications/Http' -import { Repl } from '#src/applications/Repl' import { EnvHelper, Rc } from '@athenna/config' import { isAbsolute, resolve } from 'node:path' -import { Artisan } from '#src/applications/Artisan' -import type { PrettyREPLServer } from 'pretty-repl' +import type { ReplImpl } from '#src/repl/ReplImpl' +import { Console } from '#src/applications/Console' import { LoadHelper } from '#src/helpers/LoadHelper' import { Log, LoggerProvider } from '@athenna/logger' +import { Repl as ReplApp } from '#src/applications/Repl' import { File, Is, Module, Options } from '@athenna/common' import { parse as semverParse, satisfies as semverSatisfies } from 'semver' import { NotSatisfiedNodeVersion } from '#src/exceptions/NotSatisfiedNodeVersion' @@ -34,14 +34,14 @@ export class Ignite { public container = new Ioc() /** - * The meta url path where the Ignite was called. + * The parent url path where the Ignite was called. * * @example * ```ts * new Ignite(import.meta.url)... * ``` */ - public meta: string + public parentURL: string /** * The Ignite options that will be used in "fire" method. @@ -51,11 +51,11 @@ export class Ignite { /** * Load the Ignite class using the options and meta url path. */ - public async load(meta: string, options?: IgniteOptions): Promise { + public async load(parentURL: string, options?: IgniteOptions): Promise { try { new LoggerProvider().register() - this.meta = meta + this.parentURL = parentURL this.options = Options.create(options, { beforePath: 'build', bootLogs: true, @@ -91,53 +91,58 @@ export class Ignite { /** * Ignite the REPL application. */ - public async repl(): Promise { - this.options.environments.push('repl') + public async repl(): Promise { + try { + const { ReplProvider } = await import('#src/providers/ReplProvider') - await this.fire() + new ReplProvider().register() - this.options.uncaughtExceptionHandler = async error => { - if (!Is.Exception(error)) { - error = error.toAthennaException() - } + this.options.environments.push('repl') - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - await Log.channelOrVanilla('exception').fatal(await error.prettify()) - repl.displayPrompt() - } + await this.fire() - this.setUncaughtExceptionHandler() + this.options.uncaughtExceptionHandler = ReplApp.handleError - const repl = await Repl.boot() + this.setUncaughtExceptionHandler() - return repl + return await ReplApp.boot() + } catch (err) { + await this.handleError(err) + } } /** - * Ignite the Artisan application. + * Ignite the Console application. */ - public async artisan(argv: string[], options?: ArtisanOptions) { - const { ViewProvider } = await import('@athenna/view') - const { ArtisanProvider } = await import('@athenna/artisan') + public async console(argv: string[], options?: ConsoleOptions) { + try { + const { ViewProvider } = await import('@athenna/view') + const { ArtisanProvider } = await import('@athenna/artisan') - new ViewProvider().register() - new ArtisanProvider().register() + new ViewProvider().register() + new ArtisanProvider().register() - this.options.environments.push('console') + this.options.environments.push('console') - return Artisan.boot(argv, options) + return await Console.boot(argv, options) + } catch (err) { + await this.handleError(err) + } } /** * Ignite the Http server application. */ public async httpServer(options?: HttpOptions) { - this.options.environments.push('http') + try { + this.options.environments.push('http') - await this.fire() + await this.fire() - return Http.boot(options) + return await Http.boot(options) + } catch (err) { + await this.handleError(err) + } } /** @@ -188,12 +193,11 @@ export class Ignite { * ``` */ public setUncaughtExceptionHandler(): void { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - if (Is.Array(process?._events?.uncaughtException)) { - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - process._events.uncaughtException.splice(1, 1) + if (process.listeners('uncaughtException').length) { + process.removeListener( + 'uncaughtException', + this.options.uncaughtExceptionHandler + ) } process.on('uncaughtException', this.options.uncaughtExceptionHandler) @@ -222,17 +226,15 @@ export class Ignite { Config.set('rc.callPath', process.cwd()) } - if (!process.env.CORE_TESTING) { - const __dirname = Module.createDirname(import.meta.url) + const __dirname = Module.createDirname(import.meta.url) - process.chdir(resolve(__dirname, '..', '..', '..', '..', '..')) - } + process.chdir(resolve(__dirname, '..', '..', '..', '..', '..')) /** * If env IS_TS is already set, then we cant change it. */ if (Env('IS_TS') === undefined) { - if (this.meta.endsWith('.ts')) { + if (this.parentURL.endsWith('.ts')) { process.env.IS_TS = 'true' } else { process.env.IS_TS = 'false' @@ -257,11 +259,9 @@ export class Ignite { } Object.keys(Path.dirs).forEach(dir => { - if (dir === 'nodeModules') { - return - } + const ignoreDirs = Config.get('rc.ignoreDirsBeforePath') - if (dir === 'nodeModulesBin') { + if (ignoreDirs.includes(dir)) { return } @@ -300,20 +300,20 @@ export class Ignite { const signals = Config.get('app.signals', {}) if (!signals.SIGINT) { - signals.SIGINT = async () => { + signals.SIGINT = () => { process.exit() } } if (!signals.SIGTERM) { - signals.SIGTERM = async signal => { - await LoadHelper.shutdownProviders() - - process.kill(process.pid, signal) + signals.SIGTERM = signal => { + LoadHelper.shutdownProviders().then(() => + process.kill(process.pid, signal) + ) } } - Object.keys(signals).forEach(key => { + Object.keys(signals).forEach((key: any) => { if (!signals[key]) { return } @@ -339,19 +339,24 @@ export class Ignite { public async setRcContentAndAppVars() { const file = new File(this.options.athennaRcPath, '') const pkgJson = await new File(Path.pwd('package.json')).getContentAsJson() - const corePkgJson = await new File('../../package.json').getContentAsJson() + const __dirname = Module.createDirname(import.meta.url) + const corePkgJson = await new File( + resolve(__dirname, '..', '..', 'package.json') + ).getContentAsJson() const coreSemverVersion = this.parseVersion(corePkgJson.version) - process.env.APP_NAME = pkgJson.name - process.env.APP_VERSION = this.parseVersion(pkgJson.version).toString() - process.env.ATHENNA_VERSION = `Athenna Framework ${coreSemverVersion.toString()}` + process.env.APP_NAME = process.env.APP_NAME || pkgJson.name + process.env.APP_VERSION = + process.env.APP_VERSION || this.parseVersion(pkgJson.version).toString() + process.env.ATHENNA_VERSION = `Athenna Framework v${coreSemverVersion.toString()}` const athennaRc = { - meta: this.meta, + parentURL: this.parentURL, typescript: Env('IS_TS', false), version: process.env.APP_VERSION, athennaVersion: process.env.ATHENNA_VERSION, engines: pkgJson.engines || {}, + ignoreDirsBeforePath: ['nodeModules', 'nodeModulesBin'], commands: {}, directories: {}, services: [], @@ -442,11 +447,14 @@ export class Ignite { /** * Handle an error turning it pretty and logging as fatal. */ - private async handleError(error: any) { + public async handleError(error: any) { if (process.versions.bun) { console.error(error) - process.exit(1) + /** + * Return is needed only for testing purposes. + */ + return process.exit(1) } if (!Is.Exception(error)) { diff --git a/src/index.ts b/src/index.ts index 905bceb..34a511c 100644 --- a/src/index.ts +++ b/src/index.ts @@ -7,8 +7,10 @@ * file that was distributed with this source code. */ -export * from './types/index.js' +export * from '#src/types' +export * from '#src/facades/Repl' +export * from '#src/repl/ReplImpl' export * from '#src/ignite/Ignite' export * from '#src/helpers/LoadHelper' diff --git a/src/providers/CoreProvider.ts b/src/providers/CoreProvider.ts index 21e2de7..00b6076 100644 --- a/src/providers/CoreProvider.ts +++ b/src/providers/CoreProvider.ts @@ -17,7 +17,7 @@ export class CoreProvider extends ServiceProvider { await ioc.loadModules(services, { addCamelAlias: true, - metaUrl: Config.get('rc.meta') + parentURL: Config.get('rc.parentURL') }) } } diff --git a/src/providers/ReplProvider.ts b/src/providers/ReplProvider.ts new file mode 100644 index 0000000..5c144ab --- /dev/null +++ b/src/providers/ReplProvider.ts @@ -0,0 +1,19 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import 'reflect-metadata' + +import { ReplImpl } from '#src/repl/ReplImpl' +import { ServiceProvider } from '@athenna/ioc' + +export class ReplProvider extends ServiceProvider { + public async register() { + this.container.singleton('Athenna/Core/Repl', ReplImpl) + } +} diff --git a/src/repl/ReplImpl.ts b/src/repl/ReplImpl.ts new file mode 100644 index 0000000..4eb4484 --- /dev/null +++ b/src/repl/ReplImpl.ts @@ -0,0 +1,158 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Is, Module, Options, String } from '@athenna/common' +import type { Command } from '#src/repl/helpers/Command' +import type { REPLServer, ReplOptions } from 'node:repl' +import { CommandBuilder } from '#src/repl/helpers/CommandBuilder' + +type REPLWriteKey = { + sequence?: string | undefined + name?: string | undefined + ctrl?: boolean | undefined + meta?: boolean | undefined + shift?: boolean | undefined +} + +export class ReplImpl { + /** + * Holds the repl session. + */ + public session: REPLServer + + /** + * Start the repl session. + */ + public async start(options?: ReplOptions): Promise { + options = Options.create(options, { + prompt: '' + }) + + const { start } = await this.importRepl() + + this.session = start(options) + + return this.session + } + + /** + * Define a command in the repl session. + */ + public command(signature: string): CommandBuilder { + return new CommandBuilder(signature, this.session) + } + + /** + * Define a command using the implementation class. + */ + public commandImpl(command: typeof Command): ReplImpl { + this.command(command.signature()) + .help(command.help()) + .action(command.action) + .register() + + return this + } + + /** + * Display the repl prompt. + */ + public displayPrompt(preserveCursor?: boolean): ReplImpl { + this.session.displayPrompt(preserveCursor) + + return this + } + + /** + * Set a different prompt to the repl session. + */ + public setPrompt(prompt: string): ReplImpl { + this.session.setPrompt(prompt) + + return this + } + + /** + * Write some message in the repl session. + */ + public write(message: string | Buffer, key?: REPLWriteKey): ReplImpl { + this.session.write(message, key) + + return this + } + + /** + * Clean the repl session content by simulating + * pressing CTRL + L. + */ + public clean(): ReplImpl { + return this.write('', { ctrl: true, name: 'l' }) + } + + /** + * Remove the domain error handler from the repl session. + */ + public removeDomainErrorHandler(): ReplImpl { + this.write('delete process?.domain?._events?.error\n') + + return this + } + + /** + * Set a key value in the repl context. + */ + public setInContext(key: string, value: any): ReplImpl { + this.session.context[key] = value + + return this + } + + /** + * Import a module in the repl session. + */ + public import(key: string, path: string): ReplImpl { + return this.write(`const ${key} = await import('${path}')`) + } + + /** + * Import a module and register all it properties + * in the repl context. + */ + public async importInContext(path: string) { + let module = await Module.resolve(path, Config.get('rc.parentURL'), { + import: true, + getModule: false + }) + + if (module.default && Object.keys(module).length === 1) { + module = module.default + } + + if (Is.String(module) || !Object.keys(module).length) { + let key = module.name + + if (!key || key === 'default') { + key = String.toCamelCase(path.split('/').pop()) + } + + this.setInContext(key, module) + + return + } + + Object.keys(module).forEach(key => this.setInContext(key, module[key])) + } + + /** + * Import the repl module. + */ + private async importRepl(): Promise { + return await import('pretty-repl') + } +} diff --git a/src/repl/commands/Clean.ts b/src/repl/commands/Clean.ts new file mode 100644 index 0000000..44eb14f --- /dev/null +++ b/src/repl/commands/Clean.ts @@ -0,0 +1,63 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { REPLServer } from 'node:repl' +import { Color } from '@athenna/common' +import { Logger } from '#src/repl/ui/Logger' +import { Command } from '#src/repl/helpers/Command' + +export class Clean extends Command { + public static signature(): string { + return 'clean' + } + + public static help(): string { + return `Clean any property of REPL global context. Example: .clean ${Color.gray( + '(propertyName)' + )}` + } + + public static action(this: REPLServer, property: string) { + this.clearBufferedCommand() + + Logger.write('') + + if (!property) { + Logger.red('You have not provided any property to remove.\n') + Logger.write(`Try like this: .clean ${Color.gray('(propertyName)')}\n`) + + this.displayPrompt() + + return + } + + if (!this.context[property]) { + Logger.red( + `The property "${property}" doesn't exist inside REPL context.\n` + ) + Logger.write( + `Use the ${Color.gray( + '.ls' + )} command to check the properties available\n` + ) + + this.displayPrompt() + + return + } + + delete this.context[property] + + Logger.green( + `Property "${property}" successfully removed from REPL context.\n` + ) + + this.displayPrompt() + } +} diff --git a/src/repl/commands/Ls.ts b/src/repl/commands/Ls.ts new file mode 100644 index 0000000..66425b0 --- /dev/null +++ b/src/repl/commands/Ls.ts @@ -0,0 +1,62 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Color } from '@athenna/common' +import type { REPLServer } from 'node:repl' +import { Logger } from '#src/repl/ui/Logger' +import { Command } from '#src/repl/helpers/Command' +import { INTERNAL_REPL_PROPS } from '#src/constants/InternalReplProps' + +export class Ls extends Command { + public static signature(): string { + return 'ls' + } + + public static help(): string { + return 'List all Athenna preloaded methods/properties in REPL context and some of the Node.js globals.' + } + + public static action(this: REPLServer): void { + this.clearBufferedCommand() + + const nodeInternals = [] + const athennaInternals = [] + + Object.keys(this.context).forEach(key => { + if (key.startsWith('__')) { + return + } + + if (INTERNAL_REPL_PROPS.includes(key)) { + nodeInternals.push(Color.yellow(` - ${key}`)) + return + } + + athennaInternals.push(Color.yellow(` - ${key}`)) + }) + + if (nodeInternals.length) { + Logger.write( + `${Color.green.bold('\nFROM NODE:')}\n\n${nodeInternals.join('\n')}` + ) + } + + if (athennaInternals.length) { + Logger.write( + `${Color.purple.bold('\nFROM ATHENNA:')}\n\n${athennaInternals.join( + '\n' + )}` + ) + } + + Logger.write('') + + this.displayPrompt() + } +} diff --git a/src/repl/helpers/Command.ts b/src/repl/helpers/Command.ts new file mode 100644 index 0000000..57d3347 --- /dev/null +++ b/src/repl/helpers/Command.ts @@ -0,0 +1,32 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import type { REPLServer } from 'node:repl' + +export abstract class Command { + /** + * The command signature that will be used for calling + * the command. + */ + public static signature(): string { + return '' + } + + /** + * The command help description that will be displayed. + */ + public static help(): string { + return '' + } + + /** + * The action to be executed when the command is called. + */ + public static action(this: REPLServer, _?: string): void {} +} diff --git a/src/repl/helpers/CommandBuilder.ts b/src/repl/helpers/CommandBuilder.ts new file mode 100644 index 0000000..c94397a --- /dev/null +++ b/src/repl/helpers/CommandBuilder.ts @@ -0,0 +1,61 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import type { PrettyREPLServer } from 'pretty-repl' +import type { REPLCommand, REPLCommandAction } from 'node:repl' + +export class CommandBuilder { + /** + * Holds the command options. + */ + private options: Partial + + /** + * Holds the repl session. + */ + private session: PrettyREPLServer + + /** + * Holds the command signature. + */ + private signature: string + + public constructor(signature: string, session: PrettyREPLServer) { + this.signature = signature + this.session = session + this.options = {} + } + + /** + * Set the command help that will be displayed when running + * the .help command. + */ + public help(help: string): CommandBuilder { + this.options.help = help + + return this + } + + /** + * Set the command action that will be executed when running + * the command. + */ + public action(action: REPLCommandAction): CommandBuilder { + this.options.action = action + + return this + } + + /** + * Register the command in the repl session. + */ + public register(): void { + this.session.defineCommand(this.signature, this.options as REPLCommand) + } +} diff --git a/src/repl/ui/Logger.ts b/src/repl/ui/Logger.ts new file mode 100644 index 0000000..9f0c6fc --- /dev/null +++ b/src/repl/ui/Logger.ts @@ -0,0 +1,54 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Color } from '@athenna/common' + +export class Logger { + /** + * Write a message to the stdout. + */ + public static write(...args: any[]): void { + process.stdout.write(args.join(' ') + '\n') + } + + /** + * Write a message to the stdout in red color. + */ + public static red(...args: any[]): void { + Logger.write(Color.red(args.join(' '))) + } + + /** + * Write a message to the stdout in gray color. + */ + public static gray(...args: any[]): void { + Logger.write(Color.gray(args.join(' '))) + } + + /** + * Write a message to the stdout in green color. + */ + public static green(...args: any[]): void { + Logger.write(Color.green(args.join(' '))) + } + + /** + * Write a message to the stdout in purple color. + */ + public static purple(...args: any[]): void { + Logger.write(Color.purple(args.join(' '))) + } + + /** + * Write a message to the stdout in yellow color. + */ + public static yellow(...args: any[]): void { + Logger.write(Color.yellow(args.join(' '))) + } +} diff --git a/src/testing/BaseCliTest.ts b/src/testing/BaseCliTest.ts index a9c3a06..cc32c95 100644 --- a/src/testing/BaseCliTest.ts +++ b/src/testing/BaseCliTest.ts @@ -7,7 +7,6 @@ * file that was distributed with this source code. */ -import { pathToFileURL } from 'node:url' import { Options } from '@athenna/common' import { BeforeAll } from '@athenna/test' import { Ignite, type IgniteOptions } from '@athenna/core' @@ -23,7 +22,7 @@ export class BaseCliTest { TestCommand.setArtisanPath(this.artisanPath) this.ignite = await new Ignite().load( - pathToFileURL(Path.bootstrap(`test.${Path.ext()}`)).href, + Path.toHref(Path.bootstrap(`test.${Path.ext()}`)), this.getIgniteOptions() ) } diff --git a/src/testing/BaseRestTest.ts b/src/testing/BaseRestTest.ts index 8a499ac..5fceb90 100644 --- a/src/testing/BaseRestTest.ts +++ b/src/testing/BaseRestTest.ts @@ -7,7 +7,6 @@ * file that was distributed with this source code. */ -import { pathToFileURL } from 'node:url' import { Options } from '@athenna/common' import { ServerImpl } from '@athenna/http' import { AfterAll, BeforeAll } from '@athenna/test' @@ -15,27 +14,27 @@ import { Ignite, type HttpOptions, type IgniteOptions } from '@athenna/core' export class BaseRestTest { public ignite: Ignite - public restServer: ServerImpl - public restOptions: HttpOptions = {} + public httpServer: ServerImpl + public httpOptions: HttpOptions = {} public igniteOptions: IgniteOptions = {} @BeforeAll() public async baseBeforeAll() { this.ignite = await new Ignite().load( - pathToFileURL(Path.bootstrap(`test.${Path.ext()}`)).href, + Path.toHref(Path.bootstrap(`test.${Path.ext()}`)), this.getIgniteOptions() ) - this.restServer = await this.ignite.httpServer(this.getRestOptions()) + this.httpServer = await this.ignite.httpServer(this.getHttpOptions()) } @AfterAll() public async baseAfterAll() { - await this.restServer.close() + await this.httpServer.close() } - private getRestOptions() { - return Options.create(this.restOptions, {}) + private getHttpOptions() { + return Options.create(this.httpOptions, {}) } private getIgniteOptions() { diff --git a/src/types/ArtisanOptions.ts b/src/types/ConsoleOptions.ts similarity index 97% rename from src/types/ArtisanOptions.ts rename to src/types/ConsoleOptions.ts index d9d1da2..210dbe2 100644 --- a/src/types/ArtisanOptions.ts +++ b/src/types/ConsoleOptions.ts @@ -7,7 +7,7 @@ * file that was distributed with this source code. */ -export type ArtisanOptions = { +export type ConsoleOptions = { /** * The display name that should be rendered when calling just "node artisan" * command. diff --git a/src/types/HttpOptions.ts b/src/types/HttpOptions.ts index ce5ef26..243e819 100644 --- a/src/types/HttpOptions.ts +++ b/src/types/HttpOptions.ts @@ -52,7 +52,7 @@ export type HttpOptions = { * The path to the exception handler of http server requests. The exception * handler is responsible to handle all the exception that are throwed * inside route handlers. By default, Athenna will use the built in exception - * handler. But you can do your own implementantion extending the + * handler. But you can do your own implementation extending the * "HttpExceptionHandler" class from Http and setting the path to it here. * * @default '@athenna/http/handlers/HttpExceptionHandler' diff --git a/src/types/RcOptions.ts b/src/types/RcOptions.ts index a4f005e..3bce999 100644 --- a/src/types/RcOptions.ts +++ b/src/types/RcOptions.ts @@ -9,10 +9,10 @@ export interface RcOptions { /** - * The meta url of where the application has bootstrapped. Athenna will always save this information + * The parent url of where the application has bootstrapped. Athenna will always save this information * to know the call path where the application has started. */ - meta?: string + parentURL?: string /** * Set if the application will have boot logs showed. diff --git a/src/types/index.ts b/src/types/index.ts index 158e6c5..bcf46aa 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -7,7 +7,7 @@ * file that was distributed with this source code. */ -export * from '#src/types/ArtisanOptions' +export * from '#src/types/ConsoleOptions' export * from '#src/types/HttpOptions' export * from '#src/types/IgniteOptions' export * from '#src/types/RcOptions' diff --git a/tests/fixtures/.athennarc-dirs.json b/tests/fixtures/.athennarc-dirs.json deleted file mode 100644 index f42ff92..0000000 --- a/tests/fixtures/.athennarc-dirs.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "directories": { - "controllers": "src/http/controllers", - "middlewares": "src/http/middlewares", - "interceptors": "src/http/interceptors", - "terminators": "src/http/terminators" - } -} diff --git a/tests/fixtures/.athennarc.json b/tests/fixtures/.athennarc.json index 0967ef4..af9bccb 100644 --- a/tests/fixtures/.athennarc.json +++ b/tests/fixtures/.athennarc.json @@ -1 +1,3 @@ -{} +{ + "hello": "world!" +} diff --git a/tests/fixtures/.env b/tests/fixtures/.env index f735b5a..a1d34a4 100644 --- a/tests/fixtures/.env +++ b/tests/fixtures/.env @@ -1,2 +1 @@ -IGNITE_FIRED=true -NODE_ENV=local +LOADED_FIXTURE_ENV=true diff --git a/tests/fixtures/.env.local b/tests/fixtures/.env.local deleted file mode 100644 index 249ac5c..0000000 --- a/tests/fixtures/.env.local +++ /dev/null @@ -1 +0,0 @@ -ENV_LOCAL_LOADED=true diff --git a/tests/fixtures/LICENSE.md b/tests/fixtures/LICENSE.md index ce01362..e69de29 100644 --- a/tests/fixtures/LICENSE.md +++ b/tests/fixtures/LICENSE.md @@ -1 +0,0 @@ -hello diff --git a/tests/fixtures/app/hello.edge b/tests/fixtures/app/hello.edge deleted file mode 100644 index ce01362..0000000 --- a/tests/fixtures/app/hello.edge +++ /dev/null @@ -1 +0,0 @@ -hello diff --git a/tests/fixtures/main.js b/tests/fixtures/app/hello.ts similarity index 100% rename from tests/fixtures/main.js rename to tests/fixtures/app/hello.ts diff --git a/tests/fixtures/app/index.ts b/tests/fixtures/app/index.ts deleted file mode 100644 index 5402375..0000000 --- a/tests/fixtures/app/index.ts +++ /dev/null @@ -1 +0,0 @@ -console.log('hello world!') diff --git a/tests/fixtures/artisan.ts b/tests/fixtures/artisan.ts deleted file mode 100644 index 9ffe2ab..0000000 --- a/tests/fixtures/artisan.ts +++ /dev/null @@ -1,71 +0,0 @@ -#!/usr/bin/env node - -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Ignite } from '#src' - -/* -|-------------------------------------------------------------------------- -| Core testing -|-------------------------------------------------------------------------- -| -| This property helps the @athenna/core package to test the implementation -| of the Ignite class. With this env as "true", Athenna will not resolve -| the application root path because the package is not inside a node_modu -| les folder when running locally and in pipelines. -| -*/ - -process.env.CORE_TESTING = 'true' - -Config.set('rc.commands.test', { - path: '#src/commands/TestCommand', - entrypoint: '#tests/fixtures/tests/main' -}) -Config.set('rc.commands.repl', { - path: '#src/commands/ReplCommand', - entrypoint: '#tests/fixtures/bootstrap/repl' -}) -Config.set('rc.commands.serve', { - path: '#src/commands/ServeCommand', - entrypoint: '#tests/fixtures/bootstrap/main' -}) -Config.set('rc.commands.build', { - path: '#src/commands/BuildCommand', - tsconfig: './tests/fixtures/tsconfig.json', - metaFiles: ['app/hello.edge', 'LICENSE.md', '.env'] -}) - -/* -|-------------------------------------------------------------------------- -| Ignite -|-------------------------------------------------------------------------- -| -| Here is where your application will bootstrap. Ignite class will be res -| ponsible to bootstrap your application partial or complete. Is not reco -| mmended to bootstrap the Athenna application completelly by calling the -| "fire" method, you should always let the type of application determine if -| the application should be fully bootstrapped or not. -| -*/ - -const ignite = await new Ignite().load(import.meta.url, { bootLogs: false }) - -/* -|-------------------------------------------------------------------------- -| Artisan -|-------------------------------------------------------------------------- -| -| Bootstrap the Artisan application setting the Node.js argv and custom op -| tions. -| -*/ - -await ignite.artisan(process.argv, { displayName: 'Artisan' }) diff --git a/tests/fixtures/commands/GreetCommand.ts b/tests/fixtures/commands/GreetCommand.ts deleted file mode 100644 index 95c35c3..0000000 --- a/tests/fixtures/commands/GreetCommand.ts +++ /dev/null @@ -1,23 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { BaseCommand, Argument } from '@athenna/artisan' - -export class GreetCommand extends BaseCommand { - @Argument() - public name: string - - public static signature(): string { - return 'greet' - } - - public async handle(): Promise { - this.logger.simple(`({bold,green} [ HELLO ${this.name.toUpperCase()}! ])\n`) - } -} diff --git a/tests/fixtures/config/logging.ts b/tests/fixtures/config/logging.ts deleted file mode 100644 index c4cbd32..0000000 --- a/tests/fixtures/config/logging.ts +++ /dev/null @@ -1,24 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -export default { - default: 'application', - - channels: { - console: { - driver: 'null' - }, - application: { - driver: 'null' - }, - exception: { - driver: 'null' - } - } -} diff --git a/tests/fixtures/config/rc.ts b/tests/fixtures/config/rc.ts index 0a4cd0a..c917863 100644 --- a/tests/fixtures/config/rc.ts +++ b/tests/fixtures/config/rc.ts @@ -7,12 +7,11 @@ * file that was distributed with this source code. */ -import { Config } from '@athenna/config' +import { sep } from 'node:path' import { Path, File } from '@athenna/common' const athennaRc = new File(Path.pwd('package.json')).getContentAsJsonSync().athenna -athennaRc.isInPackageJson = true -athennaRc.meta = Config.get('meta', new URL('../../../bin/test.ts', import.meta.url).href) +athennaRc.parentURL = Path.toHref(Path.pwd() + sep) export default athennaRc diff --git a/tests/fixtures/consoles/absolute-path-entry.ts b/tests/fixtures/consoles/absolute-path-entry.ts new file mode 100644 index 0000000..b1774bd --- /dev/null +++ b/tests/fixtures/consoles/absolute-path-entry.ts @@ -0,0 +1,27 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { ViewProvider } from '@athenna/view' +import { Rc, Config } from '@athenna/config' +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ViewProvider().register() +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.repl.entrypoint', Path.fixtures('entrypoints/repl.ts')) +Config.set('rc.commands.serve.entrypoint', Path.fixtures('entrypoints/main.ts')) +Config.set('rc.commands.test.entrypoint', Path.fixtures('entrypoints/test.ts')) +Path.mergeDirs(Config.get('rc.directories', {})) +await Rc.setFile(Path.pwd('package.json')) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/base-console.ts b/tests/fixtures/consoles/base-console.ts new file mode 100644 index 0000000..d6da854 --- /dev/null +++ b/tests/fixtures/consoles/base-console.ts @@ -0,0 +1,25 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { ViewProvider } from '@athenna/view' +import { Rc, Config } from '@athenna/config' +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ViewProvider().register() +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +await Rc.setFile(Path.pwd('package.json')) + +Path.mergeDirs(Config.get('rc.directories', {})) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/console-mock-dest-import.ts b/tests/fixtures/consoles/console-mock-dest-import.ts new file mode 100644 index 0000000..c36c109 --- /dev/null +++ b/tests/fixtures/consoles/console-mock-dest-import.ts @@ -0,0 +1,31 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { ViewProvider } from '@athenna/view' +import { Rc, Config } from '@athenna/config' +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ViewProvider().register() +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.make:exception.destination', './tests/fixtures/storage/exceptions') +Config.set('rc.commands.make:facade.destination', './tests/fixtures/storage/facades') +Config.set('rc.commands.make:provider.destination', './tests/fixtures/storage/providers') +Config.set('rc.commands.make:service.destination', './tests/fixtures/storage/services') +Config.set('rc.commands.make:test.destination', './tests/fixtures/storage/tests') + +await Rc.setFile(Path.pwd('package.json')) + +Path.mergeDirs(Config.get('rc.directories', {})) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/dont-copy-dot-env.ts b/tests/fixtures/consoles/dont-copy-dot-env.ts new file mode 100644 index 0000000..2a45ddf --- /dev/null +++ b/tests/fixtures/consoles/dont-copy-dot-env.ts @@ -0,0 +1,22 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.build.include', ['.env']) + +Path.mergeDirs(Config.get('rc.directories', {})) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/import-alias-path-entry.ts b/tests/fixtures/consoles/import-alias-path-entry.ts new file mode 100644 index 0000000..3868494 --- /dev/null +++ b/tests/fixtures/consoles/import-alias-path-entry.ts @@ -0,0 +1,29 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { ViewProvider } from '@athenna/view' +import { Rc, Config } from '@athenna/config' +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ViewProvider().register() +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.repl.entrypoint', '#tests/fixtures/entrypoints/repl') +Config.set('rc.commands.serve.entrypoint', '#tests/fixtures/entrypoints/main') +Config.set('rc.commands.test.entrypoint', '#tests/fixtures/entrypoints/test') + +await Rc.setFile(Path.pwd('package.json')) + +Path.mergeDirs(Config.get('rc.directories', {})) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/include-files-glob.ts b/tests/fixtures/consoles/include-files-glob.ts new file mode 100644 index 0000000..2efa2cd --- /dev/null +++ b/tests/fixtures/consoles/include-files-glob.ts @@ -0,0 +1,20 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.build.include', ['src/**/*Command.ts']) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/include-files.ts b/tests/fixtures/consoles/include-files.ts new file mode 100644 index 0000000..68170b0 --- /dev/null +++ b/tests/fixtures/consoles/include-files.ts @@ -0,0 +1,20 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.build.include', ['README.md', 'LICENSE.md']) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/include-folders-glob.ts b/tests/fixtures/consoles/include-folders-glob.ts new file mode 100644 index 0000000..bf4211c --- /dev/null +++ b/tests/fixtures/consoles/include-folders-glob.ts @@ -0,0 +1,20 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.build.include', ['templates/**/*.edge']) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/include-folders.ts b/tests/fixtures/consoles/include-folders.ts new file mode 100644 index 0000000..188acd0 --- /dev/null +++ b/tests/fixtures/consoles/include-folders.ts @@ -0,0 +1,20 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.build.include', ['src/*', 'templates/*']) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/outdir-not-set.ts b/tests/fixtures/consoles/outdir-not-set.ts new file mode 100644 index 0000000..09c949a --- /dev/null +++ b/tests/fixtures/consoles/outdir-not-set.ts @@ -0,0 +1,20 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.delete('rc.commands.build.outDir') + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/relative-path-entry.ts b/tests/fixtures/consoles/relative-path-entry.ts new file mode 100644 index 0000000..b76234a --- /dev/null +++ b/tests/fixtures/consoles/relative-path-entry.ts @@ -0,0 +1,29 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { ViewProvider } from '@athenna/view' +import { Rc, Config } from '@athenna/config' +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ViewProvider().register() +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.repl.entrypoint', './tests/fixtures/entrypoints/repl.ts') +Config.set('rc.commands.serve.entrypoint', './tests/fixtures/entrypoints/main.ts') +Config.set('rc.commands.test.entrypoint', './tests/fixtures/entrypoints/test.ts') + +await Rc.setFile(Path.pwd('package.json')) + +Path.mergeDirs(Config.get('rc.directories', {})) + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/relative-path-tsconfig.ts b/tests/fixtures/consoles/relative-path-tsconfig.ts new file mode 100644 index 0000000..c8b600c --- /dev/null +++ b/tests/fixtures/consoles/relative-path-tsconfig.ts @@ -0,0 +1,21 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.build.tsconfig', './tests/fixtures/tsconfig.build.json') +Config.set('rc.commands.build.outDir', 'build-relative') + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/consoles/resolve-outdir-setting.ts b/tests/fixtures/consoles/resolve-outdir-setting.ts new file mode 100644 index 0000000..c8b600c --- /dev/null +++ b/tests/fixtures/consoles/resolve-outdir-setting.ts @@ -0,0 +1,21 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Artisan, ConsoleKernel, ArtisanProvider } from '@athenna/artisan' + +new ArtisanProvider().register() + +await Config.loadAll(Path.fixtures('config')) + +Config.set('rc.commands.build.tsconfig', './tests/fixtures/tsconfig.build.json') +Config.set('rc.commands.build.outDir', 'build-relative') + +await new ConsoleKernel().registerCommands() + +await Artisan.parse(process.argv) diff --git a/tests/fixtures/entrypoints/main.ts b/tests/fixtures/entrypoints/main.ts new file mode 100644 index 0000000..8a82a0d --- /dev/null +++ b/tests/fixtures/entrypoints/main.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +console.log('Hello from #tests/fixtures/entrypoints/main!') diff --git a/tests/fixtures/entrypoints/repl.ts b/tests/fixtures/entrypoints/repl.ts new file mode 100644 index 0000000..86df533 --- /dev/null +++ b/tests/fixtures/entrypoints/repl.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +console.log('Hello from #tests/fixtures/entrypoints/repl!') diff --git a/tests/fixtures/entrypoints/test.ts b/tests/fixtures/entrypoints/test.ts new file mode 100644 index 0000000..752cbf3 --- /dev/null +++ b/tests/fixtures/entrypoints/test.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +console.log('Hello from #tests/fixtures/entrypoints/test!') diff --git a/tests/fixtures/handlers/ConsoleExceptionHandler.ts b/tests/fixtures/handlers/ConsoleExceptionHandler.ts deleted file mode 100644 index 790bdbe..0000000 --- a/tests/fixtures/handlers/ConsoleExceptionHandler.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { CALLED_MAP } from '#tests/helpers/CalledMap' -import { ConsoleExceptionHandler as BaseConsoleExceptionHandler } from '@athenna/artisan' - -export class ConsoleExceptionHandler extends BaseConsoleExceptionHandler { - public constructor() { - super() - - CALLED_MAP.set(ConsoleExceptionHandler.name, true) - } -} diff --git a/tests/fixtures/handlers/CustomConsoleExceptionHandler.ts b/tests/fixtures/handlers/CustomConsoleExceptionHandler.ts new file mode 100644 index 0000000..9064f48 --- /dev/null +++ b/tests/fixtures/handlers/CustomConsoleExceptionHandler.ts @@ -0,0 +1,15 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Log } from '@athenna/logger' +import { ConsoleExceptionHandler } from '@athenna/artisan' + +Log.info('importing CustomConsoleExceptionHandler') + +export class CustomConsoleExceptionHandler extends ConsoleExceptionHandler {} diff --git a/tests/fixtures/handlers/CustomHttpExceptionHandler.ts b/tests/fixtures/handlers/CustomHttpExceptionHandler.ts new file mode 100644 index 0000000..54b5537 --- /dev/null +++ b/tests/fixtures/handlers/CustomHttpExceptionHandler.ts @@ -0,0 +1,15 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Log } from '@athenna/logger' +import { HttpExceptionHandler } from '@athenna/http' + +Log.info('importing CustomHttpExceptionHandler') + +export class CustomHttpExceptionHandler extends HttpExceptionHandler {} diff --git a/tests/fixtures/handlers/HttpExceptionHandler.ts b/tests/fixtures/handlers/HttpExceptionHandler.ts deleted file mode 100644 index eb1245e..0000000 --- a/tests/fixtures/handlers/HttpExceptionHandler.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { CALLED_MAP } from '#tests/helpers/CalledMap' -import { HttpExceptionHandler as BaseHttpExceptionHandler } from '@athenna/http' - -export class HttpExceptionHandler extends BaseHttpExceptionHandler { - public constructor() { - super() - - CALLED_MAP.set(HttpExceptionHandler.name, true) - } -} diff --git a/tests/fixtures/hello.edge b/tests/fixtures/hello.edge new file mode 100644 index 0000000..fec5601 --- /dev/null +++ b/tests/fixtures/hello.edge @@ -0,0 +1 @@ +# Hello diff --git a/tests/fixtures/igniteConfig/ignite.ts b/tests/fixtures/igniteConfig/hello.ts similarity index 92% rename from tests/fixtures/igniteConfig/ignite.ts rename to tests/fixtures/igniteConfig/hello.ts index 0250bc5..d9360a5 100644 --- a/tests/fixtures/igniteConfig/ignite.ts +++ b/tests/fixtures/igniteConfig/hello.ts @@ -8,5 +8,5 @@ */ export default { - fired: true + hello: 'world!' } diff --git a/tests/fixtures/kernels/ConsoleKernel.ts b/tests/fixtures/kernels/ConsoleKernel.ts deleted file mode 100644 index 5348177..0000000 --- a/tests/fixtures/kernels/ConsoleKernel.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { CALLED_MAP } from '#tests/helpers/CalledMap' -import { ConsoleKernel as BaseConsoleKernel } from '@athenna/artisan' - -export class ConsoleKernel extends BaseConsoleKernel { - public constructor() { - super() - - CALLED_MAP.set(ConsoleKernel.name, true) - } -} diff --git a/tests/fixtures/kernels/CustomConsoleKernel.ts b/tests/fixtures/kernels/CustomConsoleKernel.ts new file mode 100644 index 0000000..3d44c3f --- /dev/null +++ b/tests/fixtures/kernels/CustomConsoleKernel.ts @@ -0,0 +1,15 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Log } from '@athenna/logger' +import { ConsoleKernel } from '@athenna/artisan' + +Log.info('importing CustomConsoleKernel') + +export class CustomConsoleKernel extends ConsoleKernel {} diff --git a/tests/fixtures/kernels/CustomHttpKernel.ts b/tests/fixtures/kernels/CustomHttpKernel.ts new file mode 100644 index 0000000..596de78 --- /dev/null +++ b/tests/fixtures/kernels/CustomHttpKernel.ts @@ -0,0 +1,15 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Log } from '@athenna/logger' +import { HttpKernel } from '@athenna/http' + +Log.info('importing CustomHttpKernel') + +export class CustomHttpKernel extends HttpKernel {} diff --git a/tests/fixtures/kernels/HttpKernel.ts b/tests/fixtures/kernels/HttpKernel.ts deleted file mode 100644 index 149fb84..0000000 --- a/tests/fixtures/kernels/HttpKernel.ts +++ /dev/null @@ -1,19 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { CALLED_MAP } from '#tests/helpers/CalledMap' -import { HttpKernel as BaseHttpKernel } from '@athenna/http' - -export class HttpKernel extends BaseHttpKernel { - public constructor() { - super() - - CALLED_MAP.set(HttpKernel.name, true) - } -} diff --git a/tests/fixtures/syntaxErrorConfig/error.ts b/tests/fixtures/modules/default-arrow-fn.ts similarity index 81% rename from tests/fixtures/syntaxErrorConfig/error.ts rename to tests/fixtures/modules/default-arrow-fn.ts index 6ca5a6f..dd25ff4 100644 --- a/tests/fixtures/syntaxErrorConfig/error.ts +++ b/tests/fixtures/modules/default-arrow-fn.ts @@ -7,7 +7,4 @@ * file that was distributed with this source code. */ -export default { - hello: 'world' - hello: -} +export default () => {} diff --git a/tests/fixtures/modules/default-class.ts b/tests/fixtures/modules/default-class.ts new file mode 100644 index 0000000..d779480 --- /dev/null +++ b/tests/fixtures/modules/default-class.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +export default class ModuleOne {} diff --git a/tests/fixtures/bootstrap/repl.ts b/tests/fixtures/modules/default-const.ts similarity index 68% rename from tests/fixtures/bootstrap/repl.ts rename to tests/fixtures/modules/default-const.ts index 6455831..15a908a 100644 --- a/tests/fixtures/bootstrap/repl.ts +++ b/tests/fixtures/modules/default-const.ts @@ -7,7 +7,6 @@ * file that was distributed with this source code. */ -console.log('running repl session') -console.log('env:', process.env.NODE_ENV) +const hello = 'world' -process.exit() +export default hello diff --git a/tests/fixtures/modules/default-fn.ts b/tests/fixtures/modules/default-fn.ts new file mode 100644 index 0000000..6137cc6 --- /dev/null +++ b/tests/fixtures/modules/default-fn.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +export default function moduleOne() {} diff --git a/tests/fixtures/modules/default-object.ts b/tests/fixtures/modules/default-object.ts new file mode 100644 index 0000000..c217150 --- /dev/null +++ b/tests/fixtures/modules/default-object.ts @@ -0,0 +1,14 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +class ModuleOne {} + +class ModuleTwo {} + +export default { ModuleOne, ModuleTwo } diff --git a/tests/fixtures/rcs/.athennarc.json b/tests/fixtures/rcs/.athennarc.json new file mode 100644 index 0000000..3171e13 --- /dev/null +++ b/tests/fixtures/rcs/.athennarc.json @@ -0,0 +1,51 @@ +{ + "templates": { + "exception": "./templates/exception.edge", + "facade": "./templates/facade.edge", + "provider": "./templates/provider.edge", + "service": "./templates/service.edge", + "test": "./templates/test.edge", + "test-cli": "./templates/test-cli.edge", + "test-rest": "./templates/test-rest.edge", + "test-fn": "./templates/test-fn.edge", + "command": "node_modules/@athenna/artisan/templates/command.edge", + "controller": "node_modules/@athenna/http/templates/controller.edge", + "middleware": "node_modules/@athenna/http/templates/middleware.edge", + "interceptor": "node_modules/@athenna/http/templates/interceptor.edge", + "terminator": "node_modules/@athenna/http/templates/terminator.edge" + }, + "commands": { + "make:exception": "#src/commands/MakeExceptionCommand", + "make:facade": "#src/commands/MakeFacadeCommand", + "make:provider": "#src/commands/MakeProviderCommand", + "make:service": "#src/commands/MakeServiceCommand", + "make:test": "#src/commands/MakeTestCommand", + "serve": { + "stayAlive": true, + "entrypoint": "#bin/http", + "path": "#src/commands/ServeCommand" + }, + "test": { + "stayAlive": true, + "entrypoint": "#bin/test", + "path": "#src/commands/TestCommand" + }, + "repl": { + "stayAlive": true, + "entrypoint": "#bin/repl", + "path": "#src/commands/ReplCommand" + }, + "build": { + "path": "#src/commands/BuildCommand", + "tsconfig": "./tests/fixtures/tsconfig.json", + "metaFiles": ["app/hello.edge", "LICENSE.md", ".env"] + } + }, + "services": ["#tests/fixtures/services/WelcomeService", "#tests/fixtures/services/DecoratedWelcomeService"], + "providers": [ + "#src/providers/CoreProvider", + "@athenna/http/providers/HttpRouteProvider", + "@athenna/http/providers/HttpServerProvider" + ], + "preloads": ["#tests/fixtures/routes/http"] +} diff --git a/tests/fixtures/routes/console.ts b/tests/fixtures/routes/console.ts index 627cb2b..d88d238 100644 --- a/tests/fixtures/routes/console.ts +++ b/tests/fixtures/routes/console.ts @@ -9,8 +9,4 @@ import { Artisan } from '@athenna/artisan' -Artisan.route('test:generate', async function () { - await this.generator.path(Path.fixtures('storage/Command.ts')).template('command').make() -}) - .description('hello') - .showHelpAfterError() +Artisan.route('route:console', async function () {}) diff --git a/tests/fixtures/routes/http.ts b/tests/fixtures/routes/rest.ts similarity index 77% rename from tests/fixtures/routes/http.ts rename to tests/fixtures/routes/rest.ts index 27394b5..83e1075 100644 --- a/tests/fixtures/routes/http.ts +++ b/tests/fixtures/routes/rest.ts @@ -9,4 +9,6 @@ import { Route } from '@athenna/http' -Route.get('/hello', ({ response }) => response.send({ ok: true })) +Route.get('/', async ctx => { + ctx.response.send('Hello World') +}) diff --git a/tests/fixtures/services/AnnotatedService.ts b/tests/fixtures/services/AnnotatedService.ts new file mode 100644 index 0000000..c0562f7 --- /dev/null +++ b/tests/fixtures/services/AnnotatedService.ts @@ -0,0 +1,13 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Service } from '@athenna/ioc' + +@Service({ alias: 'fixtures/annotated', camelAlias: 'annotated', type: 'transient' }) +export class AnnotatedService {} diff --git a/tests/fixtures/services/AnnotatedZeroService.ts b/tests/fixtures/services/AnnotatedZeroService.ts new file mode 100644 index 0000000..5e3623b --- /dev/null +++ b/tests/fixtures/services/AnnotatedZeroService.ts @@ -0,0 +1,13 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Service } from '@athenna/ioc' + +@Service() +export class AnnotatedZeroService {} diff --git a/tests/fixtures/services/DecoratedWelcomeService.ts b/tests/fixtures/services/DecoratedWelcomeService.ts deleted file mode 100644 index d9727c0..0000000 --- a/tests/fixtures/services/DecoratedWelcomeService.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Service } from '@athenna/ioc' - -@Service() -export class DecoratedWelcomeService { - public greet(name: string) { - return `Hello ${name}` - } -} diff --git a/tests/fixtures/services/ExportDefaultService.ts b/tests/fixtures/services/ExportDefaultService.ts new file mode 100644 index 0000000..6b3e853 --- /dev/null +++ b/tests/fixtures/services/ExportDefaultService.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +export default class ExportDefaultService {} diff --git a/tests/fixtures/services/ExportService.ts b/tests/fixtures/services/ExportService.ts new file mode 100644 index 0000000..06c5213 --- /dev/null +++ b/tests/fixtures/services/ExportService.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +export default class ExportService {} diff --git a/tests/fixtures/services/WelcomeService.ts b/tests/fixtures/services/WelcomeService.ts deleted file mode 100644 index ef1164e..0000000 --- a/tests/fixtures/services/WelcomeService.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class WelcomeService { - public greet(name: string) { - return `Hello ${name}` - } -} diff --git a/tests/fixtures/tsconfig.build.json b/tests/fixtures/tsconfig.build.json new file mode 100644 index 0000000..2731049 --- /dev/null +++ b/tests/fixtures/tsconfig.build.json @@ -0,0 +1,27 @@ +{ + "ts-node": { + "esm": true, + "transpileOnly": true, + "ignoreDiagnostics": [5104] + }, + "compilerOptions": { + "strict": false, + "rootDir": ".", + "baseUrl": ".", + "outDir": "./build-relative", + "module": "NodeNext", + "target": "ESNext", + "moduleResolution": "NodeNext", + "declaration": true, + "skipLibCheck": true, + "esModuleInterop": true, + "removeComments": false, + "resolveJsonModule": true, + "experimentalDecorators": true, + "useDefineForClassFields": false, + "verbatimModuleSyntax": true, + "forceConsistentCasingInFileNames": true + }, + "include": ["app"], + "exclude": ["build", "node_modules"] +} diff --git a/tests/fixtures/tsconfig.json b/tests/fixtures/tsconfig.json index 1529bfc..ee793e0 100644 --- a/tests/fixtures/tsconfig.json +++ b/tests/fixtures/tsconfig.json @@ -8,7 +8,7 @@ "strict": false, "rootDir": ".", "baseUrl": ".", - "outDir": "build", + "outDir": "./build", "module": "NodeNext", "target": "ESNext", "moduleResolution": "NodeNext", diff --git a/tests/helpers/BaseCommandTest.ts b/tests/helpers/BaseCommandTest.ts index bede826..83eb273 100644 --- a/tests/helpers/BaseCommandTest.ts +++ b/tests/helpers/BaseCommandTest.ts @@ -7,64 +7,39 @@ * file that was distributed with this source code. */ -import { URL } from 'node:url' -import { Config, Rc } from '@athenna/config' -import { ViewProvider } from '@athenna/view' import { File, Folder } from '@athenna/common' -import { LoggerProvider } from '@athenna/logger' -import { AfterEach, BeforeEach, Mock, type Stub } from '@athenna/test' -import { ArtisanProvider, CommanderHandler, ConsoleKernel } from '@athenna/artisan' +import { ArtisanProvider } from '@athenna/artisan' +import { BeforeEach, AfterEach, Mock } from '@athenna/test' +import { TestCommand } from '@athenna/artisan/testing/plugins' export class BaseCommandTest { - public artisan = Path.fixtures('artisan.ts') - public processExitMock: Stub public originalPJson = new File(Path.pwd('package.json')).getContentAsStringSync() @BeforeEach() public async beforeEach() { - Mock.restoreAll() - this.processExitMock = Mock.when(process, 'exit').return(undefined) - - await Config.loadAll(Path.fixtures('config')) - - Config.set('meta', new URL('../../bin/test.ts', import.meta.url).href) - - new ViewProvider().register() - new LoggerProvider().register() new ArtisanProvider().register() - const kernel = new ConsoleKernel() - - await Rc.setFile(Path.pwd('package.json')) - - await kernel.registerExceptionHandler() - await kernel.registerCommands() + TestCommand.setArtisanPath(Path.fixtures('consoles/base-console.ts')) } @AfterEach() public async afterEach() { - Config.clear() + Mock.restoreAll() ioc.reconstruct() - this.processExitMock.restore() - CommanderHandler.getCommander()._events = {} - CommanderHandler.getCommander().commands = [] - CommanderHandler.getCommander()._version = undefined + await File.safeRemove(Path.tests('unit/TestTest.ts')) await Folder.safeRemove(Path.app()) - await Folder.safeRemove(Path.config()) await Folder.safeRemove(Path.providers()) - await Folder.safeRemove(Path.resources()) + await Folder.safeRemove(Path.storage()) + await Folder.safeRemove(Path.pwd('dist')) + await Folder.safeRemove(Path.pwd('build')) + await Folder.safeRemove(Path.pwd('build-relative')) await Folder.safeRemove(Path.tests('e2e')) - - await File.safeRemove(Path.pwd('.env')) - await File.safeRemove(Path.pwd('.env.test')) - await File.safeRemove(Path.pwd('.env.example')) - await File.safeRemove(Path.pwd('docker-compose.yml')) - await File.safeRemove(Path.tests('unit/TestTest.ts')) - await Folder.safeRemove(Path.fixtures('storage')) + await Folder.safeRemove(Path.fixtures('dist')) await Folder.safeRemove(Path.fixtures('build')) - await Folder.safeRemove(Path.pwd('tmp')) + await Folder.safeRemove(Path.fixtures('storage')) + await Folder.safeRemove(Path.fixtures('build-relative')) await new File(Path.pwd('package.json')).setContent(this.originalPJson) } diff --git a/tests/helpers/BaseTest.ts b/tests/helpers/BaseTest.ts deleted file mode 100644 index 200aaf2..0000000 --- a/tests/helpers/BaseTest.ts +++ /dev/null @@ -1,69 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { URL } from 'node:url' -import { LoadHelper } from '#src' -import { LoggerProvider } from '@athenna/logger' -import { File, Folder, Json } from '@athenna/common' -import { CALLED_MAP } from '#tests/helpers/CalledMap' -import { AfterEach, BeforeEach, Mock, type Stub } from '@athenna/test' -import { HttpRouteProvider, HttpServerProvider } from '@athenna/http' - -export class BaseTest { - public processExitMock: Stub - public originalDirs = Json.copy(Path.dirs) - public originalEnv = Json.copy(process.env) - public originalKill = Json.copy(process.kill) - public originalPJson = new File(Path.pwd('package.json')).getContentAsJsonSync() - - @BeforeEach() - public async beforeEach() { - Mock.restoreAll() - this.processExitMock = Mock.when(process, 'exit').return(undefined) - - process.env.IS_TS = 'true' - process.env.CORE_TESTING = 'true' - process.env.ARTISAN_TESTING = 'true' - - await Config.loadAll(Path.fixtures('config')) - - Config.set('meta', new URL('../../bin/test.ts', import.meta.url).href) - - await new LoggerProvider().register() - await new HttpRouteProvider().register() - await new HttpServerProvider().register() - } - - @AfterEach() - public async afterEach() { - await new LoggerProvider().shutdown() - await new HttpRouteProvider().shutdown() - await new HttpServerProvider().shutdown() - - Config.clear() - CALLED_MAP.clear() - ioc.reconstruct() - Mock.restoreAll() - this.processExitMock.restore() - LoadHelper.providers = [] - LoadHelper.alreadyPreloaded = [] - process.kill = this.originalKill - Path.dirs = this.originalDirs - process.env = Json.copy(this.originalEnv) - - process.removeAllListeners('SIGINT') - process.removeAllListeners('SIGTERM') - - await File.safeRemove(Path.pwd('.env')) - await File.safeRemove(Path.pwd('.env.local')) - await Folder.safeRemove(Path.fixtures('storage')) - - await new File(Path.pwd('package.json')).setContent(JSON.stringify(this.originalPJson, null, 2).concat('\n')) - } -} diff --git a/tests/helpers/CalledMap.ts b/tests/helpers/CalledMap.ts index 7c077ef..10de666 100644 --- a/tests/helpers/CalledMap.ts +++ b/tests/helpers/CalledMap.ts @@ -7,9 +7,6 @@ * file that was distributed with this source code. */ -/** - * A map that saves classes that have been called. - */ export const CALLED_MAP = new Map() CALLED_MAP.set('HttpKernel', false) diff --git a/tests/unit/applications/ArtisanTest.ts b/tests/unit/applications/ArtisanTest.ts deleted file mode 100644 index 0f83656..0000000 --- a/tests/unit/applications/ArtisanTest.ts +++ /dev/null @@ -1,97 +0,0 @@ -/** - * @athenna/core - * - * (c) João Lenon - * - * For the full copyright and license information, please view the LICENSE - * file that was distributed with this source code. - */ - -import { Log } from '@athenna/logger' -import { Config } from '@athenna/config' -import { File, Path } from '@athenna/common' -import { ViewProvider } from '@athenna/view' -import { ArtisanProvider } from '@athenna/artisan' -import { BaseTest } from '#tests/helpers/BaseTest' -import { Artisan } from '#src/applications/Artisan' -import { CALLED_MAP } from '#tests/helpers/CalledMap' -import { Test, type Context, Mock } from '@athenna/test' -import { ConsoleKernel } from '#tests/fixtures/kernels/ConsoleKernel' -import { ConsoleExceptionHandler } from '#tests/fixtures/handlers/ConsoleExceptionHandler' - -export default class ArtisanTest extends BaseTest { - @Test() - public async shouldBeAbleToBootAnArtisanApplicationWithoutAnyOption({ assert }: Context) { - new ViewProvider().register() - new ArtisanProvider().register() - - await Artisan.boot(['node', 'artisan']) - - assert.isTrue(this.processExitMock.called) - } - - @Test() - public async shouldBeAbleToLogThatTheConsoleKernelIsBootingIfRcBootLogsIsTrue({ assert }: Context) { - Config.set('rc.bootLogs', true) - - const successFake = Mock.sandbox.fake() - const mock = Log.when('channelOrVanilla').return({ - success: args => successFake(args) - }) - - new ViewProvider().register() - new ArtisanProvider().register() - - await Artisan.boot(['node', 'artisan']) - - assert.called(this.processExitMock) - assert.calledTimesWith(mock, 1, 'application') - assert.isTrue(successFake.calledWith('Kernel ({yellow} ConsoleKernel) successfully booted')) - } - - @Test() - public async shouldBeAbleToBootAnArtisanApplicationAndRegisterCommandsFromRoutes({ assert }: Context) { - new ViewProvider().register() - new ArtisanProvider().register() - - await Artisan.boot(['node', 'artisan', 'test:generate'], { - displayName: null, - routePath: Path.fixtures('routes/console.ts') - }) - - assert.isTrue(this.processExitMock.called) - assert.isTrue(await File.exists(Path.fixtures('storage/Command.ts'))) - } - - @Test() - public async shouldBeAbleToBootAnArtisanApplicationAndRegisterAConsoleKernel({ assert }: Context) { - new ViewProvider().register() - new ArtisanProvider().register() - - await Artisan.boot(['node', 'artisan', 'test:generate'], { - displayName: null, - routePath: Path.fixtures('routes/console.ts'), - kernelPath: Path.fixtures('kernels/ConsoleKernel.ts') - }) - - assert.isTrue(this.processExitMock.called) - assert.isTrue(CALLED_MAP.get(ConsoleKernel.name)) - assert.isTrue(await File.exists(Path.fixtures('storage/Command.ts'))) - } - - @Test() - public async shouldBeAbleToBootAnArtisanApplicationAndRegisterAConsoleExceptionHandler({ assert }: Context) { - new ViewProvider().register() - new ArtisanProvider().register() - - await Artisan.boot(['node', 'artisan', 'test:generate'], { - displayName: null, - routePath: Path.fixtures('routes/console.ts'), - exceptionHandlerPath: Path.fixtures('handlers/ConsoleExceptionHandler.ts') - }) - - assert.isTrue(this.processExitMock.called) - assert.isTrue(CALLED_MAP.get(ConsoleExceptionHandler.name)) - assert.isTrue(await File.exists(Path.fixtures('storage/Command.ts'))) - } -} diff --git a/tests/unit/applications/ConsoleTest.ts b/tests/unit/applications/ConsoleTest.ts new file mode 100644 index 0000000..83718e4 --- /dev/null +++ b/tests/unit/applications/ConsoleTest.ts @@ -0,0 +1,125 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Rc } from '@athenna/config' +import { Console } from '#src/applications/Console' +import { Log, LoggerProvider } from '@athenna/logger' +import { Artisan, ArtisanProvider, CommanderHandler } from '@athenna/artisan' +import { Test, type Context, BeforeEach, AfterEach, Mock } from '@athenna/test' + +export default class ConsoleTest { + @BeforeEach() + public async beforeEach() { + new ArtisanProvider().register() + new LoggerProvider().register() + await Config.loadAll(Path.fixtures('config')) + await Rc.setFile(Path.fixtures('rcs/.athennarc.json')) + } + + @AfterEach() + public async afterEach() { + ioc.reconstruct() + Config.clear() + Mock.restoreAll() + CommanderHandler.reconstruct() + } + + @Test() + public async shouldBeAbleToBootAConsoleApplicationInYourEntrypoint({ assert }: Context) { + const parseMock = Artisan.when('parse').resolve(undefined) + + const argv = ['node', 'artisan'] + await Console.boot(argv) + + assert.calledOnceWith(parseMock, argv, null) + assert.isTrue(CommanderHandler.hasCommand('test')) + assert.isTrue(CommanderHandler.hasCommand('repl')) + assert.isTrue(CommanderHandler.hasCommand('build')) + assert.isTrue(CommanderHandler.hasCommand('make:provider')) + } + + @Test() + public async shouldBeAbleToBootAConsoleApplicationByCommandOfArgv({ assert }: Context) { + const parseMock = Artisan.when('parse').resolve(undefined) + + const argv = ['node', 'artisan', 'test'] + await Console.boot(argv) + + assert.calledOnceWith(parseMock, argv, null) + assert.isTrue(CommanderHandler.hasCommand('test')) + assert.isFalse(CommanderHandler.hasCommand('repl')) + assert.isFalse(CommanderHandler.hasCommand('build')) + assert.isFalse(CommanderHandler.hasCommand('make:provider')) + } + + @Test() + public async shouldBeAbleToBootAConsoleApplicationWithADisplayName({ assert }: Context) { + const parseMock = Artisan.when('parse').resolve(undefined) + + const argv = ['node', 'artisan', 'test'] + await Console.boot(argv, { displayName: 'Artisan' }) + + assert.calledOnceWith(parseMock, argv, 'Artisan') + assert.isTrue(CommanderHandler.hasCommand('test')) + } + + @Test() + public async shouldBeAbleToBootAConsoleApplicationWithADifferentRoutePath({ assert }: Context) { + const parseMock = Artisan.when('parse').resolve(undefined) + + const argv = ['node', 'artisan'] + await Console.boot(argv, { routePath: Path.fixtures('routes/console.ts') }) + + assert.calledOnceWith(parseMock, argv, null) + assert.isTrue(CommanderHandler.hasCommand('route:console')) + } + + @Test() + public async shouldBeAbleToBootAConsoleApplicationWithADifferentKernelPath({ assert }: Context) { + const infoMock = Log.when('info').return(undefined) + const parseMock = Artisan.when('parse').resolve(undefined) + + const argv = ['node', 'artisan'] + await Console.boot(argv, { kernelPath: Path.fixtures('kernels/CustomConsoleKernel.ts') }) + + assert.calledOnceWith(parseMock, argv, null) + assert.calledOnceWith(infoMock, 'importing CustomConsoleKernel') + assert.isTrue(CommanderHandler.hasCommand('test')) + } + + @Test() + public async shouldBeAbleToBootAConsoleApplicationWithADifferentExceptionHandlerPath({ assert }: Context) { + const infoMock = Log.when('info').return(undefined) + const parseMock = Artisan.when('parse').resolve(undefined) + + const argv = ['node', 'artisan'] + await Console.boot(argv, { exceptionHandlerPath: Path.fixtures('handlers/CustomConsoleExceptionHandler.ts') }) + + assert.calledOnceWith(parseMock, argv, null) + assert.calledOnceWith(infoMock, 'importing CustomConsoleExceptionHandler') + assert.isTrue(CommanderHandler.hasCommand('test')) + } + + @Test() + public async shouldBeAbleToBootAConsoleApplicationAndLogTheBootstrapInfos({ assert }: Context) { + Config.set('rc.bootLogs', true) + const successMock = Mock.fake() + Log.when('channelOrVanilla').return({ + success: successMock + }) + const parseMock = Artisan.when('parse').resolve(undefined) + + const argv = ['node', 'artisan'] + await Console.boot(argv) + + assert.calledOnceWith(parseMock, argv, null) + assert.calledWith(successMock, 'Kernel ({yellow} ConsoleKernel) successfully booted') + assert.isTrue(CommanderHandler.hasCommand('test')) + } +} diff --git a/tests/unit/applications/HttpTest.ts b/tests/unit/applications/HttpTest.ts index 5007c2a..82c4351 100644 --- a/tests/unit/applications/HttpTest.ts +++ b/tests/unit/applications/HttpTest.ts @@ -7,99 +7,148 @@ * file that was distributed with this source code. */ -import { Log } from '@athenna/logger' -import { Path } from '@athenna/common' -import { Server } from '@athenna/http' -import { Config } from '@athenna/config' +import { Rc } from '@athenna/config' import { Http } from '#src/applications/Http' -import { Test, type Context, Mock } from '@athenna/test' -import { BaseTest } from '#tests/helpers/BaseTest' -import { LoadHelper } from '#src/helpers/LoadHelper' -import { CALLED_MAP } from '#tests/helpers/CalledMap' -import { HttpKernel } from '#tests/fixtures/kernels/HttpKernel' -import { HttpExceptionHandler } from '#tests/fixtures/handlers/HttpExceptionHandler' - -export default class HttpTest extends BaseTest { +import { CommanderHandler } from '@athenna/artisan' +import { Log, LoggerProvider } from '@athenna/logger' +import { Test, type Context, BeforeEach, AfterEach, Mock } from '@athenna/test' +import { HttpServerProvider, HttpRouteProvider, Server, HttpKernel } from '@athenna/http' + +export default class HttpTest { + @BeforeEach() + public async beforeEach() { + new LoggerProvider().register() + new HttpRouteProvider().register() + new HttpServerProvider().register() + await Config.loadAll(Path.fixtures('config')) + await Rc.setFile(Path.fixtures('rcs/.athennarc.json')) + } + + @AfterEach() + public async afterEach() { + ioc.reconstruct() + Config.clear() + Mock.restoreAll() + CommanderHandler.reconstruct() + } + @Test() - public async shouldBeAbleToBootAHttpApplicationWithoutAnyOption({ assert }: Context) { + public async shouldBeAbleToBootAHttpApplication({ assert }: Context) { + const listenMock = Server.when('listen').resolve(undefined) + await Http.boot() - assert.isTrue(Server.isListening) - assert.equal(Server.getPort(), 3000) - assert.equal(Server.getHost(), '127.0.0.1') + assert.calledOnceWith(listenMock, { host: '127.0.0.1', port: 3000 }) } @Test() - public async shouldNotLogThatTheHttpServerHasStartedIfRcBootLogsIsFalse({ assert }: Context) { - Config.set('rc.bootLogs', false) + public async shouldBeAbleToBootAHttpApplicationWithDifferentHost({ assert }: Context) { + const listenMock = Server.when('listen').resolve(undefined) - const mock = Log.when('channelOrVanilla').return(undefined) + await Http.boot({ host: '0.0.0.0' }) - await Http.boot() + assert.calledOnceWith(listenMock, { host: '0.0.0.0', port: 3000 }) + } - assert.isTrue(mock.notCalled) - assert.isTrue(Server.isListening) - assert.equal(Server.getPort(), 3000) - assert.equal(Server.getHost(), '127.0.0.1') + @Test() + public async shouldBeAbleToBootAHttpApplicationWithDifferentPort({ assert }: Context) { + const listenMock = Server.when('listen').resolve(undefined) + + await Http.boot({ port: 3001 }) + + assert.calledOnceWith(listenMock, { host: '127.0.0.1', port: 3001 }) } @Test() - public async shouldBeAbleToLogThatTheHttpServerHasStartedIfRcBootLogsIsTrue({ assert }: Context) { - Config.set('rc.bootLogs', true) + public async shouldBeAbleToBootAHttpApplicationWithDifferentHttpKernel({ assert }: Context) { + const infoMock = Log.when('info').return(undefined) + const listenMock = Server.when('listen').resolve(undefined) - const successFake = Mock.sandbox.fake() - const mock = Log.when('channelOrVanilla').return({ - success: args => successFake(args) - }) + await Http.boot({ kernelPath: Path.fixtures('kernels/CustomHttpKernel.ts') }) - await Http.boot() + assert.calledOnceWith(infoMock, 'importing CustomHttpKernel') + assert.calledOnceWith(listenMock, { host: '127.0.0.1', port: 3000 }) + } + + @Test() + public async shouldBeAbleToBootAHttpApplicationWithDifferentExceptionHandler({ assert }: Context) { + const infoMock = Log.when('info').return(undefined) + const listenMock = Server.when('listen').resolve(undefined) + + await Http.boot({ exceptionHandlerPath: Path.fixtures('handlers/CustomHttpExceptionHandler.ts') }) - assert.isTrue(Server.isListening) - assert.equal(Server.getPort(), 3000) - assert.equal(Server.getHost(), '127.0.0.1') - assert.calledTimesWith(mock, 2, 'application') - assert.calledWith(successFake, 'Kernel ({yellow} HttpKernel) successfully booted') - assert.calledWith(successFake, 'Http server started on ({yellow} 127.0.0.1:3000)') + assert.calledOnceWith(infoMock, 'importing CustomHttpExceptionHandler') + assert.calledOnceWith(listenMock, { host: '127.0.0.1', port: 3000 }) } @Test() - public async shouldBeAbleToRegisterRoutesFromRoutesFileAndBootAHttpApplication({ assert }: Context) { - await LoadHelper.preloadFiles() - await Http.boot() + public async shouldBeAbleToBootAHttpApplicationWithTracingPluginRegistered({ assert }: Context) { + const registerRTraceMock = Mock.when(HttpKernel.prototype, 'registerRTracer').resolve(undefined) + const listenMock = Server.when('listen').resolve(undefined) - const response = await Server.request().get('/hello') + await Http.boot({ trace: true }) - assert.equal(response.statusCode, 200) - assert.deepEqual(response.json(), { ok: true }) + assert.calledOnceWith(listenMock, { host: '127.0.0.1', port: 3000 }) + assert.calledOnceWith(registerRTraceMock, true) } @Test() - public async shouldBeAbleToBootAHttpApplicationAndRegisterAHttpKernel({ assert }: Context) { - await Http.boot({ - kernelPath: Path.fixtures('kernels/HttpKernel.ts') + public async shouldBeAbleToBootAHttpApplicationAndRegisterTheRouteFile({ assert }: Context) { + const listenMock = Server.when('listen').resolve(undefined) + + assert.isFalse(Server.getRoutes().includes('└── / (GET, HEAD)')) + + await Http.boot({ routePath: Path.fixtures('routes/rest.ts') }) + + assert.calledOnceWith(listenMock, { host: '127.0.0.1', port: 3000 }) + assert.isTrue(Server.getRoutes().includes('└── / (GET, HEAD)')) + } + + @Test() + public async shouldBeAbleToBootAHttpApplicationAndLogTheBootstrapInfos({ assert }: Context) { + Config.set('rc.bootLogs', true) + const successMock = Mock.fake() + Log.when('channelOrVanilla').return({ + success: successMock }) + const listenMock = Server.when('listen').resolve(undefined) + + await Http.boot() - assert.isTrue(CALLED_MAP.get(HttpKernel.name)) + assert.calledOnceWith(listenMock, { host: '127.0.0.1', port: 3000 }) + assert.calledWith(successMock, 'Http server started on ({yellow} 127.0.0.1:3000)') + assert.calledWith(successMock, 'Kernel ({yellow} HttpKernel) successfully booted') } @Test() - public async shouldBeAbleToBootAHttpApplicationAndRegisterADifferentExceptionHandler({ assert }: Context) { - await Http.boot({ - exceptionHandlerPath: Path.fixtures('handlers/HttpExceptionHandler.ts') + public async shouldBeAbleToBootAHttpApplicationAndLogTheServerHostWithoutPort({ assert }: Context) { + Config.set('rc.bootLogs', true) + const successMock = Mock.fake() + Log.when('channelOrVanilla').return({ + success: successMock }) + const listenMock = Server.when('listen').resolve(undefined) + + await Http.boot({ host: 'athenna.io' }) - assert.isTrue(CALLED_MAP.get(HttpExceptionHandler.name)) + assert.calledOnceWith(listenMock, { host: 'athenna.io', port: 3000 }) + assert.calledWith(successMock, 'Http server started on ({yellow} athenna.io)') + assert.calledWith(successMock, 'Kernel ({yellow} HttpKernel) successfully booted') } @Test() - public async shouldBeAbleToBootAHttpApplicationAndRegisterADifferentRouteFile({ assert }: Context) { - await Http.boot({ - routePath: Path.fixtures('routes/http.ts') + public async shouldBeAbleToBootAHttpApplicationAndLogTheServerHostAsLocalHost({ assert }: Context) { + Config.set('rc.bootLogs', true) + const successMock = Mock.fake() + Log.when('channelOrVanilla').return({ + success: successMock }) + const listenMock = Server.when('listen').resolve(undefined) - const response = await Server.request().get('/hello') + await Http.boot({ host: '::1' }) - assert.equal(response.statusCode, 200) - assert.deepEqual(response.json(), { ok: true }) + assert.calledOnceWith(listenMock, { host: '::1', port: 3000 }) + assert.calledWith(successMock, 'Http server started on ({yellow} localhost:3000)') + assert.calledWith(successMock, 'Kernel ({yellow} HttpKernel) successfully booted') } } diff --git a/tests/unit/applications/ReplTest.ts b/tests/unit/applications/ReplTest.ts new file mode 100644 index 0000000..87df090 --- /dev/null +++ b/tests/unit/applications/ReplTest.ts @@ -0,0 +1,98 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import figlet from 'figlet' +import chalkRainbow from 'chalk-rainbow' + +import { Rc } from '@athenna/config' +import { Color } from '@athenna/common' +import { Repl } from '#src/facades/Repl' +import { Ls } from '#src/repl/commands/Ls' +import { Clean } from '#src/repl/commands/Clean' +import { CommanderHandler } from '@athenna/artisan' +import { Repl as ReplApp } from '#src/applications/Repl' +import { ReplProvider } from '#src/providers/ReplProvider' +import { Test, type Context, BeforeEach, AfterEach, Mock } from '@athenna/test' + +export default class ReplTest { + @BeforeEach() + public async beforeEach() { + new ReplProvider().register() + await Config.loadAll(Path.fixtures('config')) + await Rc.setFile(Path.fixtures('rcs/.athennarc.json')) + } + + @AfterEach() + public async afterEach() { + Config.clear() + Mock.restoreAll() + CommanderHandler.reconstruct() + } + + @Test() + public async shouldBeAbleToBootAReplApplication({ assert }: Context) { + Mock.when(process.stdout, 'write').return(undefined) + Repl.when('start').resolve(undefined) + Repl.when('write').return(Repl) + Repl.when('setPrompt').return(Repl) + Repl.when('displayPrompt').return(Repl) + Repl.when('commandImpl').return(Repl) + + await ReplApp.boot() + + assert.calledOnceWith(Repl.setPrompt, Color.purple.bold('Athenna ') + Color.green.bold('❯ ')) + } + + @Test() + public async shouldBeAbleToBootAReplApplicationAndSeeTheReplStartupLogs({ assert }: Context) { + Mock.when(process.stdout, 'write').return(undefined) + Repl.when('start').resolve(undefined) + Repl.when('write').return(Repl) + Repl.when('setPrompt').return(Repl) + Repl.when('displayPrompt').return(Repl) + Repl.when('commandImpl').return(Repl) + + await ReplApp.boot() + + assert.calledWith(process.stdout.write, chalkRainbow(figlet.textSync('REPL\n')) + '\n') + assert.calledWith(process.stdout.write, Color.gray('To import your modules use dynamic imports:\n') + '\n') + assert.calledWith(process.stdout.write, Color.gray("const { User } = await import('#app/models/User')\n") + '\n') + assert.calledWith(process.stdout.write, Color.yellow.bold('To see all commands available type:') + ' .help\n\n\n') + } + + @Test() + public async shouldBeAbleToBootAReplApplicationAndDeleteTheDomainErrorHandler({ assert }: Context) { + Mock.when(process.stdout, 'write').return(undefined) + Repl.when('start').resolve(undefined) + Repl.when('write').return(Repl) + Repl.when('setPrompt').return(Repl) + Repl.when('displayPrompt').return(Repl) + Repl.when('commandImpl').return(Repl) + + await ReplApp.boot() + + assert.calledWith(Repl.write, 'delete process?.domain?._events?.error\n') + assert.calledWith(Repl.write, '', { ctrl: true, name: 'l' }) + } + + @Test() + public async shouldBeAbleToBootAReplApplicationAndRegisterTheLsCommand({ assert }: Context) { + Mock.when(process.stdout, 'write').return(undefined) + Repl.when('start').resolve(undefined) + Repl.when('write').return(Repl) + Repl.when('setPrompt').return(Repl) + Repl.when('displayPrompt').return(Repl) + Repl.when('commandImpl').return(Repl) + + await ReplApp.boot() + + assert.calledWith(Repl.commandImpl, Ls) + assert.calledWith(Repl.commandImpl, Clean) + } +} diff --git a/tests/unit/commands/BuildCommandTest.ts b/tests/unit/commands/BuildCommandTest.ts index e4e209a..684180f 100644 --- a/tests/unit/commands/BuildCommandTest.ts +++ b/tests/unit/commands/BuildCommandTest.ts @@ -1,5 +1,5 @@ /** - * @athenna/artisan + * @athenna/core * * (c) João Lenon * @@ -7,22 +7,167 @@ * file that was distributed with this source code. */ -import { Artisan } from '@athenna/artisan' import { File, Folder } from '@athenna/common' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class BuildCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToCompileTheApplication({ assert }: Context) { - const { stdout, stderr } = await Artisan.callInChild('build', this.artisan) + public async shouldBeAbleToBuildTheApplicationCode({ assert, command }: Context) { + const output = await command.run('build') + + output.assertSucceeded() + output.assertLogged('Application successfully compiled') + + assert.isTrue(Folder.existsSync(Path.fixtures('build'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.d.ts'))) + } + + @Test() + public async shouldBeAbleToRunBuildCommandWithARelativePathToATsConfig({ assert, command }: Context) { + const output = await command.run('build', { + path: Path.fixtures('consoles/relative-path-tsconfig.ts') + }) + + output.assertSucceeded() + output.assertLogged('Application successfully compiled') + + assert.isTrue(Folder.existsSync(Path.fixtures('build-relative'))) + assert.isTrue(File.existsSync(Path.fixtures('build-relative/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build-relative/app/hello.d.ts'))) + } + + @Test() + public async shouldDeleteTheOldOutDirBeforeCompilingTheApplicationAgain({ assert, command }: Context) { + await command.run('build') + + assert.isTrue(Folder.existsSync(Path.fixtures('build'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.d.ts'))) + + const output = await command.run('build') + + output.assertSucceeded() + output.assertLogged('Application successfully compiled') + + assert.isTrue(Folder.existsSync(Path.fixtures('build'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.d.ts'))) + } + + @Test() + public async shouldBeAbleToIncludeFilesInsideTheBuildFolderUsingIncludeSetting({ assert, command }: Context) { + const output = await command.run('build', { + path: Path.fixtures('consoles/include-files.ts') + }) + + output.assertSucceeded() + output.assertLogged('Copying included paths to build folder: README.md, LICENSE.md') + output.assertLogged('Application successfully compiled') - console.log(stderr) - assert.isTrue(stdout.includes('Application successfully compiled')) assert.isTrue(Folder.existsSync(Path.fixtures('build'))) - assert.isFalse(File.existsSync(Path.fixtures('build/.env'))) assert.isTrue(File.existsSync(Path.fixtures('build/LICENSE.md'))) - assert.isTrue(File.existsSync(Path.fixtures('build/app/index.js'))) - assert.isTrue(File.existsSync(Path.fixtures('build/app/index.d.ts'))) + assert.isTrue(File.existsSync(Path.fixtures('build/README.md'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.d.ts'))) + } + + @Test() + public async shouldBeAbleToIncludeFoldersInsideTheBuildFolderUsingIncludeSetting({ assert, command }: Context) { + const output = await command.run('build', { + path: Path.fixtures('consoles/include-folders.ts') + }) + + output.assertSucceeded() + output.assertLogged('Copying included paths to build folder: src/*, templates/*') + output.assertLogged('Application successfully compiled') + + assert.isTrue(Folder.existsSync(Path.fixtures('build'))) + assert.isTrue(File.existsSync(Path.fixtures('build/src/index.ts'))) + assert.isTrue(File.existsSync(Path.fixtures('build/templates/exception.edge'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.d.ts'))) + } + + @Test() + public async shouldBeAbleToIncludeFilesUsingGlobPatternsInsideTheBuildFolderUsingIncludeSetting({ + assert, + command + }: Context) { + const output = await command.run('build', { + path: Path.fixtures('consoles/include-files-glob.ts') + }) + + output.assertSucceeded() + output.assertLogged('Copying included paths to build folder: src/**/*Command.ts') + output.assertLogged('Application successfully compiled') + + assert.isTrue(Folder.existsSync(Path.fixtures('build'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.d.ts'))) + assert.isTrue(File.existsSync(Path.fixtures('build/src/commands/BuildCommand.ts'))) + assert.isTrue(File.existsSync(Path.fixtures('build/src/commands/MakeServiceCommand.ts'))) + } + + @Test() + public async shouldBeAbleToIncludeFoldersUsingGlobPatternsInsideTheBuildFolderUsingIncludeSetting({ + assert, + command + }: Context) { + const output = await command.run('build', { + path: Path.fixtures('consoles/include-folders-glob.ts') + }) + + output.assertSucceeded() + output.assertLogged('Copying included paths to build folder: templates/**/*.edge') + output.assertLogged('Application successfully compiled') + + assert.isTrue(Folder.existsSync(Path.fixtures('build'))) + assert.isTrue(File.existsSync(Path.fixtures('build/templates/exception.edge'))) + assert.isTrue(File.existsSync(Path.fixtures('build/templates/provider.edge'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.d.ts'))) + } + + @Test() + public async shouldBeAbleToResolveTheOutDirFromTheOutDirSetting({ assert, command }: Context) { + const output = await command.run('build', { + path: Path.fixtures('consoles/resolve-outdir-setting.ts') + }) + + output.assertSucceeded() + output.assertLogged('Application successfully compiled') + + assert.isTrue(Folder.existsSync(Path.fixtures('build-relative'))) + assert.isTrue(File.existsSync(Path.fixtures('build-relative/app/hello.js'))) + assert.isTrue(File.existsSync(Path.fixtures('build-relative/app/hello.d.ts'))) + } + + @Test() + public async shouldThrowUndefinedOutDirExceptionIfOutDirSettingIsNotSet({ command }: Context) { + const output = await command.run('build', { + path: Path.fixtures('consoles/outdir-not-set.ts') + }) + + output.assertFailed() + output.assertLogged( + 'The commands.build.outDir setting is not defined in your .athennarc.json file. Please define it to continue.' + ) + } + + @Test() + public async shouldNotCopyDotEnvFileEvenIfItsPresentInIncludeArray({ assert, command }: Context) { + const output = await command.run('build', { + path: Path.fixtures('consoles/dont-copy-dot-env.ts') + }) + + output.assertSucceeded() + output.assertLogged('Application successfully compiled') + + assert.isTrue(Folder.existsSync(Path.fixtures('build'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.js'))) + assert.isFalse(File.existsSync(Path.fixtures('build/.env'))) + assert.isTrue(File.existsSync(Path.fixtures('build/app/hello.d.ts'))) } } diff --git a/tests/unit/commands/MakeExceptionCommandTest.ts b/tests/unit/commands/MakeExceptionCommandTest.ts index 22907be..8008778 100644 --- a/tests/unit/commands/MakeExceptionCommandTest.ts +++ b/tests/unit/commands/MakeExceptionCommandTest.ts @@ -7,39 +7,44 @@ * file that was distributed with this source code. */ -import { File } from '@athenna/common' -import { Artisan } from '@athenna/artisan' +import { File, Path } from '@athenna/common' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class MakeExceptionCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToCreateAnExceptionFile({ assert }: Context) { - await Artisan.call('make:exception TestException', false) + public async shouldBeAbleToCreateAExceptionFile({ assert, command }: Context) { + const output = await command.run('make:exception TestException') - const path = Path.exceptions('TestException.ts') + output.assertSucceeded() + output.assertLogged('[ MAKING EXCEPTION ]') + output.assertLogged('[ success ] Exception "TestException" successfully created.') - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.exceptions('TestException.ts'))) } @Test() - public async shouldBeAbleToCreateAnExceptionFileInDifferentDestPath({ assert }: Context) { - Config.set('rc.commands.make:exception.destination', Path.fixtures('storage/exceptions')) + public async shouldBeAbleToCreateAExceptionFileWithADifferentDestPath({ assert, command }: Context) { + const output = await command.run('make:exception TestException', { + path: Path.fixtures('consoles/console-mock-dest-import.ts') + }) - await Artisan.call('make:exception TestException', false) + output.assertSucceeded() + output.assertLogged('[ MAKING EXCEPTION ]') + output.assertLogged('[ success ] Exception "TestException" successfully created.') - const path = Path.fixtures('storage/exceptions/TestException.ts') - - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.fixtures('storage/exceptions/TestException.ts'))) } @Test() - public async shouldThrowAnExceptionWhenTheFileAlreadyExists({ assert }: Context) { - await Artisan.call('make:exception TestException', false) - await Artisan.call('make:exception TestException', false) - - assert.isTrue(this.processExitMock.calledWith(1)) + public async shouldThrowAnExceptionWhenTheFileAlreadyExists({ command }: Context) { + await command.run('make:exception TestException') + const output = await command.run('make:exception TestException') + + output.assertFailed() + output.assertLogged('[ MAKING EXCEPTION ]') + output.assertLogged('The file') + output.assertLogged('TestException.ts') + output.assertLogged('already exists') } } diff --git a/tests/unit/commands/MakeFacadeCommandTest.ts b/tests/unit/commands/MakeFacadeCommandTest.ts index 9910b24..1ace45a 100644 --- a/tests/unit/commands/MakeFacadeCommandTest.ts +++ b/tests/unit/commands/MakeFacadeCommandTest.ts @@ -7,39 +7,44 @@ * file that was distributed with this source code. */ -import { File } from '@athenna/common' -import { Artisan } from '@athenna/artisan' +import { File, Path } from '@athenna/common' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class MakeFacadeCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToCreateAFacadeFile({ assert }: Context) { - await Artisan.call('make:facade TestFacade', false) + public async shouldBeAbleToCreateAFacadeFile({ assert, command }: Context) { + const output = await command.run('make:facade TestFacade') - const path = Path.facades('TestFacade.ts') + output.assertSucceeded() + output.assertLogged('[ MAKING FACADE ]') + output.assertLogged('[ success ] Facade "TestFacade" successfully created.') - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.facades('TestFacade.ts'))) } @Test() - public async shouldBeAbleToCreateAFacadeFileInDifferentDestPath({ assert }: Context) { - Config.set('rc.commands.make:facade.destination', Path.fixtures('storage/facades')) + public async shouldBeAbleToCreateAFacadeFileWithADifferentDestPath({ assert, command }: Context) { + const output = await command.run('make:facade TestFacade', { + path: Path.fixtures('consoles/console-mock-dest-import.ts') + }) - await Artisan.call('make:facade TestFacade', false) + output.assertSucceeded() + output.assertLogged('[ MAKING FACADE ]') + output.assertLogged('[ success ] Facade "TestFacade" successfully created.') - const path = Path.fixtures('storage/facades/TestFacade.ts') - - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.fixtures('storage/facades/TestFacade.ts'))) } @Test() - public async shouldThrowAnExceptionWhenTheFileAlreadyExists({ assert }: Context) { - await Artisan.call('make:facade TestFacade', false) - await Artisan.call('make:facade TestFacade', false) - - assert.isTrue(this.processExitMock.calledWith(1)) + public async shouldThrowAnFacadeWhenTheFileAlreadyExists({ command }: Context) { + await command.run('make:facade TestFacade') + const output = await command.run('make:facade TestFacade') + + output.assertFailed() + output.assertLogged('[ MAKING FACADE ]') + output.assertLogged('The file') + output.assertLogged('TestFacade.ts') + output.assertLogged('already exists') } } diff --git a/tests/unit/commands/MakeProviderCommandTest.ts b/tests/unit/commands/MakeProviderCommandTest.ts index 10114e5..107fc8e 100644 --- a/tests/unit/commands/MakeProviderCommandTest.ts +++ b/tests/unit/commands/MakeProviderCommandTest.ts @@ -7,50 +7,50 @@ * file that was distributed with this source code. */ -import { File } from '@athenna/common' -import { Config } from '@athenna/config' -import { Artisan } from '@athenna/artisan' +import { File, Path } from '@athenna/common' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class MakeProviderCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToCreateAProviderFile({ assert }: Context) { - await Artisan.call('make:provider TestProvider', false) + public async shouldBeAbleToCreateAProviderFile({ assert, command }: Context) { + const output = await command.run('make:provider TestProvider') - const path = Path.providers('TestProvider.ts') - - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + output.assertSucceeded() + output.assertLogged('[ MAKING PROVIDER ]') + output.assertLogged('[ success ] Provider "TestProvider" successfully created.') const { athenna } = await new File(Path.pwd('package.json')).getContentAsJson() - assert.containsSubset(Config.get('rc.providers'), ['#providers/TestProvider']) + assert.isTrue(await File.exists(Path.providers('TestProvider.ts'))) assert.containsSubset(athenna.providers, ['#providers/TestProvider']) } @Test() - public async shouldBeAbleToCreateAProviderFileInDifferentDestPath({ assert }: Context) { - Config.set('rc.commands.make:provider.destination', Path.fixtures('storage/providers')) - - await Artisan.call('make:provider TestProvider', false) + public async shouldBeAbleToCreateAProviderFileWithADifferentDestPath({ assert, command }: Context) { + const output = await command.run('make:provider TestProvider', { + path: Path.fixtures('consoles/console-mock-dest-import.ts') + }) - const path = Path.fixtures('storage/providers/TestProvider.ts') - - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + output.assertSucceeded() + output.assertLogged('[ MAKING PROVIDER ]') + output.assertLogged('[ success ] Provider "TestProvider" successfully created.') const { athenna } = await new File(Path.pwd('package.json')).getContentAsJson() - assert.containsSubset(Config.get('rc.providers'), ['#tests/fixtures/storage/providers/TestProvider']) + assert.isTrue(await File.exists(Path.fixtures('storage/providers/TestProvider.ts'))) assert.containsSubset(athenna.providers, ['#tests/fixtures/storage/providers/TestProvider']) } @Test() - public async shouldThrowAnExceptionWhenTheFileAlreadyExists({ assert }: Context) { - await Artisan.call('make:provider TestProvider', false) - await Artisan.call('make:provider TestProvider', false) - - assert.isTrue(this.processExitMock.calledWith(1)) + public async shouldThrowAnProviderWhenTheFileAlreadyExists({ command }: Context) { + await command.run('make:provider TestProvider') + const output = await command.run('make:provider TestProvider') + + output.assertFailed() + output.assertLogged('[ MAKING PROVIDER ]') + output.assertLogged('The file') + output.assertLogged('TestProvider.ts') + output.assertLogged('already exists') } } diff --git a/tests/unit/commands/MakeServiceCommandTest.ts b/tests/unit/commands/MakeServiceCommandTest.ts index c07dad3..6c8fc70 100644 --- a/tests/unit/commands/MakeServiceCommandTest.ts +++ b/tests/unit/commands/MakeServiceCommandTest.ts @@ -7,50 +7,50 @@ * file that was distributed with this source code. */ -import { File } from '@athenna/common' -import { Config } from '@athenna/config' -import { Artisan } from '@athenna/artisan' +import { File, Path } from '@athenna/common' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class MakeServiceCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToCreateAServiceFile({ assert }: Context) { - await Artisan.call('make:service TestService', false) + public async shouldBeAbleToCreateAServiceFile({ assert, command }: Context) { + const output = await command.run('make:service TestService') - const path = Path.services('TestService.ts') - - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + output.assertSucceeded() + output.assertLogged('[ MAKING SERVICE ]') + output.assertLogged('[ success ] Service "TestService" successfully created.') const { athenna } = await new File(Path.pwd('package.json')).getContentAsJson() - assert.containsSubset(Config.get('rc.services'), ['#app/services/TestService']) + assert.isTrue(await File.exists(Path.services('TestService.ts'))) assert.containsSubset(athenna.services, ['#app/services/TestService']) } @Test() - public async shouldBeAbleToCreateAServiceFileInDifferentDestPath({ assert }: Context) { - Config.set('rc.commands.make:service.destination', Path.fixtures('storage/services')) - - await Artisan.call('make:service TestService', false) + public async shouldBeAbleToCreateAServiceFileWithADifferentDestPath({ assert, command }: Context) { + const output = await command.run('make:service TestService', { + path: Path.fixtures('consoles/console-mock-dest-import.ts') + }) - const path = Path.fixtures('storage/services/TestService.ts') - - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + output.assertSucceeded() + output.assertLogged('[ MAKING SERVICE ]') + output.assertLogged('[ success ] Service "TestService" successfully created.') const { athenna } = await new File(Path.pwd('package.json')).getContentAsJson() - assert.containsSubset(Config.get('rc.services'), ['#tests/fixtures/storage/services/TestService']) + assert.isTrue(await File.exists(Path.fixtures('storage/services/TestService.ts'))) assert.containsSubset(athenna.services, ['#tests/fixtures/storage/services/TestService']) } @Test() - public async shouldThrowAnExceptionWhenTheFileAlreadyExists({ assert }: Context) { - await Artisan.call('make:service TestService', false) - await Artisan.call('make:service TestService', false) - - assert.isTrue(this.processExitMock.calledWith(1)) + public async shouldThrowAnServiceWhenTheFileAlreadyExists({ command }: Context) { + await command.run('make:service TestService') + const output = await command.run('make:service TestService') + + output.assertFailed() + output.assertLogged('[ MAKING SERVICE ]') + output.assertLogged('The file') + output.assertLogged('TestService.ts') + output.assertLogged('already exists') } } diff --git a/tests/unit/commands/MakeTestCommandTest.ts b/tests/unit/commands/MakeTestCommandTest.ts index b83d5d0..c6fde7f 100644 --- a/tests/unit/commands/MakeTestCommandTest.ts +++ b/tests/unit/commands/MakeTestCommandTest.ts @@ -7,77 +7,88 @@ * file that was distributed with this source code. */ -import { File } from '@athenna/common' -import { Artisan } from '@athenna/artisan' +import { File, Path } from '@athenna/common' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class MakeTestCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToCreateAnE2ETestFileAsClass({ assert }: Context) { - await Artisan.call('make:test TestTest', false) + public async shouldBeAbleToCreateATestFile({ assert, command }: Context) { + const output = await command.run('make:test TestTest') - const path = Path.tests('e2e/TestTest.ts') - const file = await new File(path).load({ withContent: true }) + output.assertSucceeded() + output.assertLogged('[ MAKING TEST ]') + output.assertLogged('[ success ] Test "TestTest" successfully created.') - assert.isTrue(file.fileExists) - assert.isTrue(file.content.toString().includes('export default class TestTest')) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.tests('e2e/TestTest.ts'))) } @Test() - public async shouldBeAbleToCreateATestFileInDifferentDestPath({ assert }: Context) { - Config.set('rc.commands.make:test.destination', Path.fixtures('storage/tests')) + public async shouldBeAbleToCreateATestFileInUnitFolder({ assert, command }: Context) { + const output = await command.run('make:test TestTest --unit') - await Artisan.call('make:test TestTest', false) + output.assertSucceeded() + output.assertLogged('[ MAKING TEST ]') + output.assertLogged('[ success ] Test "TestTest" successfully created.') - const path = Path.fixtures('storage/tests/TestTest.ts') - - assert.isTrue(await File.exists(path)) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.tests('unit/TestTest.ts'))) } @Test() - public async shouldBeAbleToCreateAnUnitTestFileAsClass({ assert }: Context) { - await Artisan.call('make:test TestTest --unit', false) + public async shouldBeAbleToCreateATestFileUsingRestTemplate({ assert, command }: Context) { + const output = await command.run('make:test TestTest --rest') - const path = Path.tests('unit/TestTest.ts') - const file = await new File(path).load({ withContent: true }) + output.assertSucceeded() + output.assertLogged('[ MAKING TEST ]') + output.assertLogged('[ success ] Test "TestTest" successfully created.') - assert.isTrue(file.fileExists) - assert.isTrue(file.content.toString().includes('export default class TestTest')) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.tests('e2e/TestTest.ts'))) } @Test() - public async shouldBeAbleToCreateAnE2ETestFileAsFunction({ assert }: Context) { - await Artisan.call('make:test TestTest --function', false) + public async shouldBeAbleToCreateATestFileUsingCliTemplate({ assert, command }: Context) { + const output = await command.run('make:test TestTest --cli') - const path = Path.tests('e2e/TestTest.ts') - const file = await new File(path).load({ withContent: true }) + output.assertSucceeded() + output.assertLogged('[ MAKING TEST ]') + output.assertLogged('[ success ] Test "TestTest" successfully created.') - assert.isTrue(file.fileExists) - assert.isTrue(file.content.toString().includes("test.group('TestTest'")) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.tests('e2e/TestTest.ts'))) } @Test() - public async shouldBeAbleToCreateAnUnitTestFileAsFunction({ assert }: Context) { - await Artisan.call('make:test TestTest --unit --function', false) + public async shouldBeAbleToCreateATestFileUsingFunctionalTemplate({ assert, command }: Context) { + const output = await command.run('make:test TestTest --function') - const path = Path.tests('unit/TestTest.ts') - const file = await new File(path).load({ withContent: true }) + output.assertSucceeded() + output.assertLogged('[ MAKING TEST ]') + output.assertLogged('[ success ] Test "TestTest" successfully created.') - assert.isTrue(file.fileExists) - assert.isTrue(file.content.toString().includes("test.group('TestTest'")) - assert.isTrue(this.processExitMock.calledOnceWith(0)) + assert.isTrue(await File.exists(Path.tests('e2e/TestTest.ts'))) } @Test() - public async shouldThrowAnExceptionWhenTheFileAlreadyExists({ assert }: Context) { - await Artisan.call('make:test TestTest', false) - await Artisan.call('make:test TestTest', false) + public async shouldBeAbleToCreateATestFileWithADifferentDestPath({ assert, command }: Context) { + const output = await command.run('make:test TestTest', { + path: Path.fixtures('consoles/console-mock-dest-import.ts') + }) + + output.assertSucceeded() + output.assertLogged('[ MAKING TEST ]') + output.assertLogged('[ success ] Test "TestTest" successfully created.') - assert.isTrue(this.processExitMock.calledWith(1)) + assert.isTrue(await File.exists(Path.fixtures('storage/tests/TestTest.ts'))) + } + + @Test() + public async shouldThrowAnTestWhenTheFileAlreadyExists({ command }: Context) { + await command.run('make:test TestTest') + const output = await command.run('make:test TestTest') + + output.assertFailed() + output.assertLogged('[ MAKING TEST ]') + output.assertLogged('The file') + output.assertLogged('TestTest.ts') + output.assertLogged('already exists') } } diff --git a/tests/unit/commands/ReplCommandTest.ts b/tests/unit/commands/ReplCommandTest.ts index bc92d7b..38bfe8f 100644 --- a/tests/unit/commands/ReplCommandTest.ts +++ b/tests/unit/commands/ReplCommandTest.ts @@ -7,24 +7,54 @@ * file that was distributed with this source code. */ -import { Artisan } from '@athenna/artisan' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class ReplCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToRunTheReplApplication({ assert }: Context) { - const { stdout, stderr } = await Artisan.callInChild('repl', this.artisan) + public async shouldBeAbleToExecuteReplCommand({ command }: Context) { + const output = await command.run('repl') - assert.deepEqual(stderr, '') - assert.isTrue(stdout.includes('running repl session')) + output.assertSucceeded() + output.assertLogged('Hello from #bin/repl!') } @Test() - public async shouldBeAbleToRunTheReplApplicationWithDifferentNodeEnv({ assert }: Context) { - const { stdout, stderr } = await Artisan.callInChild('repl --env heyhey', this.artisan) + public async shouldBeAbleToExecuteReplCommandWithADifferentEnv({ command }: Context) { + const output = await command.run('repl --env=test-hello') - assert.deepEqual(stderr, '') - assert.isTrue(stdout.includes('heyhey')) + output.assertSucceeded() + output.assertLogged('Hello from #bin/repl!') + output.assertLogged('test-hello\ntest-hello') + } + + @Test() + public async shouldBeAbleToExecuteReplCommandUsingAImportAliasPathEntry({ command }: Context) { + const output = await command.run('repl', { + path: Path.fixtures('consoles/import-alias-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/repl!') + } + + @Test() + public async shouldBeAbleToExecuteReplCommandUsingAnAbsolutePathEntry({ command }: Context) { + const output = await command.run('repl', { + path: Path.fixtures('consoles/absolute-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/repl!') + } + + @Test() + public async shouldBeAbleToExecuteReplCommandUsingARelativePathEntry({ command }: Context) { + const output = await command.run('repl', { + path: Path.fixtures('consoles/relative-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/repl!') } } diff --git a/tests/unit/commands/ServeCommandTest.ts b/tests/unit/commands/ServeCommandTest.ts index b442df3..add0fca 100644 --- a/tests/unit/commands/ServeCommandTest.ts +++ b/tests/unit/commands/ServeCommandTest.ts @@ -7,24 +7,54 @@ * file that was distributed with this source code. */ -import { Artisan } from '@athenna/artisan' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class ServeCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToServeTheApplication({ assert }: Context) { - const { stdout, stderr } = await Artisan.callInChild('serve', this.artisan) + public async shouldBeAbleToExecuteServeCommand({ command }: Context) { + const output = await command.run('serve') - assert.deepEqual(stderr, '') - assert.isTrue(stdout.includes('serving application')) + output.assertSucceeded() + output.assertLogged('Hello from #bin/main!') } @Test() - public async shouldBeAbleToServeTheApplicationWithDifferentNodeEnv({ assert }: Context) { - const { stdout, stderr } = await Artisan.callInChild('serve --env heyhey', this.artisan) + public async shouldBeAbleToExecuteServeCommandWithADifferentEnv({ command }: Context) { + const output = await command.run('serve --env=test-hello') - assert.deepEqual(stderr, '') - assert.isTrue(stdout.includes('heyhey')) + output.assertSucceeded() + output.assertLogged('Hello from #bin/main!') + output.assertLogged('test-hello\ntest-hello') + } + + @Test() + public async shouldBeAbleToExecuteServeCommandUsingAImportAliasPathEntry({ command }: Context) { + const output = await command.run('serve', { + path: Path.fixtures('consoles/import-alias-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/main!') + } + + @Test() + public async shouldBeAbleToExecuteServeCommandUsingAnAbsolutePathEntry({ command }: Context) { + const output = await command.run('serve', { + path: Path.fixtures('consoles/absolute-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/main!') + } + + @Test() + public async shouldBeAbleToExecuteServeCommandUsingARelativePathEntry({ command }: Context) { + const output = await command.run('serve', { + path: Path.fixtures('consoles/relative-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/main!') } } diff --git a/tests/unit/commands/TestCommandTest.ts b/tests/unit/commands/TestCommandTest.ts index aa0f055..e206573 100644 --- a/tests/unit/commands/TestCommandTest.ts +++ b/tests/unit/commands/TestCommandTest.ts @@ -7,24 +7,75 @@ * file that was distributed with this source code. */ -import { Artisan } from '@athenna/artisan' import { Test, type Context } from '@athenna/test' import { BaseCommandTest } from '#tests/helpers/BaseCommandTest' export default class TestCommandTest extends BaseCommandTest { @Test() - public async shouldBeAbleToRunTheApplicationTests({ assert }: Context) { - const { stdout, stderr } = await Artisan.callInChild('test', this.artisan) + public async shouldBeAbleToExecuteTestCommand({ command }: Context) { + const output = await command.run('test --cmd') - assert.deepEqual(stderr, '') - assert.isTrue(stdout.includes('running tests')) + output.assertSucceeded() + output.assertLogged('Hello from #bin/test!') } @Test() - public async shouldBeAbleToRunTheApplicationTestsWithDifferentNodeEnv({ assert }: Context) { - const { stdout, stderr } = await Artisan.callInChild('test --env heyhey', this.artisan) + public async shouldBeAbleToExecuteTestCommandWithADifferentEnv({ command }: Context) { + const output = await command.run('test --cmd --env=test-hello') - assert.deepEqual(stderr, '') - assert.isTrue(stdout.includes('heyhey')) + output.assertSucceeded() + output.assertLogged('Hello from #bin/test!') + output.assertLogged('test-hello\ntest-hello') + } + + @Test() + public async shouldBeAbleToExecuteTestCommandAndSetJapaArgs({ command }: Context) { + const output = await command.run( + 'test ' + + '--cmd ' + + '--tests="hello" ' + + '--groups="TestCommandTest" ' + + '--files="./tests/unit/commands/TestCommandTest.ts" ' + + '--tags="unit" --force-exit --timeout="3000"' + ) + + output.assertSucceeded() + output.assertLogged('Hello from #bin/test!') + output.assertLogged('--tests="hello"') + output.assertLogged('--groups="TestCommandTest"') + output.assertLogged('--tags="unit"') + output.assertLogged('--force-exit') + output.assertLogged('--timeout="3000"') + output.assertLogged('--files="./tests/unit/commands/TestCommandTest.ts"') + } + + @Test() + public async shouldBeAbleToExecuteTestCommandUsingAImportAliasPathEntry({ command }: Context) { + const output = await command.run('test --cmd', { + path: Path.fixtures('consoles/import-alias-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/test!') + } + + @Test() + public async shouldBeAbleToExecuteTestCommandUsingAnAbsolutePathEntry({ command }: Context) { + const output = await command.run('test --cmd', { + path: Path.fixtures('consoles/absolute-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/test!') + } + + @Test() + public async shouldBeAbleToExecuteTestCommandUsingARelativePathEntry({ command }: Context) { + const output = await command.run('test --cmd', { + path: Path.fixtures('consoles/relative-path-entry.ts') + }) + + output.assertSucceeded() + output.assertLogged('Hello from #tests/fixtures/entrypoints/test!') } } diff --git a/tests/unit/helpers/LoadHelperTest.ts b/tests/unit/helpers/LoadHelperTest.ts index 8b1d084..5196c43 100644 --- a/tests/unit/helpers/LoadHelperTest.ts +++ b/tests/unit/helpers/LoadHelperTest.ts @@ -8,14 +8,15 @@ */ import { LoadHelper } from '#src' -import { Log } from '@athenna/logger' -import { BaseTest } from '#tests/helpers/BaseTest' +import { Log, LoggerProvider } from '@athenna/logger' import { CALLED_MAP } from '#tests/helpers/CalledMap' -import { Test, BeforeEach, type Context, Mock } from '@athenna/test' +import { Test, BeforeEach, type Context, Mock, AfterEach } from '@athenna/test' -export default class LoadHelperTest extends BaseTest { +export default class LoadHelperTest { @BeforeEach() - public setProviders() { + public beforeEach() { + new LoggerProvider().register() + Config.set('rc.parentURL', Path.toHref(Path.pwd() + '/')) Config.set('rc.providers', [ '#tests/fixtures/providers/ReplEnvProvider', '#tests/fixtures/providers/HttpEnvProvider', @@ -25,6 +26,14 @@ export default class LoadHelperTest extends BaseTest { ]) } + @AfterEach() + public async afterEach() { + Config.clear() + ioc.reconstruct() + LoadHelper.providers = [] + LoadHelper.alreadyPreloaded = [] + } + @Test() public async shouldBeAbleToLoadBootableProvidersByConsoleEnvironment({ assert }: Context) { Config.set('rc.environments', ['repl']) @@ -141,12 +150,12 @@ export default class LoadHelperTest extends BaseTest { } @Test() - public async shouldBeAbleToLogThatProvidersAreShutingdownIfRcShutdownLogsIsTrue({ assert }: Context) { + public async shouldBeAbleToLogThatProvidersAreShutingDownIfRcShutdownLogsIsTrue({ assert }: Context) { Config.set('rc.shutdownLogs', true) - const successFake = Mock.sandbox.fake() + const successFake = Mock.fake() const mock = Log.when('channelOrVanilla').return({ - success: args => successFake(args) + success: successFake }) await LoadHelper.loadBootableProviders() @@ -180,9 +189,9 @@ export default class LoadHelperTest extends BaseTest { public async shouldBeAbleToLogThatProvidersAreRegootingIfRcBootLogsIsTrue({ assert }: Context) { Config.set('rc.bootLogs', true) - const successFake = Mock.sandbox.fake() + const successFake = Mock.fake() const mock = Log.when('channelOrVanilla').return({ - success: args => successFake(args) + success: successFake }) await LoadHelper.regootProviders() @@ -210,9 +219,9 @@ export default class LoadHelperTest extends BaseTest { Config.set('rc.bootLogs', true) Config.set('rc.preloads', ['#tests/fixtures/routes/load']) - const successFake = Mock.sandbox.fake() + const successFake = Mock.fake() const mock = Log.when('channelOrVanilla').return({ - success: args => successFake(args) + success: successFake }) await LoadHelper.preloadFiles() diff --git a/tests/unit/ignite/IgniteTest.ts b/tests/unit/ignite/IgniteTest.ts index 9a59b47..3b87595 100644 --- a/tests/unit/ignite/IgniteTest.ts +++ b/tests/unit/ignite/IgniteTest.ts @@ -7,21 +7,64 @@ * file that was distributed with this source code. */ -import { Ignite } from '#src' -import { Server } from '@athenna/http' -import { pathToFileURL } from 'node:url' -import { BaseTest } from '#tests/helpers/BaseTest' -import { Exec, File, Json } from '@athenna/common' -import { Test, type Context, Mock } from '@athenna/test' +import { Ignite, LoadHelper } from '#src' +import { Rc } from '@athenna/config' +import { sep, resolve } from 'node:path' +import { Repl } from '#src/applications/Repl' +import { Http } from '#src/applications/Http' +import { Console } from '#src/applications/Console' +import { Log, LoggerProvider } from '@athenna/logger' +import { Exception, File, Json, Module } from '@athenna/common' +import { Test, type Context, BeforeEach, Mock, AfterEach } from '@athenna/test' +import { NotSatisfiedNodeVersion } from '#src/exceptions/NotSatisfiedNodeVersion' + +export default class IgniteTest { + public oldEnv: NodeJS.ProcessEnv + public oldDirs: Record + + @BeforeEach() + public async beforeEach() { + this.oldDirs = Json.copy(Path.dirs) + this.oldEnv = Json.copy(process.env) + Mock.when(process, 'chdir').return(undefined) + new LoggerProvider().register() + } + + @AfterEach() + public async afterEach() { + Mock.restoreAll() + process.removeAllListeners('SIGINT') + process.removeAllListeners('SIGTERM') + process.removeListener('uncaughtException', Repl.handleError) + process.removeListener('uncaughtException', new Ignite().handleError) + Config.clear() + ioc.reconstruct() + LoadHelper.providers = [] + LoadHelper.alreadyPreloaded = [] + Path.dirs = this.oldDirs + process.env = this.oldEnv + } + + @Test() + public async shouldSaveTheParentURLInIgniteAndInConfigWhenBootingTheAppFoundation({ assert }: Context) { + const parentURL = Path.toHref(Path.pwd() + '/') + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/')) + + assert.equal(parentURL, ignite.parentURL) + assert.equal(parentURL, Config.get('rc.parentURL')) + } -export default class IgniteTest extends BaseTest { @Test() - public async shouldBeAbleToIgniteTheApplicationWhenInstantiatingIgnite({ assert }: Context) { - const cwd = process.cwd() - const ignite = await new Ignite().load(Config.get('meta')) + public async shouldSaveTheApplicationCWDInConfigWhenBootingTheAppFoundation({ assert }: Context) { + await new Ignite().load(Path.toHref(Path.pwd() + '/')) + + assert.equal(Config.get('rc.callPath'), process.cwd()) + } + + @Test() + public async shouldSaveTheIgniteConfigUsedWhenBootingTheAppFoundation({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/')) - assert.equal(ignite.meta, Config.get('meta')) - assert.equal(Config.get('rc.callPath'), cwd) assert.containsSubset(ignite.options, { bootLogs: true, shutdownLogs: true, @@ -30,296 +73,717 @@ export default class IgniteTest extends BaseTest { loadConfigSafe: true, athennaRcPath: Path.pwd('package.json') }) + } + + @Test() + public async shouldRegisterIgniteInstanceUsedInAthennaContainer({ assert }: Context) { + await new Ignite().load(Path.toHref(Path.pwd() + '/')) + assert.isTrue(ioc.has('Athenna/Core/Ignite')) } @Test() - public async shouldBeAbleToIgniteTheApplicationRunningTypescriptWhenInstantiatingIgnite({ assert }: Context) { - const ignite = await new Ignite().load(Config.get('meta'), { beforePath: '/dist' }) + public async shouldAutomaticallyResolveTheProcessCWDOfTheUserProjectUsingChdir({ assert }: Context) { + await new Ignite().load(Path.toHref(Path.pwd() + '/')) + + const __dirname = Module.createDirname(import.meta.url) + + assert.calledWith(process.chdir, resolve(__dirname, '..', '..', '..', '..', '..', '..')) + } + + @Test() + public async shouldAutomaticallyResolveIfApplicationIsUsingTypeScriptOrNot({ assert }: Context) { + process.env.IS_TS = undefined + + await new Ignite().load(Path.toHref(Path.pwd() + '/main.ts')) + + assert.equal(process.env.IS_TS, 'true') + } + + @Test() + public async shouldAutomaticallyResolveIfApplicationIsUsingJavaScriptOrNot({ assert }: Context) { + process.env.IS_TS = undefined + + await new Ignite().load(Path.toHref(Path.pwd() + '/main.js')) + + assert.equal(process.env.IS_TS, 'false') + } + + @Test() + public async shouldNotSubscribeIS_TSEnvIfIsAlreadyDefined({ assert }: Context) { + process.env.IS_TS = 'true' - assert.isTrue(Env('IS_TS', false)) - assert.isFalse(Path.pwd().includes('dist')) - assert.equal(ignite.meta, Config.get('meta')) - assert.containsSubset(ignite.options, { beforePath: '/dist' }) + await new Ignite().load(Path.toHref(Path.pwd() + '/main.js')) + + assert.equal(process.env.IS_TS, 'true') } @Test() - public async shouldBeAbleToIgniteTheApplicationRunningJavascriptCompiledCodeWhenInstantiatingIgnite({ + public async shouldNotBePossibleToHaveMultipleEqualUncaughtExceptionHandlersBeingRegisteredByIgnite({ assert }: Context) { - delete process.env.IS_TS - const meta = pathToFileURL(Path.fixtures('main.js')).href - const ignite = await new Ignite().load(meta, { beforePath: '/dist' }) + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/')) + + ignite.setUncaughtExceptionHandler() + ignite.setUncaughtExceptionHandler() + ignite.setUncaughtExceptionHandler() + ignite.setUncaughtExceptionHandler() + ignite.setUncaughtExceptionHandler() + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + assert.lengthOf(process?._events?.uncaughtException, 3) + } - assert.isFalse(Env('IS_TS', true)) - assert.isTrue(Path.app().includes('dist')) - assert.equal(ignite.meta, meta) - assert.containsSubset(ignite.options, { beforePath: '/dist' }) + @Test() + public async shouldBeAbleToSetTheAbsolutePathToTheEnvFile({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + envPath: Path.pwd() + '/.env' + }) + + assert.equal(ignite.options.envPath, Path.pwd() + sep + '.env') } @Test() - public async shouldBeAbleToIgniteTheApplicationLoadingADifferentRcFileWhenInstantiatingIgnite({ assert }: Context) { - Config.delete('rc') - const ignite = await new Ignite().load(Config.get('meta'), { athennaRcPath: Path.fixtures('.athennarc.json') }) + public async shouldBeAbleToSetTheRelativePathToTheEnvFile({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + envPath: '.env' + }) - assert.equal(ignite.meta, Config.get('meta')) - assert.deepEqual(Config.get('rc.providers'), []) - assert.containsSubset(ignite.options, { athennaRcPath: Path.fixtures('.athennarc.json') }) + assert.equal(ignite.options.envPath, Path.pwd() + sep + '.env') } @Test() - public async shouldBeAbleToIgniteTheApplicationWithoutAnRcFileWhenInstantiatingIgnite({ assert }: Context) { - Config.delete('rc') - const copy = Json.copy(this.originalPJson) - delete copy.athenna - await new File(Path.pwd('package.json')).setContent(JSON.stringify(copy, null, 2).concat('\n')) + public async shouldBeAbleToLoadTheAthennaPropertyAsRcFromPackageJsonFile({ assert }: Context) { + await new Ignite().load(Path.toHref(Path.pwd() + '/')) - const ignite = await new Ignite().load(Config.get('meta')) + const pjson = new File(Path.pwd('package.json')).getContentAsJsonSync() - assert.equal(ignite.meta, Config.get('meta')) - assert.deepEqual(Config.get('rc.providers'), []) - assert.containsSubset(ignite.options, { athennaRcPath: null }) + assert.containsSubset(Config.get('rc'), pjson.athenna) } @Test() - public async shouldNotThrowAnErrorWhenTheNodeEngineSatisfiesTheSemverVersion({ assert }: Context) { - Config.set('rc.engines', { node: '>=14.0.0' }) + public async shouldSetAllTheDefaultValuesInTheRcConfig({ assert }: Context) { + await new Ignite().load(Path.toHref(Path.pwd() + '/')) - await new Ignite().load(Config.get('meta')) + const pjson = new File(Path.pwd('package.json')).getContentAsJsonSync() - assert.isFalse(this.processExitMock.called) + assert.containsSubset(Config.get('rc'), { + typescript: true, + version: pjson.version, + bootLogs: true, + shutdownLogs: true, + callPath: process.cwd(), + controllers: [], + engines: { + node: '>=20.0.0' + }, + ignoreDirsBeforePath: ['nodeModules', 'nodeModulesBin'], + environments: [], + globalMiddlewares: [], + middlewares: [], + namedMiddlewares: {}, + parentURL: Path.toHref(Path.pwd() + '/'), + preloads: [], + services: [], + athennaVersion: `Athenna Framework v${pjson.version}` + }) } @Test() - public async shouldThrowAnErrorWhenTheNodeEngineDoesNotSatisfiesTheSemverVersion({ assert }: Context) { - Config.set('rc.engines', { node: '>=20.0.0' }) + public async shouldBeAbleToSetTheAbsolutePathToTheAthennaRcFile({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + athennaRcPath: Path.fixtures('.athennarc.json') + }) - await new Ignite().load(Config.get('meta')) + assert.equal(Config.get('rc.hello'), 'world!') + assert.equal(ignite.options.athennaRcPath, Path.fixtures('.athennarc.json')) + } + + @Test() + public async shouldBeAbleToSetTheRelativePathToTheAthennaRcFile({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + athennaRcPath: './tests/fixtures/.athennarc.json' + }) - assert.isTrue(this.processExitMock.calledWith(1)) + assert.equal(Config.get('rc.hello'), 'world!') + assert.equal(ignite.options.athennaRcPath, Path.fixtures('.athennarc.json')) } @Test() - public async shouldBeAbleToFireTheIgniteClassLoadingAllTheRestOfTheApplication({ assert }: Context) { - Config.set('rc.environments', ['other']) - Config.set('rc.directories', { config: 'tests/fixtures/igniteConfig' }) + public async shouldSetTheRcFileInTheRcHelper({ assert }: Context) { + await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + athennaRcPath: './tests/fixtures/.athennarc.json' + }) + + assert.equal(Rc.content.get('hello'), 'world!') + } - const ignite = await new Ignite().load(Config.get('meta'), { - envPath: Path.fixtures('.env'), - environments: ['console'] + @Test() + public async shouldBeAbleToMergeDirsSetInTheRcFileInPathDirs({ assert }: Context) { + Config.set('rc.directories', { + bin: 'test/bin', + src: 'test/src', + tests: 'test/tests' }) - await ignite.fire() + await new Ignite().load(Path.toHref(Path.pwd() + '/')) - assert.equal(Env('IGNITE_FIRED'), true) - assert.equal(Env('NODE_ENV'), 'local') - assert.isTrue(Config.is('ignite.fired', true)) - assert.deepEqual(Config.get('rc.environments'), ['other', 'console']) - assert.deepEqual(Config.get('rc.providers'), [ - '#src/providers/CoreProvider', - '@athenna/http/providers/HttpRouteProvider', - '@athenna/http/providers/HttpServerProvider' - ]) + assert.equal(Path.dirs.bin, 'test/bin') + assert.equal(Path.dirs.src, 'test/src') + assert.equal(Path.dirs.tests, 'test/tests') + assert.equal(Path.dirs.app, 'app') + assert.equal(Path.dirs.bootstrap, 'bootstrap') } @Test() - public async shouldBeAbleToFireTheIgniteClassLoadingAllTheRestOfTheApplicationResolvingTheEnvByNODE_ENV({ - assert - }: Context) { - await new File(Path.fixtures('.env')).copy(Path.pwd('.env')) - await new File(Path.fixtures('.env.local')).copy(Path.pwd('.env.local')) + public async shouldNotSetTheApplicationRootPathIfApplicationIsRunningTSCode({ assert }: Context) { + process.env.IS_TS = 'true' - process.env.OVERRIDE_ENV = 'true' - Config.set('rc.environments', ['other']) - Config.set('rc.directories', { config: 'tests/fixtures/igniteConfig' }) + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/')) - const ignite = await new Ignite().load(Config.get('meta'), { - environments: ['console'] + assert.deepEqual(Path.dirs, { ...this.oldDirs, bootstrap: 'bin' }) + assert.equal(ignite.options.beforePath, 'build') + } + + @Test() + public async shouldNotSetTheApplicationRootPathIfItsUndefined({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + beforePath: undefined }) - await ignite.fire() + assert.deepEqual(Path.dirs, { ...this.oldDirs, bootstrap: 'bin' }) + assert.equal(ignite.options.beforePath, undefined) + } + + @Test() + public async shouldBeAbleToSetTheApplicationBeforePathWhenRunningJSCode({ assert }: Context) { + process.env.IS_TS = 'false' - assert.isUndefined(Env('IGNITE_FIRED')) - assert.equal(Env('ENV_LOCAL_LOADED'), true) - assert.isTrue(Config.is('ignite.fired', true)) - assert.deepEqual(Config.get('rc.environments'), ['other', 'console']) - assert.deepEqual(Config.get('rc.providers'), [ - '#src/providers/CoreProvider', - '@athenna/http/providers/HttpRouteProvider', - '@athenna/http/providers/HttpServerProvider' - ]) + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/main.js')) + + assert.equal(Path.dirs.bootstrap, 'build/bin') + assert.equal(Path.dirs.nodeModules, 'node_modules') + assert.equal(Path.dirs.nodeModulesBin, 'node_modules/.bin') + assert.equal(Path.dirs.app, 'build/app') + assert.equal(ignite.options.beforePath, 'build') } @Test() - public async shouldBeAbleToHandleSyntaxErrorExceptionsOfConfigsUsingTheDefaultIgniteHandler({ assert }: Context) { - Config.set('rc.directories', { config: 'tests/fixtures/syntaxErrorConfig' }) + public async shouldBeAbleToIgnorePathsWhenAddingTheApplicationBeforePath({ assert }: Context) { + process.env.IS_TS = 'false' + Config.set('rc.ignoreDirsBeforePath', ['bootstrap', 'nodeModules']) - const ignite = await new Ignite().load(Config.get('meta'), { - environments: ['console'] - }) + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/main.js')) - await ignite.fire() + assert.equal(Path.dirs.bootstrap, 'bin') + assert.equal(Path.dirs.nodeModules, 'node_modules') + assert.equal(Path.dirs.nodeModulesBin, 'build/node_modules/.bin') + assert.equal(Path.dirs.app, 'build/app') + assert.equal(ignite.options.beforePath, 'build') + } + + @Test() + public async shouldThrownIfTheNodeEngineSatisfiesTheActualNodeJSVersion({ assert }: Context) { + const ignite = new Ignite() + + Mock.when(ignite, 'handleError').throw(new NotSatisfiedNodeVersion(process.version, '<=18.0.0')) + Config.set('rc.engines.node', '<=18.0.0') + + await assert.rejects(() => ignite.load(Path.toHref(Path.pwd() + '/')), NotSatisfiedNodeVersion) + } + + @Test() + public async shouldIgnoreVersionValidationIfEnginesIsNotDefined({ assert }: Context) { + const ignite = new Ignite() + + Config.set('rc.engines', undefined) + + await assert.doesNotRejects(() => ignite.load(Path.toHref(Path.pwd() + '/'))) + } + + @Test() + public async shouldSetTheApplicationSIGTERMSignalByDefault({ assert }: Context) { + assert.lengthOf(process.listeners('SIGTERM'), 0) + + await new Ignite().load(Path.toHref(Path.pwd() + '/')) - assert.isTrue(this.processExitMock.calledWith(1)) + assert.isTrue(Env('SIGNALS_CONFIGURED', false)) + assert.lengthOf(process.listeners('SIGTERM'), 1) } @Test() - public async shouldBeAbleToDefineWrongVersionsInPackageJsonButStillWorks({ assert }: Context) { - const copy = Json.copy(this.originalPJson) - copy.version = 'a.b.c' - await new File(Path.pwd('package.json')).setContent(JSON.stringify(copy, null, 2).concat('\n')) + public async shouldSetTheApplicationSIGINTSignalByDefault({ assert }: Context) { + assert.lengthOf(process.listeners('SIGINT'), 0) - await new Ignite().load(Config.get('meta')) + await new Ignite().load(Path.toHref(Path.pwd() + '/')) - assert.isUndefined(Env('APP_VERSION')) + assert.isTrue(Env('SIGNALS_CONFIGURED', false)) + assert.lengthOf(process.listeners('SIGINT'), 1) } @Test() - public async shouldBeAbleToDefineApplicationSignals({ assert }: Context) { - let SIGINT = false - let SIGTERM = false + public async shouldSetACustomSIGTERMSignalForTheApplication({ assert }: Context) { + assert.lengthOf(process.listeners('SIGTERM'), 0) + const sigterm = () => {} Config.set('app.signals', { - SIGINT: () => (SIGINT = true), - SIGTERM: () => (SIGTERM = true) + SIGTERM: sigterm }) - await new Ignite().load(Config.get('meta')) + await new Ignite().load(Path.toHref(Path.pwd() + '/')) + + assert.isTrue(Env('SIGNALS_CONFIGURED', false)) + assert.lengthOf(process.listeners('SIGTERM'), 1) + assert.deepEqual(process.listeners('SIGTERM')[0], sigterm) + } + + @Test() + public async shouldSetACustomSIGINTSignalForTheApplication({ assert }: Context) { + assert.lengthOf(process.listeners('SIGINT'), 0) - process.emit('SIGINT') - process.emit('SIGTERM') + const sigint = () => {} + Config.set('app.signals', { + SIGINT: sigint + }) - assert.equal(SIGINT, true) - assert.equal(SIGTERM, true) + await new Ignite().load(Path.toHref(Path.pwd() + '/')) + + assert.isTrue(Env('SIGNALS_CONFIGURED', false)) + assert.lengthOf(process.listeners('SIGINT'), 1) + assert.deepEqual(process.listeners('SIGINT')[0], sigint) } @Test() - public async shouldNotDefineApplicationSignalsMoreThanOnce({ assert }: Context) { - let SIGINT = false - let SIGTERM = false + public async shouldBeAbleToMergeCustomSIGTERMWithDefaultSIGINTForTheApplication({ assert }: Context) { + assert.lengthOf(process.listeners('SIGINT'), 0) + assert.lengthOf(process.listeners('SIGTERM'), 0) + const sigterm = () => {} Config.set('app.signals', { - SIGINT: () => (SIGINT = true), - SIGTERM: () => (SIGTERM = true) + SIGTERM: sigterm }) - const ignite = await new Ignite().load(Config.get('meta')) + await new Ignite().load(Path.toHref(Path.pwd() + '/')) + + assert.isTrue(Env('SIGNALS_CONFIGURED', false)) + assert.lengthOf(process.listeners('SIGINT'), 1) + assert.lengthOf(process.listeners('SIGTERM'), 1) + assert.deepEqual(process.listeners('SIGTERM')[0], sigterm) + } + @Test() + public async shouldBeAbleToMergeCustomSIGINTWithDefaultSIGTERMForTheApplication({ assert }: Context) { + assert.lengthOf(process.listeners('SIGINT'), 0) + assert.lengthOf(process.listeners('SIGTERM'), 0) + + const sigint = () => {} Config.set('app.signals', { - SIGINT: () => (SIGINT = false), - SIGTERM: () => (SIGTERM = false) + SIGINT: sigint + }) + + await new Ignite().load(Path.toHref(Path.pwd() + '/')) + + assert.isTrue(Env('SIGNALS_CONFIGURED', false)) + assert.lengthOf(process.listeners('SIGINT'), 1) + assert.lengthOf(process.listeners('SIGTERM'), 1) + assert.deepEqual(process.listeners('SIGINT')[0], sigint) + } + + @Test() + public async shouldCatchVanillaErrorsThatHappensDuringBootOfTheFoundationAndHandleIt({ assert }: Context) { + const fatalMock = Mock.fake() + Log.when('channelOrVanilla').return({ + fatal: fatalMock + }) + Mock.when(process, 'exit').return(undefined) + + const ignite = new Ignite() + + Mock.spy(ignite, 'handleError') + Mock.when(ignite, 'setUncaughtExceptionHandler').throw(new Error('test')) + + await ignite.load(Path.toHref(Path.pwd() + '/')) + + assert.calledWith(process.exit, 1) + assert.calledWith(ignite.handleError, new Error('test')) + assert.calledWith(fatalMock, await new Error('test').toAthennaException().prettify()) + } + + @Test() + public async shouldCatchAthennaExceptionsThatHappensDuringBootOfTheFoundationAndHandleIt({ assert }: Context) { + const fatalMock = Mock.fake() + Log.when('channelOrVanilla').return({ + fatal: fatalMock + }) + Mock.when(process, 'exit').return(undefined) + + const ignite = new Ignite() + + Mock.spy(ignite, 'handleError') + Mock.when(ignite, 'setUncaughtExceptionHandler').throw(new Exception()) + + await ignite.load(Path.toHref(Path.pwd() + '/')) + + assert.calledWith(process.exit, 1) + assert.calledWith(ignite.handleError, new Exception()) + assert.calledWith(fatalMock, await new Exception().prettify()) + } + + @Test() + public async shouldCatchAnyKindOfErrorsWhenUsingBun({ assert }: Context) { + process.versions.bun = '1.0.0' + const fatalMock = Mock.fake() + Log.when('channelOrVanilla').return({ + fatal: fatalMock }) + Mock.when(process.stderr, 'write').return(undefined) + Mock.when(process, 'exit').return(undefined) + + const ignite = new Ignite() - await ignite.load(Config.get('meta')) + Mock.spy(ignite, 'handleError') + Mock.when(ignite, 'setUncaughtExceptionHandler').throw(new Exception()) - process.emit('SIGINT') - process.emit('SIGTERM') + await ignite.load(Path.toHref(Path.pwd() + '/')) - assert.equal(SIGINT, true) - assert.equal(SIGTERM, true) + assert.calledOnce(process.stderr.write) + assert.calledWith(process.exit, 1) + assert.calledWith(ignite.handleError, new Exception()) + assert.notCalled(fatalMock) } @Test() - public async shouldBeAbleToExecuteDefaultSIGINTSignalOfIgnite({ assert }: Context) { - const ignite = await new Ignite().load(Config.get('meta'), { - environments: ['console'] + public async shouldBeAbleToLoadAnEnvFileWhenFiringAthennaApplication({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false, + envPath: Path.fixtures('.env') }) await ignite.fire() - process.emit('SIGINT') + assert.equal(ignite.options.envPath, Path.fixtures('.env')) + assert.equal(process.env.LOADED_FIXTURE_ENV, 'true') + } - assert.isTrue(this.processExitMock.called) + @Test() + public async shouldBeAbleToLoadConfigPathWhenFiringAthennaApplication({ assert }: Context) { + Config.set('rc.directories.config', 'tests/fixtures/igniteConfig') + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + + await ignite.fire() + + assert.equal(Config.get('hello.hello'), 'world!') } @Test() - public async shouldBeAbleToExecuteDefaultSIGTERMSignalOfIgnite({ assert }: Context) { - const processKillFake = Mock.sandbox.fake() - process.kill = processKillFake - Config.set('rc.providers', ['#tests/fixtures/providers/ConsoleEnvProvider']) + public async shouldBeAbleToLoadConfigPathSafeWhenFiringAthennaApplication({ assert }: Context) { + Config.set('rc.directories.config', 'tests/fixtures/igniteConfig') + Config.set('hello.hello', 'will-not-be-changed!') - const ignite = await new Ignite().load(Config.get('meta'), { - environments: ['console'] + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false, + loadConfigSafe: true }) await ignite.fire() - process.emit('SIGTERM', 'SIGTERM') + assert.equal(Config.get('hello.hello'), 'will-not-be-changed!') + } - await Exec.sleep(100) + @Test() + public async shouldPushTheEnvironmentsSetInIgniteLoadToTheConfigValueOfIt({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false, + environments: ['test'] + }) + + await ignite.fire() - assert.isTrue(ioc.has('ConsoleEnvShutdown')) - assert.calledWith(processKillFake, process.pid, 'SIGTERM') + assert.deepEqual(Config.get('rc.environments'), ['test']) } @Test() - public async shouldIgnoreUndefinedSignalsFromAppSignals({ assert }: Context) { - Config.set('app.signals', { - SIGINT: null, // will set the default signal - IGNORE: undefined, - SIGTERM: undefined // will set the default signal + public async shouldNotSubscribeEnvironmentsConfigButOnlyAddNewValues({ assert }: Context) { + Config.set('rc.environments', ['development']) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false, + environments: ['test'] + }) + + await ignite.fire() + + assert.deepEqual(Config.get('rc.environments'), ['development', 'test']) + } + + @Test() + public async shouldCatchAndHandleVanillaErrorsThatHappensInsideFireMethod({ assert }: Context) { + const ignite = new Ignite() + + Mock.when(ignite, 'handleError').return(undefined) + Mock.when(ignite, 'setEnvVariablesFile').throw(new Error()) + + await ignite.load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.fire() + + assert.calledWith(ignite.handleError, new Error()) + } + + @Test() + public async shouldCatchAndHandleExceptionsThatHappensInsideFireMethod({ assert }: Context) { + const ignite = new Ignite() + + Mock.when(ignite, 'handleError').return(undefined) + Mock.when(ignite, 'setEnvVariablesFile').throw(new Exception()) + + await ignite.load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.fire() + + assert.calledWith(ignite.handleError, new Exception()) + } + + @Test() + public async shouldRegisterAndBootProvidersWhenFiringTheFoundation({ assert }: Context) { + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.fire() + + assert.lengthOf(LoadHelper.providers, 3) + } + + @Test() + public async shouldPreloadModulesWhenFiringTheFoundation({ assert }: Context) { + Config.set('rc.preloads', ['#tests/fixtures/routes/load']) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.fire() + + assert.deepEqual(LoadHelper.alreadyPreloaded, ['#tests/fixtures/routes/load']) + } + + @Test() + public async shouldSetTheReplEnvironmentInOptionsWhenIgnitingAReplApplication({ assert }: Context) { + Mock.when(Repl, 'boot').resolve(undefined) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.repl() + + assert.deepEqual(Config.get('rc.environments'), ['repl']) + } + + @Test() + public async shouldFireTheFoundationWhenIgnitingReplApplication({ assert }: Context) { + Mock.when(Repl, 'boot').resolve(undefined) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false }) - await new Ignite().load(Config.get('meta')) + Mock.spy(ignite, 'fire') - const events = process.eventNames() + await ignite.repl() - assert.isTrue(events.includes('SIGINT')) - assert.isTrue(events.includes('SIGTERM')) - assert.isFalse(events.includes('IGNORE')) + assert.calledOnce(ignite.fire) } @Test() - public async shouldBeAbleToIgniteTheArtisanApplicationFromIgniteClass({ assert }: Context) { - const ignite = await new Ignite().load(Config.get('meta')) + public async shouldSetACustomUncaughtExceptionHandlerForReplApplication({ assert }: Context) { + Mock.when(Repl, 'boot').resolve(undefined) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + + Mock.spy(ignite, 'setUncaughtExceptionHandler') - await ignite.artisan(['node', 'artisan', 'test:generate'], { routePath: Path.fixtures('routes/console.ts') }) + await ignite.repl() - assert.isTrue(await File.exists(Path.fixtures('storage/Command.ts'))) + assert.calledOnce(ignite.setUncaughtExceptionHandler) } @Test() - public async shouldBeAbleToIgniteTheHttpApplicationFromIgniteClass({ assert }: Context) { - const ignite = await new Ignite().load(Config.get('meta')) + public async shouldCatchAndHandleVanillaErrorsThatHappensInsideReplMethod({ assert }: Context) { + const ignite = new Ignite() + Mock.when(ignite, 'handleError').return(undefined) + Mock.when(ignite, 'fire').throw(new Error()) + + await ignite.load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.repl() + + assert.calledWith(ignite.handleError, new Error()) + } + + @Test() + public async shouldCatchAndHandleExceptionsThatHappensInsideReplMethod({ assert }: Context) { + const ignite = new Ignite() + + Mock.when(ignite, 'handleError').return(undefined) + Mock.when(ignite, 'fire').throw(new Exception()) + + await ignite.load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.repl() + + assert.calledWith(ignite.handleError, new Exception()) + } + + @Test() + public async shouldSetTheConsoleEnvironmentInOptionsWhenIgnitingAnArtisanApplication({ assert }: Context) { + Mock.when(Console, 'boot').resolve(undefined) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.console([]) + + assert.deepEqual(ignite.options.environments, ['console']) + } + + @Test() + public async shouldNotFireTheFoundationWhenIgnitingConsoleApplications({ assert }: Context) { + Mock.when(Console, 'boot').resolve(undefined) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + + Mock.when(ignite, 'fire').resolve(undefined) + + await ignite.console([]) + + assert.notCalled(ignite.fire) + assert.deepEqual(ignite.options.environments, ['console']) + } + + @Test() + public async shouldSendTheCorrectArgvAndOptionsToTheConsoleBootMethod({ assert }: Context) { + Mock.when(Console, 'boot').resolve(undefined) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + + await ignite.console(['test'], { + displayName: 'Artisan' + }) + + assert.calledWith(Console.boot, ['test'], { displayName: 'Artisan' }) + } + + @Test() + public async shouldCatchAndHandleVanillaErrorsThatHappensInsideConsoleMethod({ assert }: Context) { + Mock.when(Console, 'boot').reject(new Error()) + const ignite = new Ignite() + + Mock.when(ignite, 'handleError').return(undefined) + + await ignite.load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.console([]) + + assert.calledWith(ignite.handleError, new Error()) + } + + @Test() + public async shouldCatchAndHandleExceptionsThatHappensInsideConsoleMethod({ assert }: Context) { + Mock.when(Console, 'boot').reject(new Exception()) + const ignite = new Ignite() + + Mock.when(ignite, 'handleError').return(undefined) + + await ignite.load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.console([]) + + assert.calledWith(ignite.handleError, new Exception()) + } + + @Test() + public async shouldSetTheHttpEnvironmentInOptionsWhenIgnitingAHttpApplication({ assert }: Context) { + Mock.when(Http, 'boot').resolve(undefined) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) await ignite.httpServer() - assert.isTrue(Server.isListening) + assert.deepEqual(Config.get('rc.environments'), ['http']) } @Test() - public async shouldBeAbleToIgniteTheReplApplicationFromIgniteClass({ assert }: Context) { - const ignite = await new Ignite().load(Config.get('meta')) + public async shouldFireTheFoundationWhenIgnitingHttpApplication({ assert }: Context) { + Mock.when(Http, 'boot').resolve(undefined) - const repl = await ignite.repl() + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + + Mock.spy(ignite, 'fire') - assert.deepEqual(repl.context.ioc, ioc) + await ignite.httpServer() - repl.close() + assert.calledOnce(ignite.fire) } @Test() - public async shouldBeAbleToRegisterTheServicesDepsUsingTheCoreProvider({ assert }: Context) { - const ignite = await new Ignite().load(Config.get('meta'), { - environments: ['console'] + public async shouldSendTheCorrectOptionsToTheHttpBootMethod({ assert }: Context) { + Mock.when(Http, 'boot').resolve(undefined) + + const ignite = await new Ignite().load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false }) - await ignite.fire() + await ignite.httpServer({ host: 'localhost', port: 3000 }) + + assert.calledWith(Http.boot, { host: 'localhost', port: 3000 }) + } + + @Test() + public async shouldCatchAndHandleVanillaErrorsThatHappensInsideHttpMethod({ assert }: Context) { + Mock.when(Http, 'boot').reject(new Error()) + const ignite = new Ignite() + + Mock.when(ignite, 'handleError').return(undefined) - assert.isTrue(ioc.has('welcomeService')) - assert.isTrue(ioc.has('App/Services/WelcomeService')) - assert.isTrue(ioc.has('decoratedWelcomeService')) - assert.isTrue(ioc.has('App/Services/DecoratedWelcomeService')) + await ignite.load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.httpServer() + + assert.calledWith(ignite.handleError, new Error()) } @Test() - public async shouldBeAbleToIgniteTheApplicationWithDifferentDirectoriesRegistered({ assert }: Context) { - await new Ignite().load(Config.get('meta'), { athennaRcPath: Path.fixtures('.athennarc-dirs.json') }) + public async shouldCatchAndHandleExceptionsThatHappensInsideHttpMethod({ assert }: Context) { + Mock.when(Http, 'boot').reject(new Exception()) + const ignite = new Ignite() + + Mock.when(ignite, 'handleError').return(undefined) + + await ignite.load(Path.toHref(Path.pwd() + '/'), { + bootLogs: false + }) + await ignite.httpServer() - assert.equal(Path.app(), Path.pwd('app')) - assert.equal(Path.controllers(), Path.pwd('src/http/controllers')) - assert.equal(Path.middlewares(), Path.pwd('src/http/middlewares')) - assert.equal(Path.interceptors(), Path.pwd('src/http/interceptors')) - assert.equal(Path.terminators(), Path.pwd('src/http/terminators')) + assert.calledWith(ignite.handleError, new Exception()) } } diff --git a/tests/unit/providers/CoreProviderTest.ts b/tests/unit/providers/CoreProviderTest.ts new file mode 100644 index 0000000..2fa05d6 --- /dev/null +++ b/tests/unit/providers/CoreProviderTest.ts @@ -0,0 +1,84 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { CoreProvider } from '#src' +import { Test, type Context, AfterEach, BeforeEach } from '@athenna/test' + +export default class CoreProviderTest { + @BeforeEach() + public async beforeEach() { + Config.set('rc.parentURL', Path.toHref(Path.pwd() + '/')) + } + + @AfterEach() + public async afterEach() { + ioc.reconstruct() + Config.clear() + } + + @Test() + public async shouldBeAbleToRegisterServicesWithCoreProvider({ assert }: Context) { + Config.set('rc.services', ['#tests/fixtures/services/ExportService']) + + await new CoreProvider().register() + + assert.isTrue(ioc.has('exportService')) + assert.isTrue(ioc.has('App/Services/ExportService')) + } + + @Test() + public async shouldBeAbleToRegisterExportDefaultServicesWithCoreProvider({ assert }: Context) { + Config.set('rc.services', ['#tests/fixtures/services/ExportDefaultService']) + + await new CoreProvider().register() + + assert.isTrue(ioc.has('exportDefaultService')) + assert.isTrue(ioc.has('App/Services/ExportDefaultService')) + } + + @Test() + public async shouldBeAbleToRegisterAnnotatedServicesWithCoreProvider({ assert }: Context) { + Config.set('rc.services', ['#tests/fixtures/services/AnnotatedService']) + + await new CoreProvider().register() + + assert.isTrue(ioc.has('annotated')) + assert.isTrue(ioc.has('fixtures/annotated')) + } + + @Test() + public async shouldBeAbleToRegisterAnnotatedServicesWithoutConfigWithCoreProvider({ assert }: Context) { + Config.set('rc.services', ['#tests/fixtures/services/AnnotatedZeroService']) + + await new CoreProvider().register() + + assert.isTrue(ioc.has('annotatedZeroService')) + assert.isTrue(ioc.has('App/Services/AnnotatedZeroService')) + } + + @Test() + public async shouldBeAbleToRegisterServicesUsingAbsolutePathWithCoreProvider({ assert }: Context) { + Config.set('rc.services', [Path.fixtures('services/ExportService.ts')]) + + await new CoreProvider().register() + + assert.isTrue(ioc.has('exportService')) + assert.isTrue(ioc.has('App/Services/ExportService')) + } + + @Test() + public async shouldBeAbleToRegisterServicesUsingRelativePathWithCoreProvider({ assert }: Context) { + Config.set('rc.services', ['./tests/fixtures/services/ExportService.ts']) + + await new CoreProvider().register() + + assert.isTrue(ioc.has('exportService')) + assert.isTrue(ioc.has('App/Services/ExportService')) + } +} diff --git a/tests/unit/repl/ReplImplTest.ts b/tests/unit/repl/ReplImplTest.ts new file mode 100644 index 0000000..0fe14c1 --- /dev/null +++ b/tests/unit/repl/ReplImplTest.ts @@ -0,0 +1,271 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { sep } from 'node:path' +import { ReplImpl } from '#src' +import { Ls } from '#src/repl/commands/Ls' +import { Test, type Context, Mock, Cleanup, AfterEach } from '@athenna/test' + +export default class ReplImplTest { + @AfterEach() + public async afterEach() { + Mock.restoreAll() + } + + @Test() + public async shouldBeAbleToStartAReplSession({ assert }: Context) { + const repl = new ReplImpl() + const startMock = Mock.fake() + + Mock.when(repl as any, 'importRepl').resolve({ + start: startMock + }) + + await repl.start() + + assert.calledWith(startMock, { prompt: '' }) + } + + @Test() + public async shouldBeAbleToDefineAReplCommand({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + defineCommand: Mock.fake() + } as any + + repl + .command('test') + .help('The command help description') + .action(function action() {}) + .register() + + assert.calledWithMatch(repl.session.defineCommand, 'test', { + help: 'The command help description' + }) + } + + @Test() + public async shouldBeAbleToDefineAReplCommandImpl({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + defineCommand: Mock.fake() + } as any + + repl.commandImpl(Ls) + + assert.calledWithMatch(repl.session.defineCommand, 'ls', { + help: 'List all Athenna preloaded methods/properties in REPL context and some of the Node.js globals.' + }) + } + + @Test() + public async shouldBeAbleToSetTheDisplayPromptOption({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + displayPrompt: Mock.fake() + } as any + + repl.displayPrompt(true) + repl.displayPrompt(false) + + assert.calledWithMatch(repl.session.displayPrompt, true) + assert.calledWithMatch(repl.session.displayPrompt, false) + } + + @Test() + public async shouldBeAbleToSetTheReplPrompt({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + setPrompt: Mock.fake() + } as any + + repl.setPrompt('> ') + + assert.calledWithMatch(repl.session.setPrompt, '> ') + } + + @Test() + public async shouldBeAbleToWriteSomeOperationInTheReplSession({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + write: Mock.fake() + } as any + + repl.write('console.log(1)') + + assert.calledWithMatch(repl.session.write, 'console.log(1)') + } + + @Test() + public async shouldBeAbleToCleanTheReplSessionUsingCrtlLCommand({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + write: Mock.fake() + } as any + + repl.clean() + + assert.calledWithMatch(repl.session.write, '', { ctrl: true, name: 'l' }) + } + + @Test() + public async shouldBeAbleToRemoveTheDomainErrorHandlerOfTheReplSession({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + write: Mock.fake() + } as any + + repl.removeDomainErrorHandler() + + assert.calledWithMatch(repl.session.write, 'delete process?.domain?._events?.error\n') + } + + @Test() + public async shouldBeAbleToSetValuesInReplSessionContext({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + context: {} + } as any + + repl.setInContext('test', 1) + + assert.equal(repl.session.context.test, 1) + } + + @Test() + public async shouldBeAbleToWriteAnImportOperationInTheReplSession({ assert }: Context) { + const repl = new ReplImpl() + + repl.session = { + write: Mock.fake() + } as any + + repl.import('common', '@athenna/common') + + assert.calledWithMatch(repl.session.write, "const common = await import('@athenna/common')") + } + + @Test() + @Cleanup(() => Config.clear()) + public async shouldBeAbleToImportAnEntireModuleInTheReplSession({ assert }: Context) { + Config.set('rc.parentURL', Path.toHref(Path.pwd() + sep)) + + const repl = new ReplImpl() + + repl.session = { + context: {} + } as any + + await repl.importInContext('@athenna/common') + + const common = await import('@athenna/common') + + assert.deepEqual(repl.session.context.Clean, common.Clean) + assert.deepEqual(repl.session.context.Collection, common.Collection) + } + + @Test() + @Cleanup(() => Config.clear()) + public async shouldBeAbleToImportAClassInTheReplSession({ assert }: Context) { + Config.set('rc.parentURL', Path.toHref(Path.pwd() + sep)) + + const repl = new ReplImpl() + + repl.session = { + context: {} + } as any + + await repl.importInContext('#tests/fixtures/modules/default-class') + + const module = await import('#tests/fixtures/modules/default-class') + + assert.deepEqual(repl.session.context.ModuleOne, module.default) + } + + @Test() + @Cleanup(() => Config.clear()) + public async shouldBeAbleToImportAFunctionInTheReplSession({ assert }: Context) { + Config.set('rc.parentURL', Path.toHref(Path.pwd() + sep)) + + const repl = new ReplImpl() + + repl.session = { + context: {} + } as any + + await repl.importInContext('#tests/fixtures/modules/default-fn') + + const module = await import('#tests/fixtures/modules/default-fn') + + assert.deepEqual(repl.session.context.moduleOne, module.default) + } + + @Test() + @Cleanup(() => Config.clear()) + public async shouldBeAbleToImportAnArrowFunctionInTheReplSession({ assert }: Context) { + Config.set('rc.parentURL', Path.toHref(Path.pwd() + sep)) + + const repl = new ReplImpl() + + repl.session = { + context: {} + } as any + + await repl.importInContext('#tests/fixtures/modules/default-arrow-fn') + + const module = await import('#tests/fixtures/modules/default-arrow-fn') + + assert.deepEqual(repl.session.context.defaultArrowFn, module.default) + } + + @Test() + @Cleanup(() => Config.clear()) + public async shouldBeAbleToImportAConstantInTheReplSession({ assert }: Context) { + Config.set('rc.parentURL', Path.toHref(Path.pwd() + sep)) + + const repl = new ReplImpl() + + repl.session = { + context: {} + } as any + + await repl.importInContext('#tests/fixtures/modules/default-const') + + const module = await import('#tests/fixtures/modules/default-const') + + assert.deepEqual(repl.session.context.defaultConst, module.default) + } + + @Test() + @Cleanup(() => Config.clear()) + public async shouldBeAbleToImportADefaultObjectInTheReplSession({ assert }: Context) { + Config.set('rc.parentURL', Path.toHref(Path.pwd() + sep)) + + const repl = new ReplImpl() + + repl.session = { + context: {} + } as any + + await repl.importInContext('#tests/fixtures/modules/default-object') + + const module = await import('#tests/fixtures/modules/default-object') + + assert.deepEqual(repl.session.context.ModuleOne, module.default.ModuleOne) + assert.deepEqual(repl.session.context.ModuleTwo, module.default.ModuleTwo) + } +} diff --git a/tests/unit/repl/commands/CleanTest.ts b/tests/unit/repl/commands/CleanTest.ts new file mode 100644 index 0000000..35a8450 --- /dev/null +++ b/tests/unit/repl/commands/CleanTest.ts @@ -0,0 +1,108 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Color } from '@athenna/common' +import { Clean } from '#src/repl/commands/Clean' +import { Test, type Context, Mock, AfterEach } from '@athenna/test' + +export default class CleanTest { + @AfterEach() + public async afterEach() { + Mock.restoreAll() + } + + @Test() + public async shouldBeAbleToCleanTheReplContext({ assert }: Context) { + const context = { + hello: 'world' + } + + Mock.when(process.stdout, 'write').return(undefined) + Clean.action.bind({ + context, + displayPrompt: Mock.fake(), + clearBufferedCommand: Mock.fake() + })('hello') + + assert.isUndefined(context.hello) + } + + @Test() + public async shouldLogThatThePropertyToRemoveCannotBeEmpty({ assert }: Context) { + const context = { + hello: 'world' + } + + Mock.when(process.stdout, 'write').return(undefined) + Clean.action.bind({ + context, + displayPrompt: Mock.fake(), + clearBufferedCommand: Mock.fake() + })() + + assert.calledWith(process.stdout.write, Color.red('You have not provided any property to remove.\n') + '\n') + assert.calledWith(process.stdout.write, `Try like this: .clean ${Color.gray('(propertyName)')}\n\n`) + } + + @Test() + public async shouldLogThatThePropertyToRemoveDoesNotExistInReplContext({ assert }: Context) { + const context = { + hello: 'world' + } + + Mock.when(process.stdout, 'write').return(undefined) + Clean.action.bind({ + context, + displayPrompt: Mock.fake(), + clearBufferedCommand: Mock.fake() + })('not-found') + + assert.calledWith( + process.stdout.write, + Color.red(`The property "not-found" doesn't exist inside REPL context.\n`) + '\n' + ) + assert.calledWith( + process.stdout.write, + `Use the ${Color.gray('.ls')} command to check the properties available\n\n` + ) + } + + @Test() + public async shouldLogThatThePropertyWasSuccessfullyRemoved({ assert }: Context) { + const context = { + hello: 'world' + } + + Mock.when(process.stdout, 'write').return(undefined) + Clean.action.bind({ + context, + displayPrompt: Mock.fake(), + clearBufferedCommand: Mock.fake() + })('hello') + + assert.isUndefined(context.hello) + assert.calledWith( + process.stdout.write, + Color.green(`Property "hello" successfully removed from REPL context.\n`) + '\n' + ) + } + + @Test() + public async shouldReturnTheCommandSignature({ assert }: Context) { + assert.deepEqual(Clean.signature(), 'clean') + } + + @Test() + public async shouldReturnTheCommandHelp({ assert }: Context) { + assert.deepEqual( + Clean.help(), + `Clean any property of REPL global context. Example: .clean ${Color.gray('(propertyName)')}` + ) + } +} diff --git a/tests/unit/repl/commands/LsTest.ts b/tests/unit/repl/commands/LsTest.ts new file mode 100644 index 0000000..6fbf931 --- /dev/null +++ b/tests/unit/repl/commands/LsTest.ts @@ -0,0 +1,158 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Color } from '@athenna/common' +import { Ls } from '#src/repl/commands/Ls' +import { Test, type Context, Mock, AfterEach } from '@athenna/test' + +export default class LsTest { + @AfterEach() + public async afterEach() { + Mock.restoreAll() + } + + @Test() + public async shouldBeAbleToListTheReplContext({ assert }: Context) { + Mock.when(process.stdout, 'write').return(undefined) + Ls.action.bind({ + context: { + ...this.nodeContext, + ...this.athennaContext + }, + displayPrompt: Mock.fake(), + clearBufferedCommand: Mock.fake() + })() + + assert.calledWith(process.stdout.write, `${Color.green.bold('\nFROM NODE:')}\n\n${this.nodeInternals.join('\n')}\n`) + assert.calledWith( + process.stdout.write, + `${Color.purple.bold('\nFROM ATHENNA:')}\n\n${this.athennaInternals.join('\n')}\n` + ) + } + + @Test() + public async shouldBeAbleToHideFromListVariablesThatStartWith__({ assert }: Context) { + Mock.when(process.stdout, 'write').return(undefined) + Ls.action.bind({ + context: { + __hello: 'world', // Will not be listed + ...this.nodeContext, + ...this.athennaContext + }, + displayPrompt: Mock.fake(), + clearBufferedCommand: Mock.fake() + })() + + assert.calledWith(process.stdout.write, `${Color.green.bold('\nFROM NODE:')}\n\n${this.nodeInternals.join('\n')}\n`) + assert.calledWith( + process.stdout.write, + `${Color.purple.bold('\nFROM ATHENNA:')}\n\n${this.athennaInternals.join('\n')}\n` + ) + } + + @Test() + public async shouldNotShowNodeInternalsIfTheyAreNotInReplContext({ assert }: Context) { + Mock.when(process.stdout, 'write').return(undefined) + Ls.action.bind({ + context: { + ...this.athennaContext + }, + displayPrompt: Mock.fake(), + clearBufferedCommand: Mock.fake() + })() + + assert.notCalledWith( + process.stdout.write, + `${Color.green.bold('\nFROM NODE:')}\n\n${this.nodeInternals.join('\n')}\n` + ) + assert.calledWith( + process.stdout.write, + `${Color.purple.bold('\nFROM ATHENNA:')}\n\n${this.athennaInternals.join('\n')}\n` + ) + } + + @Test() + public async shouldNotShowAthennaInternalsIfTheyAreNotInReplContext({ assert }: Context) { + Mock.when(process.stdout, 'write').return(undefined) + Ls.action.bind({ + context: { + ...this.nodeContext + }, + displayPrompt: Mock.fake(), + clearBufferedCommand: Mock.fake() + })() + + assert.calledWith(process.stdout.write, `${Color.green.bold('\nFROM NODE:')}\n\n${this.nodeInternals.join('\n')}\n`) + assert.notCalledWith( + process.stdout.write, + `${Color.purple.bold('\nFROM ATHENNA:')}\n\n${this.athennaInternals.join('\n')}\n` + ) + } + + @Test() + public async shouldReturnTheCommandSignature({ assert }: Context) { + assert.deepEqual(Ls.signature(), 'ls') + } + + @Test() + public async shouldReturnTheCommandHelp({ assert }: Context) { + assert.deepEqual( + Ls.help(), + 'List all Athenna preloaded methods/properties in REPL context and some of the Node.js globals.' + ) + } + + private nodeInternals = [ + Color.yellow(' - global'), + Color.yellow(' - queueMicrotask'), + Color.yellow(' - clearImmediate'), + Color.yellow(' - setImmediate'), + Color.yellow(' - structuredClone'), + Color.yellow(' - clearInterval'), + Color.yellow(' - clearTimeout'), + Color.yellow(' - setInterval'), + Color.yellow(' - setTimeout'), + Color.yellow(' - atob'), + Color.yellow(' - btoa'), + Color.yellow(' - performance'), + Color.yellow(' - fetch') + ] + + private athennaInternals = [ + Color.yellow(' - Path'), + Color.yellow(' - ioc'), + Color.yellow(' - container'), + Color.yellow(' - Env'), + Color.yellow(' - Config') + ] + + private nodeContext = { + global: '', + queueMicrotask: '', + clearImmediate: '', + setImmediate: '', + structuredClone: '', + clearInterval: '', + clearTimeout: '', + setInterval: '', + setTimeout: '', + atob: '', + btoa: '', + performance: '', + fetch: '' + } + + private athennaContext = { + Path: '', + ioc: '', + container: '', + Env: '', + Config: '' + } +} diff --git a/tests/unit/repl/ui/LoggerTest.ts b/tests/unit/repl/ui/LoggerTest.ts new file mode 100644 index 0000000..13832cc --- /dev/null +++ b/tests/unit/repl/ui/LoggerTest.ts @@ -0,0 +1,66 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +import { Logger } from '#src/repl/ui/Logger' +import { Color } from '@athenna/common' +import { Test, type Context, Mock, AfterEach, BeforeEach } from '@athenna/test' + +export default class LoggerTest { + @BeforeEach() + public async beforeEach() { + Mock.when(process.stdout, 'write').return(undefined) + } + + @AfterEach() + public async afterEach() { + Mock.restoreAll() + } + + @Test() + public async shouldBeAbleToWriteVanillaLogs({ assert }: Context) { + Logger.write('Hello World') + + assert.calledWith(process.stdout.write, 'Hello World\n') + } + + @Test() + public async shouldBeAbleToWriteRedLogs({ assert }: Context) { + Logger.red('Hello World') + + assert.calledWith(process.stdout.write, Color.red('Hello World') + '\n') + } + + @Test() + public async shouldBeAbleToWriteGrayLogs({ assert }: Context) { + Logger.gray('Hello World') + + assert.calledWith(process.stdout.write, Color.gray('Hello World') + '\n') + } + + @Test() + public async shouldBeAbleToWriteGreenLogs({ assert }: Context) { + Logger.green('Hello World') + + assert.calledWith(process.stdout.write, Color.green('Hello World') + '\n') + } + + @Test() + public async shouldBeAbleToWritePurpleLogs({ assert }: Context) { + Logger.purple('Hello World') + + assert.calledWith(process.stdout.write, Color.purple('Hello World') + '\n') + } + + @Test() + public async shouldBeAbleToWriteYellowLogs({ assert }: Context) { + Logger.yellow('Hello World') + + assert.calledWith(process.stdout.write, Color.yellow('Hello World') + '\n') + } +} diff --git a/tests/unit/testing/BaseCliTest.ts b/tests/unit/testing/BaseCliTest.ts deleted file mode 100644 index 89fc1ba..0000000 --- a/tests/unit/testing/BaseCliTest.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { ArtisanProvider } from '@athenna/artisan' -import { Test, type Context } from '@athenna/test' -import { BaseCliTest as InternalBaseCliTest } from '@athenna/core/testing/BaseCliTest' - -export default class BaseCliTest extends InternalBaseCliTest { - public artisanPath = Path.bin('artisan.ts') - - @Test() - public async shouldBeAbleToRunTestsExtendingBaseCliTestClass({ command }: Context) { - new ArtisanProvider().register() - const output = await command.run('greet lenon') - - output.assertSucceeded() - output.assertLogged('HELLO LENON!') - } -} diff --git a/tests/unit/testing/BaseCliTestTest.ts b/tests/unit/testing/BaseCliTestTest.ts new file mode 100644 index 0000000..01b72a1 --- /dev/null +++ b/tests/unit/testing/BaseCliTestTest.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +export default class BaseCliTestTest {} diff --git a/tests/unit/testing/BaseRestTest.ts b/tests/unit/testing/BaseRestTest.ts deleted file mode 100644 index aeaf4d9..0000000 --- a/tests/unit/testing/BaseRestTest.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Test, type Context } from '@athenna/test' -import { BaseRestTest as InternalBaseRestTest } from '@athenna/core/testing/BaseRestTest' -import type { HttpOptions } from '#src/index' - -export default class BaseRestTest extends InternalBaseRestTest { - public restOptions: HttpOptions = { - routePath: Path.fixtures('routes/http.ts') - } - - @Test() - public async shouldBeAbleToRunTestsExtendingBaseRestTestClass({ request }: Context) { - const response = await request.get('/hello') - - response.assertStatusCode(200) - response.assertBodyContains({ ok: true }) - } -} diff --git a/tests/unit/testing/BaseRestTestTest.ts b/tests/unit/testing/BaseRestTestTest.ts new file mode 100644 index 0000000..39a577b --- /dev/null +++ b/tests/unit/testing/BaseRestTestTest.ts @@ -0,0 +1,10 @@ +/** + * @athenna/core + * + * (c) João Lenon + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +export default class BaseRestTestTest {} diff --git a/tsconfig.json b/tsconfig.json index 5a20cac..14f70e0 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,33 +1,4 @@ { - "ts-node": { - "esm": true, - "transpileOnly": true, - "ignoreDiagnostics": [5104] - }, - "compilerOptions": { - "strict": false, - "rootDir": ".", - "baseUrl": ".", - "outDir": "build", - "module": "NodeNext", - "target": "ESNext", - "moduleResolution": "NodeNext", - "declaration": true, - "skipLibCheck": true, - "esModuleInterop": true, - "removeComments": false, - "resolveJsonModule": true, - "experimentalDecorators": true, - "useDefineForClassFields": false, - "verbatimModuleSyntax": true, - "forceConsistentCasingInFileNames": true, - "paths": { - "#bin/*": ["./bin/*.ts"], - "#src/*": ["./src/*.ts"], - "#tests/*": ["./tests/*.ts"], - "#src/types": ["./src/types/index.ts"] - } - }, - "include": ["./**/*"], - "exclude": ["build", "node_modules"] + "extends": "@athenna/tsconfig/tsconfig.lib.json", + "compilerOptions": {} }