From c7b2573085901b33838d97003f0b64b2f158cb72 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 13:36:24 +0200 Subject: [PATCH 01/28] feat: use proto to fix binary version od Node.js and pnpm --- .nvmrc | 1 - .prototools | 2 ++ 2 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 .nvmrc create mode 100644 .prototools diff --git a/.nvmrc b/.nvmrc deleted file mode 100644 index 3c032078..00000000 --- a/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -18 diff --git a/.prototools b/.prototools new file mode 100644 index 00000000..c1ce5882 --- /dev/null +++ b/.prototools @@ -0,0 +1,2 @@ +node = "~18" +pnpm = "~8" From fb7354e44420ae9f58ae4eff496f07e80d44d66a Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 13:38:14 +0200 Subject: [PATCH 02/28] feat: add moon plugin --- .prototools | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.prototools b/.prototools index c1ce5882..8f345679 100644 --- a/.prototools +++ b/.prototools @@ -1,2 +1,6 @@ node = "~18" pnpm = "~8" +moon = "~1.25" + +[plugins] +moon = "source:https://raw.githubusercontent.com/moonrepo/moon/master/proto-plugin.toml" From 71a1ba4628cb111e1be76a9b714caf4ce5bd59a2 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 13:55:02 +0200 Subject: [PATCH 03/28] feat: add workspace and projects metadata --- .gitignore | 5 ++++- .moon/workspace.yml | 32 ++++++++++++++++++++++++++++++++ modules/api/moon.yml | 13 +++++++++++++ modules/cli/moon.yml | 11 +++++++++++ modules/common/moon.yml | 6 ++++++ modules/greenit/moon.yml | 13 +++++++++++++ modules/lighthouse/moon.yml | 13 +++++++++++++ modules/mysql/moon.yml | 13 +++++++++++++ modules/observatory/moon.yml | 13 +++++++++++++ modules/slack/moon.yml | 13 +++++++++++++ modules/ssllabs-server/moon.yml | 13 +++++++++++++ 11 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 .moon/workspace.yml create mode 100644 modules/api/moon.yml create mode 100644 modules/cli/moon.yml create mode 100644 modules/common/moon.yml create mode 100644 modules/greenit/moon.yml create mode 100644 modules/lighthouse/moon.yml create mode 100644 modules/mysql/moon.yml create mode 100644 modules/observatory/moon.yml create mode 100644 modules/slack/moon.yml create mode 100644 modules/ssllabs-server/moon.yml diff --git a/.gitignore b/.gitignore index 4e787e83..61f5f951 100644 --- a/.gitignore +++ b/.gitignore @@ -33,4 +33,7 @@ common/autoinstallers/*/.npmrc # MikroORM temporary directory modules/*/temp -test/temp \ No newline at end of file +test/temp +# moon +.moon/cache +.moon/docker diff --git a/.moon/workspace.yml b/.moon/workspace.yml new file mode 100644 index 00000000..b1e443cb --- /dev/null +++ b/.moon/workspace.yml @@ -0,0 +1,32 @@ +# https://moonrepo.dev/docs/config/workspace +$schema: 'https://moonrepo.dev/schemas/workspace.json' + +# Require a specific version of moon while running commands, otherwise fail. +# versionConstraint: '>=1.0.0' + +# Extend and inherit an external configuration file. Must be a valid HTTPS URL or file system path. +# extends: './shared/workspace.yml' + +# REQUIRED: A map of all projects found within the workspace, or a list or file system globs. +# When using a map, each entry requires a unique project ID as the map key, and a file system +# path to the project folder as the map value. File paths are relative from the workspace root, +# and cannot reference projects located outside the workspace boundary. +projects: + - 'modules/*' + +# Configures the version control system to utilize within the workspace. A VCS +# is required for determining touched (added, modified, etc) files, calculating file hashes, +# computing affected files, and much more. +vcs: + # The client to use when managing the repository. + # Accepts "git". Defaults to "git". + manager: 'git' + + # The default branch (master/main/trunk) in the repository for comparing the + # local branch against. For git, this is is typically "master" or "main", + # and must include the remote prefix (before /). + defaultBranch: 'main' + + provider: github + + syncHooks: true diff --git a/modules/api/moon.yml b/modules/api/moon.yml new file mode 100644 index 00000000..0e2d822e --- /dev/null +++ b/modules/api/moon.yml @@ -0,0 +1,13 @@ +dependsOn: + - id: 'common' + scope: 'production' + - id: 'cli' + scope: 'peer' +language: typescript +project: + name: Heart REST API + description: Exposes an HTTP REST API that starts an analysis when it is requested +stack: backend +tags: + - runner +type: application \ No newline at end of file diff --git a/modules/cli/moon.yml b/modules/cli/moon.yml new file mode 100644 index 00000000..0a6d9180 --- /dev/null +++ b/modules/cli/moon.yml @@ -0,0 +1,11 @@ +dependsOn: + - id: 'common' + scope: 'production' +language: typescript +project: + name: Heart CLI + description: Starts an analysis by using a CLI +stack: backend +tags: + - runner +type: tool \ No newline at end of file diff --git a/modules/common/moon.yml b/modules/common/moon.yml new file mode 100644 index 00000000..e35d35a7 --- /dev/null +++ b/modules/common/moon.yml @@ -0,0 +1,6 @@ +language: typescript +project: + name: Heart Common + description: Centralize components needed by every other packages +stack: backend +type: library \ No newline at end of file diff --git a/modules/greenit/moon.yml b/modules/greenit/moon.yml new file mode 100644 index 00000000..a5ac651d --- /dev/null +++ b/modules/greenit/moon.yml @@ -0,0 +1,13 @@ +dependsOn: + - id: 'common' + scope: 'production' + - id: 'cli' + scope: 'peer' +language: typescript +project: + name: Heart GreenIT + description: Analyses URLs with GreenIT Analysis +stack: backend +tags: + - analysis +type: application diff --git a/modules/lighthouse/moon.yml b/modules/lighthouse/moon.yml new file mode 100644 index 00000000..69d64044 --- /dev/null +++ b/modules/lighthouse/moon.yml @@ -0,0 +1,13 @@ +dependsOn: + - id: 'common' + scope: 'production' + - id: 'cli' + scope: 'peer' +language: typescript +project: + name: Heart Lighthouse + description: Analyses URLs with Google Lighthouse +stack: backend +tags: + - analysis +type: application \ No newline at end of file diff --git a/modules/mysql/moon.yml b/modules/mysql/moon.yml new file mode 100644 index 00000000..90ee35f9 --- /dev/null +++ b/modules/mysql/moon.yml @@ -0,0 +1,13 @@ +dependsOn: + - id: 'common' + scope: 'production' + - id: 'cli' + scope: 'peer' +language: typescript +project: + name: Heart MySQL + description: Store the results of analysis into a MySQL database +stack: backend +tags: + - listener +type: application diff --git a/modules/observatory/moon.yml b/modules/observatory/moon.yml new file mode 100644 index 00000000..96177174 --- /dev/null +++ b/modules/observatory/moon.yml @@ -0,0 +1,13 @@ +dependsOn: + - id: 'common' + scope: 'production' + - id: 'cli' + scope: 'peer' +language: typescript +project: + name: Heart Observatory + description: Analyses URLs with Mozilla Observatory +stack: backend +tags: + - analysis +type: application diff --git a/modules/slack/moon.yml b/modules/slack/moon.yml new file mode 100644 index 00000000..209ed187 --- /dev/null +++ b/modules/slack/moon.yml @@ -0,0 +1,13 @@ +dependsOn: + - id: 'common' + scope: 'production' + - id: 'cli' + scope: 'peer' +language: typescript +project: + name: Heart Slack + description: Send the analysis results into a Slack channel +stack: backend +tags: + - listener +type: application diff --git a/modules/ssllabs-server/moon.yml b/modules/ssllabs-server/moon.yml new file mode 100644 index 00000000..31c45202 --- /dev/null +++ b/modules/ssllabs-server/moon.yml @@ -0,0 +1,13 @@ +dependsOn: + - id: 'common' + scope: 'production' + - id: 'cli' + scope: 'peer' +language: typescript +project: + name: Heart SSLLabs Server + description: Analyses URLs with Qualys SSL Labs server +stack: backend +tags: + - analysis +type: application From 68355a1e3b3f69df85cbee062a78fc5760dde02c Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 14:44:04 +0200 Subject: [PATCH 04/28] fix: do not take into account abandoned packages --- .moon/workspace.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.moon/workspace.yml b/.moon/workspace.yml index b1e443cb..9324cc8b 100644 --- a/.moon/workspace.yml +++ b/.moon/workspace.yml @@ -12,7 +12,7 @@ $schema: 'https://moonrepo.dev/schemas/workspace.json' # path to the project folder as the map value. File paths are relative from the workspace root, # and cannot reference projects located outside the workspace boundary. projects: - - 'modules/*' + - 'modules/*/moon.yml' # Configures the version control system to utilize within the workspace. A VCS # is required for determining touched (added, modified, etc) files, calculating file hashes, From 22da8ab80f327afdccca3b4fb5087cf045fed2f5 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 14:44:13 +0200 Subject: [PATCH 05/28] feat: setup the toolchain --- .moon/toolchain.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .moon/toolchain.yml diff --git a/.moon/toolchain.yml b/.moon/toolchain.yml new file mode 100644 index 00000000..f579d014 --- /dev/null +++ b/.moon/toolchain.yml @@ -0,0 +1,3 @@ +$schema: 'https://moonrepo.dev/schemas/toolchain.json' + +node: {} \ No newline at end of file From f7384299b2b4177a3527533978f91c1e380a62d9 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 18:10:09 +0200 Subject: [PATCH 06/28] feat: define pnpm workspace --- pnpm-lock.yaml | 6861 +++++++++++++++++++++++++++++++++++++++++++ pnpm-workspace.yaml | 2 + 2 files changed, 6863 insertions(+) create mode 100644 pnpm-lock.yaml create mode 100644 pnpm-workspace.yaml diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 00000000..f0a5b3f4 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6861 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + modules/api: + dependencies: + '@fabernovel/heart-cli': + specifier: ^4.0.0 + version: link:../cli + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + '@fastify/cors': + specifier: ^8.5.0 + version: 8.5.0 + ajv: + specifier: ^8.12.0 + version: 8.14.0 + ajv-errors: + specifier: ^3.0.0 + version: 3.0.0(ajv@8.14.0) + fastify: + specifier: ^4.25.2 + version: 4.27.0 + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/express': + specifier: ^4.17.21 + version: 4.17.21 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/cli: + dependencies: + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + ajv: + specifier: ^8.12.0 + version: 8.14.0 + ajv-errors: + specifier: ^3.0.0 + version: 3.0.0(ajv@8.14.0) + ajv-formats: + specifier: ^2.1.1 + version: 2.1.1(ajv@8.14.0) + commander: + specifier: ^11.1.0 + version: 11.1.0 + dotenv: + specifier: ^16.3.1 + version: 16.4.5 + ora: + specifier: ^8.0.1 + version: 8.0.1 + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@fastify/cors': + specifier: ^8.5.0 + version: 8.5.0 + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + fastify: + specifier: ^4.25.2 + version: 4.27.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + type-fest: + specifier: ^4.9.0 + version: 4.18.3 + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/common: + dependencies: + '@mikro-orm/core': + specifier: ^5.9.7 + version: 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) + '@mikro-orm/reflection': + specifier: ^5.9.7 + version: 5.9.8(@mikro-orm/core@5.9.8) + ajv: + specifier: ^8.12.0 + version: 8.14.0 + ajv-errors: + specifier: ^3.0.0 + version: 3.0.0(ajv@8.14.0) + pino: + specifier: ^8.17.2 + version: 8.21.0 + pino-pretty: + specifier: ^10.3.1 + version: 10.3.1 + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@fastify/cors': + specifier: ^8.5.0 + version: 8.5.0 + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/har-format': + specifier: ^1.2.15 + version: 1.2.15 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + fastify: + specifier: ^4.25.2 + version: 4.27.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + lighthouse: + specifier: ^11.4.0 + version: 11.7.1 + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + type-fest: + specifier: ^4.9.0 + version: 4.18.3 + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/greenit: + dependencies: + '@fabernovel/heart-cli': + specifier: ^4.0.0 + version: link:../cli + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + greenit-cli: + specifier: github:cnumr/GreenIT-Analysis-cli#a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571 + version: github.com/cnumr/GreenIT-Analysis-cli/a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571 + puppeteer: + specifier: ^21.7.0 + version: 21.11.0(typescript@5.4.5) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/lighthouse: + dependencies: + '@fabernovel/heart-cli': + specifier: ^4.0.0 + version: link:../cli + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + lighthouse: + specifier: ^11.4.0 + version: 11.7.1 + puppeteer: + specifier: ^21.7.0 + version: 21.11.0(typescript@5.4.5) + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/mysql: + dependencies: + '@fabernovel/heart-cli': + specifier: ^4.0.0 + version: link:../cli + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + '@mikro-orm/core': + specifier: ^5.9.7 + version: 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) + '@mikro-orm/migrations': + specifier: ^5.9.7 + version: 5.9.8(@mikro-orm/core@5.9.8)(@types/node@18.19.33) + '@mikro-orm/mysql': + specifier: ^5.9.7 + version: 5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8) + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@mikro-orm/cli': + specifier: ^5.9.7 + version: 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + ts-node: + specifier: ^10.9.1 + version: 10.9.2(@types/node@18.19.33)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/observatory: + dependencies: + '@fabernovel/heart-cli': + specifier: ^4.0.0 + version: link:../cli + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/slack: + dependencies: + '@fabernovel/heart-cli': + specifier: ^4.0.0 + version: link:../cli + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + '@slack/web-api': + specifier: ^6.11.2 + version: 6.12.0 + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/ssllabs-server: + dependencies: + '@fabernovel/heart-cli': + specifier: ^4.0.0 + version: link:../cli + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + + modules/tpl: + dependencies: + '@fabernovel/heart-cli': + specifier: ^4.0.0 + version: link:../cli + '@fabernovel/heart-common': + specifier: workspace:^4.0.0 + version: link:../common + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.57.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@types/node': + specifier: ^18.19.6 + version: 18.19.33 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) + eslint: + specifier: ^8.56.0 + version: 8.57.0 + jest: + specifier: ^29.7.0 + version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + rimraf: + specifier: ^5.0.5 + version: 5.0.7 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + +packages: + + /@ampproject/remapping@2.3.0: + resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@babel/code-frame@7.24.6: + resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.6 + picocolors: 1.0.1 + + /@babel/compat-data@7.24.6: + resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.24.6: + resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.3.0 + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-compilation-targets': 7.24.6 + '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) + '@babel/helpers': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/template': 7.24.6 + '@babel/traverse': 7.24.6 + '@babel/types': 7.24.6 + convert-source-map: 2.0.0 + debug: 4.3.5 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.24.6: + resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.24.6: + resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.6 + '@babel/helper-validator-option': 7.24.6 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.24.6: + resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.24.6: + resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + dev: true + + /@babel/helper-hoist-variables@7.24.6: + resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + dev: true + + /@babel/helper-module-imports@7.24.6: + resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + dev: true + + /@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6): + resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-module-imports': 7.24.6 + '@babel/helper-simple-access': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + dev: true + + /@babel/helper-plugin-utils@7.24.6: + resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.24.6: + resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + dev: true + + /@babel/helper-split-export-declaration@7.24.6: + resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.6 + dev: true + + /@babel/helper-string-parser@7.24.6: + resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.24.6: + resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.24.6: + resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.24.6: + resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + dev: true + + /@babel/highlight@7.24.6: + resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.24.6 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + + /@babel/parser@7.24.6: + resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.6 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.6): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.6): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.6): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.6): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.6): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6): + resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.6): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.6): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.6): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.6): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.6): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.6): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.6): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6): + resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.6 + '@babel/helper-plugin-utils': 7.24.6 + dev: true + + /@babel/runtime@7.24.6: + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} + engines: {node: '>=6.9.0'} + dependencies: + regenerator-runtime: 0.14.1 + dev: false + + /@babel/template@7.24.6: + resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + dev: true + + /@babel/traverse@7.24.6: + resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/helper-environment-visitor': 7.24.6 + '@babel/helper-function-name': 7.24.6 + '@babel/helper-hoist-variables': 7.24.6 + '@babel/helper-split-export-declaration': 7.24.6 + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + debug: 4.3.5 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.24.6: + resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.24.6 + '@babel/helper-validator-identifier': 7.24.6 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@ecocode/eslint-plugin@1.5.0(eslint@8.57.0): + resolution: {integrity: sha512-q2WBsKw4C/z1mS0lACAkkxPKfTjEj0PbGeFk58bYZW4Bs2A/VHf5epmQOmx9QrPBm6xWY49goH7MZRTfaNqT7w==} + engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} + peerDependencies: + eslint: '>=7' + dependencies: + eslint: 8.57.0 + dev: true + + /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.57.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.10.0: + resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.4: + resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.5 + espree: 9.6.1 + globals: 13.24.0 + ignore: 5.3.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.57.0: + resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@fast-csv/format@4.3.5: + resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.isboolean: 3.0.3 + lodash.isequal: 4.5.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + dev: false + + /@fast-csv/parse@4.3.6: + resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} + dependencies: + '@types/node': 14.18.63 + lodash.escaperegexp: 4.1.2 + lodash.groupby: 4.6.0 + lodash.isfunction: 3.0.9 + lodash.isnil: 4.0.0 + lodash.isundefined: 3.0.1 + lodash.uniq: 4.5.0 + dev: false + + /@fastify/ajv-compiler@3.5.0: + resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} + dependencies: + ajv: 8.14.0 + ajv-formats: 2.1.1(ajv@8.14.0) + fast-uri: 2.3.0 + + /@fastify/cors@8.5.0: + resolution: {integrity: sha512-/oZ1QSb02XjP0IK1U0IXktEsw/dUBTxJOW7IpIeO8c/tNalw/KjoNSJv1Sf6eqoBPO+TDGkifq6ynFK3v68HFQ==} + dependencies: + fastify-plugin: 4.5.1 + mnemonist: 0.39.6 + + /@fastify/error@3.4.1: + resolution: {integrity: sha512-wWSvph+29GR783IhmvdwWnN4bUxTD01Vm5Xad4i7i1VuAOItLvbPAb69sb0IQ2N57yprvhNIwAP5B6xfKTmjmQ==} + + /@fastify/fast-json-stringify-compiler@4.3.0: + resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} + dependencies: + fast-json-stringify: 5.16.0 + + /@fastify/merge-json-schemas@0.1.1: + resolution: {integrity: sha512-fERDVz7topgNjtXsJTTW1JKLy0rhuLRcquYqNR9rF7OcVpCa2OVW49ZPDIhaRRCaUuvVxI+N416xUoF76HNSXA==} + dependencies: + fast-deep-equal: 3.1.3 + + /@formatjs/ecma402-abstract@2.0.0: + resolution: {integrity: sha512-rRqXOqdFmk7RYvj4khklyqzcfQl9vEL/usogncBHRZfZBDOwMGuSRNFl02fu5KGHXdbinju+YXyuR+Nk8xlr/g==} + dependencies: + '@formatjs/intl-localematcher': 0.5.4 + tslib: 2.6.2 + + /@formatjs/fast-memoize@2.2.0: + resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} + dependencies: + tslib: 2.6.2 + + /@formatjs/icu-messageformat-parser@2.7.8: + resolution: {integrity: sha512-nBZJYmhpcSX0WeJ5SDYUkZ42AgR3xiyhNCsQweFx3cz/ULJjym8bHAzWKvG5e2+1XO98dBYC0fWeeAECAVSwLA==} + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/icu-skeleton-parser': 1.8.2 + tslib: 2.6.2 + + /@formatjs/icu-skeleton-parser@1.8.2: + resolution: {integrity: sha512-k4ERKgw7aKGWJZgTarIcNEmvyTVD9FYh0mTrrBMHZ1b8hUu6iOJ4SzsZlo3UNAvHYa+PnvntIwRPt1/vy4nA9Q==} + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + tslib: 2.6.2 + + /@formatjs/intl-localematcher@0.5.4: + resolution: {integrity: sha512-zTwEpWOzZ2CiKcB93BLngUX59hQkuZjT2+SAQEscSm52peDW/getsawMcWF1rGRpMCX6D7nSJA3CzJ8gn13N/g==} + dependencies: + tslib: 2.6.2 + + /@humanwhocodes/config-array@0.11.14: + resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 2.0.3 + debug: 4.3.5 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@2.0.3: + resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} + dev: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jercle/yargonaut@1.1.5: + resolution: {integrity: sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==} + dependencies: + chalk: 4.1.2 + figlet: 1.7.0 + parent-require: 1.0.0 + dev: true + + /@jest/console@29.7.0: + resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + chalk: 4.1.2 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/core@29.7.0(ts-node@10.9.2): + resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 29.7.0 + '@jest/reporters': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + ci-info: 3.9.0 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 29.7.0 + jest-config: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-resolve-dependencies: 29.7.0 + jest-runner: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + jest-watcher: 29.7.0 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /@jest/environment@29.7.0: + resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + jest-mock: 29.7.0 + dev: true + + /@jest/expect-utils@29.7.0: + resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + dev: true + + /@jest/expect@29.7.0: + resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + expect: 29.7.0 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/fake-timers@29.7.0: + resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@sinonjs/fake-timers': 10.3.0 + '@types/node': 18.19.33 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /@jest/globals@29.7.0: + resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/types': 29.6.3 + jest-mock: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/reporters@29.7.0: + resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + '@types/node': 18.19.33 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.2 + istanbul-lib-instrument: 6.0.2 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.7 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + jest-worker: 29.7.0 + slash: 3.0.0 + string-length: 4.0.2 + strip-ansi: 6.0.1 + v8-to-istanbul: 9.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/schemas@29.6.3: + resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@sinclair/typebox': 0.27.8 + dev: true + + /@jest/source-map@29.6.3: + resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + callsites: 3.1.0 + graceful-fs: 4.2.11 + dev: true + + /@jest/test-result@29.7.0: + resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/types': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@29.7.0: + resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + slash: 3.0.0 + dev: true + + /@jest/transform@29.7.0: + resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.24.6 + '@jest/types': 29.6.3 + '@jridgewell/trace-mapping': 0.3.25 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 2.0.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + micromatch: 4.0.7 + pirates: 4.0.6 + slash: 3.0.0 + write-file-atomic: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@29.6.3: + resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + '@types/istanbul-lib-coverage': 2.0.6 + '@types/istanbul-reports': 3.0.4 + '@types/node': 18.19.33 + '@types/yargs': 17.0.32 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: true + + /@jridgewell/resolve-uri@3.1.2: + resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: true + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: true + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@mikro-orm/cli@5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8): + resolution: {integrity: sha512-v3KHddyrovHiPz31mfa44GjnOYH2CuEZLiyWo8G/Wy0WP87EuDv5eEGuHJ9GAfd9jvOD4Cy8l56tu/bg/0YGGA==} + engines: {node: '>= 14.0.0'} + hasBin: true + peerDependencies: + '@mikro-orm/better-sqlite': ^5.0.0 + '@mikro-orm/entity-generator': ^5.0.0 + '@mikro-orm/mariadb': ^5.0.0 + '@mikro-orm/migrations': ^5.0.0 + '@mikro-orm/migrations-mongodb': ^5.0.0 + '@mikro-orm/mongodb': ^5.0.0 + '@mikro-orm/mysql': ^5.0.0 + '@mikro-orm/postgresql': ^5.0.0 + '@mikro-orm/seeder': ^5.0.0 + '@mikro-orm/sqlite': ^5.0.0 + peerDependenciesMeta: + '@mikro-orm/better-sqlite': + optional: true + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/mariadb': + optional: true + '@mikro-orm/migrations': + optional: true + '@mikro-orm/migrations-mongodb': + optional: true + '@mikro-orm/mongodb': + optional: true + '@mikro-orm/mysql': + optional: true + '@mikro-orm/postgresql': + optional: true + '@mikro-orm/seeder': + optional: true + '@mikro-orm/sqlite': + optional: true + dependencies: + '@jercle/yargonaut': 1.1.5 + '@mikro-orm/core': 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) + '@mikro-orm/knex': 5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8)(mysql2@3.6.2) + '@mikro-orm/migrations': 5.9.8(@mikro-orm/core@5.9.8)(@types/node@18.19.33) + '@mikro-orm/mysql': 5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8) + fs-extra: 11.1.1 + tsconfig-paths: 4.2.0 + yargs: 17.7.2 + transitivePeerDependencies: + - better-sqlite3 + - mssql + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + dev: true + + /@mikro-orm/core@5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8): + resolution: {integrity: sha512-bfTYInwc+EtPgLOxa5iBG5vKT1qq5swDcsc2F7Iu6sesBLKNputURA7qPmY6TCWQtSL/hvB3QjsCzY48LllD+w==} + engines: {node: '>= 14.0.0'} + peerDependencies: + '@mikro-orm/better-sqlite': ^5.0.0 + '@mikro-orm/entity-generator': ^5.0.0 + '@mikro-orm/mariadb': ^5.0.0 + '@mikro-orm/migrations': ^5.0.0 + '@mikro-orm/migrations-mongodb': ^5.0.0 + '@mikro-orm/mongodb': ^5.0.0 + '@mikro-orm/mysql': ^5.0.0 + '@mikro-orm/postgresql': ^5.0.0 + '@mikro-orm/seeder': ^5.0.0 + '@mikro-orm/sqlite': ^5.0.0 + peerDependenciesMeta: + '@mikro-orm/better-sqlite': + optional: true + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/mariadb': + optional: true + '@mikro-orm/migrations': + optional: true + '@mikro-orm/migrations-mongodb': + optional: true + '@mikro-orm/mongodb': + optional: true + '@mikro-orm/mysql': + optional: true + '@mikro-orm/postgresql': + optional: true + '@mikro-orm/seeder': + optional: true + '@mikro-orm/sqlite': + optional: true + dependencies: + '@mikro-orm/migrations': 5.9.8(@mikro-orm/core@5.9.8)(@types/node@18.19.33) + '@mikro-orm/mysql': 5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8) + acorn-loose: 8.3.0 + acorn-walk: 8.2.0 + dotenv: 16.3.1 + fs-extra: 11.1.1 + globby: 11.1.0 + mikro-orm: 5.9.8 + reflect-metadata: 0.1.13 + + /@mikro-orm/knex@5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8)(mysql2@3.6.2): + resolution: {integrity: sha512-Kitz11QY7Id37huNUfsxSkgnET8X/fuL861yUK9rJ8xrRiEakdm1r/lM1pLYcB/oikAphYLTgW+M/t3LoJb8aw==} + engines: {node: '>= 14.0.0'} + peerDependencies: + '@mikro-orm/core': ^5.0.0 + '@mikro-orm/entity-generator': ^5.0.0 + '@mikro-orm/migrations': ^5.0.0 + better-sqlite3: '*' + mssql: '*' + mysql: '*' + mysql2: '*' + pg: '*' + sqlite3: '*' + peerDependenciesMeta: + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/migrations': + optional: true + better-sqlite3: + optional: true + mssql: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + sqlite3: + optional: true + dependencies: + '@mikro-orm/core': 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) + '@mikro-orm/migrations': 5.9.8(@mikro-orm/core@5.9.8)(@types/node@18.19.33) + fs-extra: 11.1.1 + knex: 2.5.1(mysql2@3.6.2) + mysql2: 3.6.2 + sqlstring: 2.3.3 + transitivePeerDependencies: + - pg-native + - supports-color + - tedious + + /@mikro-orm/migrations@5.9.8(@mikro-orm/core@5.9.8)(@types/node@18.19.33): + resolution: {integrity: sha512-D4s2Hd8TFLimddftC/El4Vtiq6AcGG/lc7+LUHieVzkAfdvcddxnxYQ3q1qH7IxqdDWNcZr0dYPxqLvgFhYqqg==} + engines: {node: '>= 14.0.0'} + peerDependencies: + '@mikro-orm/core': ^5.0.0 + dependencies: + '@mikro-orm/core': 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) + '@mikro-orm/knex': 5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8)(mysql2@3.6.2) + fs-extra: 11.1.1 + knex: 2.5.1(mysql2@3.6.2) + umzug: 3.3.1(@types/node@18.19.33) + transitivePeerDependencies: + - '@mikro-orm/entity-generator' + - '@types/node' + - better-sqlite3 + - mssql + - mysql + - mysql2 + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + + /@mikro-orm/mysql@5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8): + resolution: {integrity: sha512-BvW3b2+oKVE5sm0DLPXDKudIDsTNANXqETfNJO7mMmgnD9t0A8ihVTSI4BS5XBkBDh0wy+wdB6KhYDDfRo+zew==} + engines: {node: '>= 14.0.0'} + peerDependencies: + '@mikro-orm/core': ^5.0.0 + '@mikro-orm/entity-generator': ^5.0.0 + '@mikro-orm/migrations': ^5.0.0 + '@mikro-orm/seeder': ^5.0.0 + peerDependenciesMeta: + '@mikro-orm/entity-generator': + optional: true + '@mikro-orm/migrations': + optional: true + '@mikro-orm/seeder': + optional: true + dependencies: + '@mikro-orm/core': 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) + '@mikro-orm/knex': 5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8)(mysql2@3.6.2) + '@mikro-orm/migrations': 5.9.8(@mikro-orm/core@5.9.8)(@types/node@18.19.33) + mysql2: 3.6.2 + transitivePeerDependencies: + - better-sqlite3 + - mssql + - mysql + - pg + - pg-native + - sqlite3 + - supports-color + - tedious + + /@mikro-orm/reflection@5.9.8(@mikro-orm/core@5.9.8): + resolution: {integrity: sha512-4tQW0rm42r/gBP11xADStQa8u3OwEGrRaoWI3DjjWszLKMiidA9OIvRRn8sQEbTMjG04kuXDjIE6PNxA+xRwAg==} + engines: {node: '>= 14.0.0'} + peerDependencies: + '@mikro-orm/core': ^5.0.0 + dependencies: + '@mikro-orm/core': 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) + globby: 11.1.0 + ts-morph: 20.0.0 + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.17.1 + + /@paulirish/trace_engine@0.0.19: + resolution: {integrity: sha512-3tjEzXBBtU83DkCJAdU2UwBBunspiwTCn+Y5jOxm592cfEuLr/T7Lcn+QhRerVqkSik2mnjN4X6NgHZjI9Biwg==} + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + optional: true + + /@puppeteer/browsers@1.9.1: + resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} + engines: {node: '>=16.3.0'} + hasBin: true + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.3.1 + tar-fs: 3.0.4 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@puppeteer/browsers@2.2.3: + resolution: {integrity: sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==} + engines: {node: '>=18'} + hasBin: true + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.4.0 + semver: 7.6.0 + tar-fs: 3.0.5 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + /@rushstack/node-core-library@5.4.1(@types/node@18.19.33): + resolution: {integrity: sha512-WNnwdS8r9NZ/2K3u29tNoSRldscFa7SxU0RT+82B6Dy2I4Hl2MeCSKm4EXLXPKeNzLGvJ1cqbUhTLviSF8E6iA==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@types/node': 18.19.33 + ajv: 8.13.0 + ajv-draft-04: 1.0.0(ajv@8.13.0) + ajv-formats: 3.0.1(ajv@8.13.0) + fs-extra: 7.0.1 + import-lazy: 4.0.0 + jju: 1.4.0 + resolve: 1.22.8 + semver: 7.5.4 + + /@rushstack/terminal@0.13.0(@types/node@18.19.33): + resolution: {integrity: sha512-Ou44Q2s81BqJu3dpYedAX54am9vn245F0HzqVrfJCMQk5pGgoKKOBOjkbfZC9QKcGNaECh6pwH2s5noJt7X6ew==} + peerDependencies: + '@types/node': '*' + peerDependenciesMeta: + '@types/node': + optional: true + dependencies: + '@rushstack/node-core-library': 5.4.1(@types/node@18.19.33) + '@types/node': 18.19.33 + supports-color: 8.1.1 + + /@rushstack/ts-command-line@4.22.0(@types/node@18.19.33): + resolution: {integrity: sha512-Qj28t6MO3HRgAZ72FDeFsrpdE6wBWxF3VENgvrXh7JF2qIT+CrXiOJIesW80VFZB9QwObSpkB1ilx794fGQg6g==} + dependencies: + '@rushstack/terminal': 0.13.0(@types/node@18.19.33) + '@types/argparse': 1.0.38 + argparse: 1.0.10 + string-argv: 0.3.2 + transitivePeerDependencies: + - '@types/node' + + /@sentry/core@6.19.7: + resolution: {integrity: sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.7 + '@sentry/minimal': 6.19.7 + '@sentry/types': 6.19.7 + '@sentry/utils': 6.19.7 + tslib: 1.14.1 + + /@sentry/hub@6.19.7: + resolution: {integrity: sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.7 + '@sentry/utils': 6.19.7 + tslib: 1.14.1 + + /@sentry/minimal@6.19.7: + resolution: {integrity: sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==} + engines: {node: '>=6'} + dependencies: + '@sentry/hub': 6.19.7 + '@sentry/types': 6.19.7 + tslib: 1.14.1 + + /@sentry/node@6.19.7: + resolution: {integrity: sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==} + engines: {node: '>=6'} + dependencies: + '@sentry/core': 6.19.7 + '@sentry/hub': 6.19.7 + '@sentry/types': 6.19.7 + '@sentry/utils': 6.19.7 + cookie: 0.4.2 + https-proxy-agent: 5.0.1 + lru_map: 0.3.3 + tslib: 1.14.1 + transitivePeerDependencies: + - supports-color + + /@sentry/types@6.19.7: + resolution: {integrity: sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==} + engines: {node: '>=6'} + + /@sentry/utils@6.19.7: + resolution: {integrity: sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==} + engines: {node: '>=6'} + dependencies: + '@sentry/types': 6.19.7 + tslib: 1.14.1 + + /@sinclair/typebox@0.27.8: + resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} + dev: true + + /@sindresorhus/is@4.6.0: + resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} + engines: {node: '>=10'} + dev: false + + /@sinonjs/commons@3.0.1: + resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@10.3.0: + resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} + dependencies: + '@sinonjs/commons': 3.0.1 + dev: true + + /@slack/logger@3.0.0: + resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + dependencies: + '@types/node': 18.19.33 + dev: false + + /@slack/types@2.11.0: + resolution: {integrity: sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + dev: false + + /@slack/web-api@6.12.0: + resolution: {integrity: sha512-RPw6F8rWfGveGkZEJ4+4jUin5iazxRK2q3FpQDz/FvdgzC3nZmPyLx8WRzc6nh0w3MBjEbphNnp2VZksfhpBIQ==} + engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + dependencies: + '@slack/logger': 3.0.0 + '@slack/types': 2.11.0 + '@types/is-stream': 1.1.0 + '@types/node': 18.19.33 + axios: 1.7.2 + eventemitter3: 3.1.2 + form-data: 2.5.1 + is-electron: 2.2.2 + is-stream: 1.1.0 + p-queue: 6.6.2 + p-retry: 4.6.2 + transitivePeerDependencies: + - debug + dev: false + + /@szmarczak/http-timer@4.0.6: + resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} + engines: {node: '>=10'} + dependencies: + defer-to-connect: 2.0.1 + dev: false + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + dev: false + + /@tootallnate/quickjs-emscripten@0.23.0: + resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} + + /@ts-morph/common@0.21.0: + resolution: {integrity: sha512-ES110Mmne5Vi4ypUKrtVQfXFDtCsDXiUiGxF6ILVlE90dDD4fdpC1LSjydl/ml7xJWKSDZwUYD2zkOePMSrPBA==} + dependencies: + fast-glob: 3.3.2 + minimatch: 7.4.6 + mkdirp: 2.1.6 + path-browserify: 1.0.1 + dev: false + + /@tsconfig/node10@1.0.11: + resolution: {integrity: sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@types/argparse@1.0.38: + resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + '@types/babel__generator': 7.6.8 + '@types/babel__template': 7.4.4 + '@types/babel__traverse': 7.20.6 + dev: true + + /@types/babel__generator@7.6.8: + resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} + dependencies: + '@babel/types': 7.24.6 + dev: true + + /@types/babel__template@7.4.4: + resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} + dependencies: + '@babel/parser': 7.24.6 + '@babel/types': 7.24.6 + dev: true + + /@types/babel__traverse@7.20.6: + resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} + dependencies: + '@babel/types': 7.24.6 + dev: true + + /@types/body-parser@1.19.5: + resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} + dependencies: + '@types/connect': 3.4.38 + '@types/node': 18.19.33 + dev: true + + /@types/cacheable-request@6.0.3: + resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} + dependencies: + '@types/http-cache-semantics': 4.0.4 + '@types/keyv': 3.1.4 + '@types/node': 18.19.33 + '@types/responselike': 1.0.3 + dev: false + + /@types/connect@3.4.38: + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + dependencies: + '@types/node': 18.19.33 + dev: true + + /@types/express-serve-static-core@4.19.3: + resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} + dependencies: + '@types/node': 18.19.33 + '@types/qs': 6.9.15 + '@types/range-parser': 1.2.7 + '@types/send': 0.17.4 + dev: true + + /@types/express@4.17.21: + resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} + dependencies: + '@types/body-parser': 1.19.5 + '@types/express-serve-static-core': 4.19.3 + '@types/qs': 6.9.15 + '@types/serve-static': 1.15.7 + dev: true + + /@types/graceful-fs@4.1.9: + resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} + dependencies: + '@types/node': 18.19.33 + dev: true + + /@types/har-format@1.2.15: + resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} + dev: true + + /@types/http-cache-semantics@4.0.4: + resolution: {integrity: sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==} + dev: false + + /@types/http-errors@2.0.4: + resolution: {integrity: sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==} + dev: true + + /@types/is-stream@1.1.0: + resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} + dependencies: + '@types/node': 18.19.33 + dev: false + + /@types/istanbul-lib-coverage@2.0.6: + resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} + dev: true + + /@types/istanbul-lib-report@3.0.3: + resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.6 + dev: true + + /@types/istanbul-reports@3.0.4: + resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} + dependencies: + '@types/istanbul-lib-report': 3.0.3 + dev: true + + /@types/jest@29.5.12: + resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} + dependencies: + expect: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /@types/json-schema@7.0.15: + resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} + dev: true + + /@types/keyv@3.1.4: + resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} + dependencies: + '@types/node': 18.19.33 + dev: false + + /@types/mime@1.3.5: + resolution: {integrity: sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==} + dev: true + + /@types/node@14.18.63: + resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} + dev: false + + /@types/node@18.19.33: + resolution: {integrity: sha512-NR9+KrpSajr2qBVp/Yt5TU/rp+b5Mayi3+OlMlcg2cVCfRmcG5PWZ7S4+MG9PZ5gWBoc9Pd0BKSRViuBCRPu0A==} + dependencies: + undici-types: 5.26.5 + + /@types/qs@6.9.15: + resolution: {integrity: sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==} + dev: true + + /@types/range-parser@1.2.7: + resolution: {integrity: sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==} + dev: true + + /@types/responselike@1.0.3: + resolution: {integrity: sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==} + dependencies: + '@types/node': 18.19.33 + dev: false + + /@types/retry@0.12.0: + resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} + dev: false + + /@types/semver@7.5.8: + resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} + dev: true + + /@types/send@0.17.4: + resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} + dependencies: + '@types/mime': 1.3.5 + '@types/node': 18.19.33 + dev: true + + /@types/serve-static@1.15.7: + resolution: {integrity: sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==} + dependencies: + '@types/http-errors': 2.0.4 + '@types/node': 18.19.33 + '@types/send': 0.17.4 + dev: true + + /@types/stack-utils@2.0.3: + resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} + dev: true + + /@types/yargs-parser@21.0.3: + resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} + dev: true + + /@types/yargs@17.0.32: + resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} + dependencies: + '@types/yargs-parser': 21.0.3 + dev: true + + /@types/yauzl@2.10.3: + resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} + requiresBuild: true + dependencies: + '@types/node': 18.19.33 + optional: true + + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.10.0 + '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.5 + eslint: 8.57.0 + graphemer: 1.4.0 + ignore: 5.3.1 + natural-compare: 1.4.0 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.5 + eslint: 8.57.0 + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@6.21.0: + resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + dev: true + + /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + debug: 4.3.5 + eslint: 8.57.0 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@6.21.0: + resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} + engines: {node: ^16.0.0 || >=18.0.0} + dev: true + + /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5): + resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/visitor-keys': 6.21.0 + debug: 4.3.5 + globby: 11.1.0 + is-glob: 4.0.3 + minimatch: 9.0.3 + semver: 7.6.2 + ts-api-utils: 1.3.0(typescript@5.4.5) + typescript: 5.4.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5): + resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} + engines: {node: ^16.0.0 || >=18.0.0} + peerDependencies: + eslint: ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@types/json-schema': 7.0.15 + '@types/semver': 7.5.8 + '@typescript-eslint/scope-manager': 6.21.0 + '@typescript-eslint/types': 6.21.0 + '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) + eslint: 8.57.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@6.21.0: + resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} + engines: {node: ^16.0.0 || >=18.0.0} + dependencies: + '@typescript-eslint/types': 6.21.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@ultraq/array-utils@2.1.0: + resolution: {integrity: sha512-TKO1zE6foqs5HG3+QH32yKwJ0zhZrm6J3UmltscveQmxCdbgIPXhNf3A8C9HakjyZDHVRK5pYZOU0tTl28YGFg==} + engines: {node: '>=10'} + dev: false + + /@ultraq/dom-utils@0.4.0: + resolution: {integrity: sha512-SZmHIvp7C8UXAPtgO6e0lKfkVzEJfWGdmLoHGwhk5+v0rxVo4Z3TQT4svRpFq42Pj3sXGhXU7jyWCoeWrrkdLA==} + engines: {node: '>=10.0.0'} + dev: false + + /@ultraq/string-utils@2.1.0: + resolution: {integrity: sha512-936LzGXW2R5/rG0vVhstr7l5v05TEjjm9SyJdQsvCfKuPF0UzWVfp77ViZIm32fH/zzzmEFEWzcZEcy7DE5+Yw==} + engines: {node: '>=10'} + dev: false + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + deprecated: Use your platform's native atob() and btoa() methods instead + dev: false + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + + /abstract-logging@2.0.1: + resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.3): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.3 + dev: true + + /acorn-loose@8.3.0: + resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} + engines: {node: '>=0.4.0'} + dependencies: + acorn: 8.11.3 + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: false + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + + /acorn-walk@8.3.2: + resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + + /agent-base@5.1.1: + resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} + engines: {node: '>= 6.0.0'} + dev: false + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + /agent-base@7.1.1: + resolution: {integrity: sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==} + engines: {node: '>= 14'} + dependencies: + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + /ajv-draft-04@1.0.0(ajv@8.13.0): + resolution: {integrity: sha512-mv00Te6nmYbRp5DCwclxtt7yV/joXJPGS7nM+97GdxvuttCOfgI3K4U25zboyeX0O+myI8ERluxQe5wljMmVIw==} + peerDependencies: + ajv: ^8.5.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + + /ajv-errors@3.0.0(ajv@8.14.0): + resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} + peerDependencies: + ajv: ^8.0.1 + dependencies: + ajv: 8.14.0 + dev: false + + /ajv-formats@2.1.1(ajv@8.14.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.14.0 + + /ajv-formats@3.0.1(ajv@8.13.0): + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.13.0 + + /ajv-formats@3.0.1(ajv@8.14.0): + resolution: {integrity: sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.14.0 + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + dev: true + + /ajv@8.13.0: + resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + /ajv@8.14.0: + resolution: {integrity: sha512-oYs1UUtO97ZO2lJ4bwnWeQW8/zvOIQLGKcvPTsWmvc2SYgBb+upuNS5NxoLaMU4h8Ju3Nbj6Cq8mD2LQoqVKFA==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + /ansi-colors@4.1.3: + resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} + engines: {node: '>=6'} + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + dev: true + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + dev: true + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: true + + /archiver-utils@2.1.0: + resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} + engines: {node: '>= 6'} + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 2.3.8 + dev: false + + /archiver-utils@3.0.4: + resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} + engines: {node: '>= 10'} + dependencies: + glob: 7.2.3 + graceful-fs: 4.2.11 + lazystream: 1.0.1 + lodash.defaults: 4.2.0 + lodash.difference: 4.5.0 + lodash.flatten: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.union: 4.6.0 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + dev: false + + /archiver@5.3.2: + resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} + engines: {node: '>= 10'} + dependencies: + archiver-utils: 2.1.0 + async: 3.2.5 + buffer-crc32: 0.2.13 + readable-stream: 3.6.2 + readdir-glob: 1.1.3 + tar-stream: 2.2.0 + zip-stream: 4.1.1 + dev: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + + /ast-types@0.13.4: + resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} + engines: {node: '>=4'} + dependencies: + tslib: 2.6.2 + + /async@0.2.10: + resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} + dev: false + + /async@3.2.5: + resolution: {integrity: sha512-baNZyqaaLhyLVKm/DlvdW051MSgO6b8eVfIezl9E5PqWxFgzLm/wQntEW4zOytVburDEr0JlALEpdOFwvErLsg==} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + dev: false + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + + /avvio@8.3.2: + resolution: {integrity: sha512-st8e519GWHa/azv8S87mcJvZs4WsgTBjOw/Ih1CP6u+8SZvcOeAYNG6JbsIrAUUJJ7JfmrnOkR8ipDS+u9SIRQ==} + dependencies: + '@fastify/error': 3.4.1 + fastq: 1.17.1 + + /axe-core@4.9.1: + resolution: {integrity: sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==} + engines: {node: '>=4'} + + /axios@0.21.4: + resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} + dependencies: + follow-redirects: 1.15.6 + transitivePeerDependencies: + - debug + dev: false + + /axios@1.7.2: + resolution: {integrity: sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==} + dependencies: + follow-redirects: 1.15.6 + form-data: 4.0.0 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + dev: false + + /b4a@1.6.6: + resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} + + /babel-jest@29.7.0(@babel/core@7.24.6): + resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.24.6 + '@jest/transform': 29.7.0 + '@types/babel__core': 7.20.5 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 29.6.3(@babel/core@7.24.6) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.24.6 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@29.6.3: + resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/template': 7.24.6 + '@babel/types': 7.24.6 + '@types/babel__core': 7.20.5 + '@types/babel__traverse': 7.20.6 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.6): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.6 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.6) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.24.6): + resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.6 + babel-plugin-jest-hoist: 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /bare-events@2.3.1: + resolution: {integrity: sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==} + requiresBuild: true + optional: true + + /bare-fs@2.3.0: + resolution: {integrity: sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==} + requiresBuild: true + dependencies: + bare-events: 2.3.1 + bare-path: 2.1.3 + bare-stream: 1.0.0 + optional: true + + /bare-os@2.3.0: + resolution: {integrity: sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==} + requiresBuild: true + optional: true + + /bare-path@2.1.3: + resolution: {integrity: sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==} + requiresBuild: true + dependencies: + bare-os: 2.3.0 + optional: true + + /bare-stream@1.0.0: + resolution: {integrity: sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==} + requiresBuild: true + dependencies: + streamx: 2.18.0 + optional: true + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /basic-ftp@5.0.5: + resolution: {integrity: sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==} + engines: {node: '>=10.0.0'} + + /big-integer@1.6.52: + resolution: {integrity: sha512-QxD8cf2eVqJOOz63z6JIN9BzvVs/dlySa5HGSBH5xtR8dPteIRQnBxxKqkNTiT6jbDTF6jAfrd4oMcND9RGbQg==} + engines: {node: '>=0.6'} + dev: false + + /binary@0.3.0: + resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} + dependencies: + buffers: 0.1.1 + chainsaw: 0.1.0 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /bluebird@3.4.7: + resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + + /braces@3.0.3: + resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.1.1 + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: false + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001625 + electron-to-chromium: 1.4.788 + node-releases: 2.0.14 + update-browserslist-db: 1.0.16(browserslist@4.23.0) + dev: true + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-crc32@0.2.13: + resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: true + + /buffer-indexof-polyfill@1.0.2: + resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} + engines: {node: '>=0.10'} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffers@0.1.1: + resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} + engines: {node: '>=0.2.0'} + dev: false + + /cacheable-lookup@5.0.4: + resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} + engines: {node: '>=10.6.0'} + dev: false + + /cacheable-request@7.0.4: + resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} + engines: {node: '>=8'} + dependencies: + clone-response: 1.0.3 + get-stream: 5.2.0 + http-cache-semantics: 4.1.1 + keyv: 4.5.4 + lowercase-keys: 2.0.0 + normalize-url: 6.1.0 + responselike: 2.0.1 + dev: false + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001625: + resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} + dev: true + + /chainsaw@0.1.0: + resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} + dependencies: + traverse: 0.3.9 + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + dev: true + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + dev: false + + /chrome-har@0.11.12: + resolution: {integrity: sha512-Fi/YCoUHjQMQC0sPKCdiuGVbApeEwIUNvISrlwZgbuUcxfHJA6MjD4RsIH/YSOAo/Z3ENiF+xaEpsdqqdETIjg==} + dependencies: + dayjs: 1.8.31 + debug: 4.1.1 + tough-cookie: 4.0.0 + uuid: 8.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /chrome-launcher@1.1.1: + resolution: {integrity: sha512-OAQgBmpUzrIuShApIwOpjt7WFripGKcDMW/qeYU+kcl6jBPg87mRG+N2C3Vu+VeCVPqZ/ds3GfI2TK7tpz3Yyw==} + engines: {node: '>=12.13.0'} + hasBin: true + dependencies: + '@types/node': 18.19.33 + escape-string-regexp: 4.0.0 + is-wsl: 2.2.0 + lighthouse-logger: 2.0.1 + transitivePeerDependencies: + - supports-color + + /chromium-bidi@0.5.19(devtools-protocol@0.0.1286932): + resolution: {integrity: sha512-UA6zL77b7RYCjJkZBsZ0wlvCTD+jTjllZ8f6wdO4buevXgTZYjV+XLB9CiEa2OuuTGGTLnI7eN9I60YxuALGQg==} + peerDependencies: + devtools-protocol: '*' + dependencies: + devtools-protocol: 0.0.1286932 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + zod: 3.22.4 + + /chromium-bidi@0.5.8(devtools-protocol@0.0.1232444): + resolution: {integrity: sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==} + peerDependencies: + devtools-protocol: '*' + dependencies: + devtools-protocol: 0.0.1232444 + mitt: 3.0.1 + urlpattern-polyfill: 10.0.0 + dev: false + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.3.1: + resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} + dev: true + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-spinners@2.9.2: + resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} + engines: {node: '>=6'} + dev: false + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + + /clone-response@1.0.3: + resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} + dependencies: + mimic-response: 1.0.1 + dev: false + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + dev: true + + /code-block-writer@12.0.0: + resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} + dev: false + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /colorette@2.0.19: + resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} + + /colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + + /commander@11.1.0: + resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} + engines: {node: '>=16'} + dev: false + + /compress-commons@4.1.2: + resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} + engines: {node: '>= 10'} + dependencies: + buffer-crc32: 0.2.13 + crc32-stream: 4.0.3 + normalize-path: 3.0.0 + readable-stream: 3.6.2 + dev: false + + /concat-files@0.1.1: + resolution: {integrity: sha512-rd86aOzWGNrvTQys7xHTif/e0Sr66v529O7IFc/gFM9W0ZB3IThqpWC6wOzbsNXmzTbMh3zNIgB2GIeOe2b72w==} + dependencies: + async: 0.2.10 + dev: false + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /configstore@5.0.1: + resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} + engines: {node: '>=8'} + dependencies: + dot-prop: 5.3.0 + graceful-fs: 4.2.11 + make-dir: 3.1.0 + unique-string: 2.0.0 + write-file-atomic: 3.0.3 + xdg-basedir: 4.0.0 + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + dev: false + + /cosmiconfig@9.0.0(typescript@5.4.5): + resolution: {integrity: sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==} + engines: {node: '>=14'} + peerDependencies: + typescript: '>=4.9.5' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + env-paths: 2.2.1 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + parse-json: 5.2.0 + typescript: 5.4.5 + dev: false + + /crc-32@1.2.2: + resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} + engines: {node: '>=0.8'} + hasBin: true + dev: false + + /crc32-stream@4.0.3: + resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} + engines: {node: '>= 10'} + dependencies: + crc-32: 1.2.2 + readable-stream: 3.6.2 + dev: false + + /create-jest@29.7.0(@types/node@18.19.33)(ts-node@10.9.2): + resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-config: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest-util: 29.7.0 + prompts: 2.4.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cross-fetch@4.0.0: + resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /crypto-random-string@2.0.0: + resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} + engines: {node: '>=8'} + + /csp_evaluator@1.1.1: + resolution: {integrity: sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==} + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: false + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: false + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: false + + /data-uri-to-buffer@6.0.2: + resolution: {integrity: sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==} + engines: {node: '>= 14'} + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: false + + /dateformat@4.6.3: + resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} + dev: false + + /dayjs@1.11.11: + resolution: {integrity: sha512-okzr3f11N6WuqYtZSvm+F776mB41wRZMhKP+hc34YdW+KmtYYK9iqvHSwo2k9FEH3fhGXvOPV6yz2IcSrfRUDg==} + dev: false + + /dayjs@1.8.31: + resolution: {integrity: sha512-mPh1mslned+5PuIuiUfbw4CikHk6AEAf2Baxih+wP5fssv+wmlVhvgZ7mq+BhLt7Sr/Hc8leWDiwe6YnrpNt3g==} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@4.1.1: + resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} + deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /debug@4.3.5: + resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: false + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + dependencies: + mimic-response: 3.1.0 + dev: false + + /dedent@1.5.3: + resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} + peerDependencies: + babel-plugin-macros: ^3.1.0 + peerDependenciesMeta: + babel-plugin-macros: + optional: true + dev: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + dev: true + + /defer-to-connect@2.0.1: + resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} + engines: {node: '>=10'} + dev: false + + /define-lazy-prop@2.0.0: + resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} + engines: {node: '>=8'} + + /degenerator@5.0.1: + resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} + engines: {node: '>= 14'} + dependencies: + ast-types: 0.13.4 + escodegen: 2.1.0 + esprima: 4.0.1 + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + dev: false + + /denque@2.1.0: + resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} + engines: {node: '>=0.10'} + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /devtools-protocol@0.0.1232444: + resolution: {integrity: sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==} + + /devtools-protocol@0.0.1286932: + resolution: {integrity: sha512-wu58HMQll9voDjR4NlPyoDEw1syfzaBNHymMMZ/QOXiHRNluOnDgu9hp1yHOKYoMlxCh4lSSiugLITe6Fvu1eA==} + + /devtools-protocol@0.0.818844: + resolution: {integrity: sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==} + dev: false + + /diff-sequences@29.6.3: + resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + deprecated: Use your platform's native DOMException instead + dependencies: + webidl-conversions: 5.0.0 + dev: false + + /dot-prop@5.3.0: + resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} + engines: {node: '>=8'} + dependencies: + is-obj: 2.0.0 + + /dotenv@16.3.1: + resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} + engines: {node: '>=12'} + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: false + + /dumb-query-selector@3.3.0: + resolution: {integrity: sha512-hPRKbOOZUn9UBgO74fPSidcMqrYOJSMs27CEaDLZ+RjuY20ze0zgc4JH4ESXYyDXyCmGe3kirYHp6sFcH78Zsw==} + dev: false + + /duplexer2@0.1.4: + resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} + dependencies: + readable-stream: 2.3.8 + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + + /electron-to-chromium@1.4.788: + resolution: {integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==} + dev: true + + /emittery@0.13.1: + resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} + engines: {node: '>=12'} + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /enquirer@2.4.1: + resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} + engines: {node: '>=8.6'} + dependencies: + ansi-colors: 4.1.3 + strip-ansi: 6.0.1 + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: false + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /escalade@3.1.2: + resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} + engines: {node: '>=6'} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.57.0: + resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/regexpp': 4.10.0 + '@eslint/eslintrc': 2.1.4 + '@eslint/js': 8.57.0 + '@humanwhocodes/config-array': 0.11.14 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + '@ungap/structured-clone': 1.2.0 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.5 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.24.0 + graphemer: 1.4.0 + ignore: 5.3.1 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.4 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /esm@3.2.25: + resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} + engines: {node: '>=6'} + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.11.3 + acorn-jsx: 5.3.2(acorn@8.11.3) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + dev: true + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + + /eventemitter3@3.1.2: + resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} + dev: false + + /eventemitter3@4.0.7: + resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /exceljs@4.4.0: + resolution: {integrity: sha512-XctvKaEMaj1Ii9oDOqbW/6e1gXknSY4g/aLCDicOXqBE4M0nRWkUu0PTp++UPNzoFY12BNHMfs/VadKIS6llvg==} + engines: {node: '>=8.3.0'} + dependencies: + archiver: 5.3.2 + dayjs: 1.11.11 + fast-csv: 4.3.6 + jszip: 3.10.1 + readable-stream: 3.6.2 + saxes: 5.0.1 + tmp: 0.2.3 + unzipper: 0.10.14 + uuid: 8.3.2 + dev: false + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect@29.7.0: + resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/expect-utils': 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + dev: true + + /extract-zip@2.0.1: + resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} + engines: {node: '>= 10.17.0'} + hasBin: true + dependencies: + debug: 4.3.5 + get-stream: 5.2.0 + yauzl: 2.10.0 + optionalDependencies: + '@types/yauzl': 2.10.3 + transitivePeerDependencies: + - supports-color + + /fast-content-type-parse@1.1.0: + resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} + + /fast-copy@3.0.2: + resolution: {integrity: sha512-dl0O9Vhju8IrcLndv2eU4ldt1ftXMqqfgN4H1cpmGV7P6jeB9FwpN9a2c8DPGE1Ys88rNUJVYDHq73CGAGOPfQ==} + dev: false + + /fast-csv@4.3.6: + resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} + engines: {node: '>=10.0.0'} + dependencies: + '@fast-csv/format': 4.3.5 + '@fast-csv/parse': 4.3.6 + dev: false + + /fast-decode-uri-component@1.0.1: + resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.7 + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + dev: true + + /fast-json-stringify@5.16.0: + resolution: {integrity: sha512-A4bg6E15QrkuVO3f0SwIASgzMzR6XC4qTyTqhf3hYXy0iazbAdZKwkE+ox4WgzKyzM6ygvbdq3r134UjOaaAnA==} + dependencies: + '@fastify/merge-json-schemas': 0.1.1 + ajv: 8.14.0 + ajv-formats: 3.0.1(ajv@8.14.0) + fast-deep-equal: 3.1.3 + fast-uri: 2.3.0 + json-schema-ref-resolver: 1.0.1 + rfdc: 1.3.1 + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-querystring@1.1.2: + resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} + dependencies: + fast-decode-uri-component: 1.0.1 + + /fast-redact@3.5.0: + resolution: {integrity: sha512-dwsoQlS7h9hMeYUq1W++23NDcBLV4KqONnITDV9DjfS3q1SgDGVrBdvvTLUotWtPSD7asWDV9/CmsZPy8Hf70A==} + engines: {node: '>=6'} + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + dev: false + + /fast-uri@2.3.0: + resolution: {integrity: sha512-eel5UKGn369gGEWOqBShmFJWfq/xSJvsgDzgLYC845GneayWvXBf0lJCBn5qTABfewy1ZDPoaR5OZCP+kssfuw==} + + /fastify-plugin@4.5.1: + resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} + + /fastify@4.27.0: + resolution: {integrity: sha512-ci9IXzbigB8dyi0mSy3faa3Bsj0xWAPb9JeT4KRzubdSb6pNhcADRUaXCBml6V1Ss/a05kbtQls5LBmhHydoTA==} + dependencies: + '@fastify/ajv-compiler': 3.5.0 + '@fastify/error': 3.4.1 + '@fastify/fast-json-stringify-compiler': 4.3.0 + abstract-logging: 2.0.1 + avvio: 8.3.2 + fast-content-type-parse: 1.1.0 + fast-json-stringify: 5.16.0 + find-my-way: 8.2.0 + light-my-request: 5.13.0 + pino: 9.1.0 + process-warning: 3.0.0 + proxy-addr: 2.0.7 + rfdc: 1.3.1 + secure-json-parse: 2.7.0 + semver: 7.6.2 + toad-cache: 3.7.0 + + /fastq@1.17.1: + resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} + dependencies: + reusify: 1.0.4 + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fd-slicer@1.1.0: + resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} + dependencies: + pend: 1.2.0 + + /figlet@1.7.0: + resolution: {integrity: sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==} + engines: {node: '>= 0.4.0'} + hasBin: true + dev: true + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.2.0 + dev: true + + /fill-range@7.1.1: + resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /find-my-way@8.2.0: + resolution: {integrity: sha512-HdWXgFYc6b1BJcOBDBwjqWuHJj1WYiqrxSh25qtU4DabpMFdj/gSunNBQb83t+8Zt67D7CXEzJWTkxaShMTMOA==} + engines: {node: '>=14'} + dependencies: + fast-deep-equal: 3.1.3 + fast-querystring: 1.1.2 + safe-regex2: 3.1.0 + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.2.0: + resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flatted: 3.3.1 + keyv: 4.5.4 + rimraf: 3.0.2 + dev: true + + /flatted@3.3.1: + resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + dev: true + + /follow-redirects@1.15.6: + resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + dev: false + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + + /form-data@2.5.1: + resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} + engines: {node: '>= 0.12'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: false + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + dev: false + + /fs-extra@11.1.1: + resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + /fs-extra@11.2.0: + resolution: {integrity: sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==} + engines: {node: '>=14.14'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.1 + + /fs-extra@7.0.1: + resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} + engines: {node: '>=6 <7 || >=8'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 4.0.0 + universalify: 0.1.2 + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /fstream@1.0.12: + resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} + engines: {node: '>=0.6'} + deprecated: This package is no longer supported. + dependencies: + graceful-fs: 4.2.11 + inherits: 2.0.4 + mkdirp: 0.5.6 + rimraf: 2.7.1 + dev: false + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + + /generate-function@2.3.1: + resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} + dependencies: + is-property: 1.0.2 + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: false + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-uri@6.0.3: + resolution: {integrity: sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==} + engines: {node: '>= 14'} + dependencies: + basic-ftp: 5.0.5 + data-uri-to-buffer: 6.0.2 + debug: 4.3.5 + fs-extra: 11.2.0 + transitivePeerDependencies: + - supports-color + + /getopts@2.3.0: + resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob@10.4.1: + resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} + engines: {node: '>=16 || 14 >=14.18'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 3.1.2 + minimatch: 9.0.4 + minipass: 7.1.2 + path-scurry: 1.11.1 + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + deprecated: Glob versions prior to v9 are no longer supported + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.24.0: + resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.2 + ignore: 5.3.1 + merge2: 1.4.1 + slash: 3.0.0 + + /got@11.8.6: + resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} + engines: {node: '>=10.19.0'} + dependencies: + '@sindresorhus/is': 4.6.0 + '@szmarczak/http-timer': 4.0.6 + '@types/cacheable-request': 6.0.3 + '@types/responselike': 1.0.3 + cacheable-lookup: 5.0.4 + cacheable-request: 7.0.4 + decompress-response: 6.0.0 + http2-wrapper: 1.0.3 + lowercase-keys: 2.0.0 + p-cancelable: 2.1.1 + responselike: 2.0.1 + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /hasown@2.0.2: + resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + + /help-me@5.0.0: + resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} + dev: false + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: false + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-link-header@1.1.3: + resolution: {integrity: sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==} + engines: {node: '>=6.0.0'} + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /http-proxy-agent@7.0.2: + resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + /http2-wrapper@1.0.3: + resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} + engines: {node: '>=10.19.0'} + dependencies: + quick-lru: 5.1.1 + resolve-alpn: 1.2.1 + dev: false + + /https-proxy-agent@4.0.0: + resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} + engines: {node: '>= 6.0.0'} + dependencies: + agent-base: 5.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + dev: false + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + /https-proxy-agent@7.0.4: + resolution: {integrity: sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + transitivePeerDependencies: + - supports-color + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + dev: false + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.3.1: + resolution: {integrity: sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==} + engines: {node: '>= 4'} + + /image-ssim@0.2.0: + resolution: {integrity: sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==} + + /immediate@3.0.6: + resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} + dev: false + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-lazy@4.0.0: + resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} + engines: {node: '>=8'} + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful. + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /interpret@2.2.0: + resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} + engines: {node: '>= 0.10'} + + /intl-messageformat@10.5.14: + resolution: {integrity: sha512-IjC6sI0X7YRjjyVH9aUgdftcmZK7WXdHeil4KwbjDnRWjnVitKpAx3rr6t6di1joFp5188VqKcobOPA6mCLG/w==} + dependencies: + '@formatjs/ecma402-abstract': 2.0.0 + '@formatjs/fast-memoize': 2.2.0 + '@formatjs/icu-messageformat-parser': 2.7.8 + tslib: 2.6.2 + + /ip-address@9.0.5: + resolution: {integrity: sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==} + engines: {node: '>= 12'} + dependencies: + jsbn: 1.1.0 + sprintf-js: 1.1.3 + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.2 + + /is-docker@2.2.1: + resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} + engines: {node: '>=8'} + hasBin: true + + /is-electron@2.2.2: + resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-gzip@2.0.0: + resolution: {integrity: sha512-jtO4Njg6q58zDo/Pu4027beSZ0VdsZlt8/5Moco6yAg+DIxb5BK/xUYqYG2+MD4+piKldXJNHxRkhEYI2fvrxA==} + engines: {node: '>=4'} + dev: false + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-obj@2.0.0: + resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} + engines: {node: '>=8'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: false + + /is-property@1.0.2: + resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} + + /is-stream@1.1.0: + resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + dev: true + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-unicode-supported@2.0.0: + resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} + engines: {node: '>=18'} + dev: false + + /is-wsl@2.2.0: + resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} + engines: {node: '>=8'} + dependencies: + is-docker: 2.2.1 + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /istanbul-lib-coverage@3.2.2: + resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-instrument@6.0.2: + resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} + engines: {node: '>=10'} + dependencies: + '@babel/core': 7.24.6 + '@babel/parser': 7.24.6 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.2 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.2 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.5 + istanbul-lib-coverage: 3.2.2 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.7: + resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /jackspeak@3.1.2: + resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + + /jest-changed-files@29.7.0: + resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + execa: 5.1.1 + jest-util: 29.7.0 + p-limit: 3.1.0 + dev: true + + /jest-circus@29.7.0: + resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/expect': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + chalk: 4.1.2 + co: 4.6.0 + dedent: 1.5.3 + is-generator-fn: 2.1.0 + jest-each: 29.7.0 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-runtime: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + p-limit: 3.1.0 + pretty-format: 29.7.0 + pure-rand: 6.1.0 + slash: 3.0.0 + stack-utils: 2.0.6 + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-cli@29.7.0(@types/node@18.19.33)(ts-node@10.9.2): + resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + chalk: 4.1.2 + create-jest: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + exit: 0.1.2 + import-local: 3.1.0 + jest-config: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest-util: 29.7.0 + jest-validate: 29.7.0 + yargs: 17.7.2 + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jest-config@29.7.0(@types/node@18.19.33)(ts-node@10.9.2): + resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + peerDependencies: + '@types/node': '*' + ts-node: '>=9.0.0' + peerDependenciesMeta: + '@types/node': + optional: true + ts-node: + optional: true + dependencies: + '@babel/core': 7.24.6 + '@jest/test-sequencer': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + babel-jest: 29.7.0(@babel/core@7.24.6) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 29.7.0 + jest-environment-node: 29.7.0 + jest-get-type: 29.6.3 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-runner: 29.7.0 + jest-util: 29.7.0 + jest-validate: 29.7.0 + micromatch: 4.0.7 + parse-json: 5.2.0 + pretty-format: 29.7.0 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.2(@types/node@18.19.33)(typescript@5.4.5) + transitivePeerDependencies: + - babel-plugin-macros + - supports-color + dev: true + + /jest-diff@29.7.0: + resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 29.6.3 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-docblock@29.7.0: + resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@29.7.0: + resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + chalk: 4.1.2 + jest-get-type: 29.6.3 + jest-util: 29.7.0 + pretty-format: 29.7.0 + dev: true + + /jest-environment-node@29.7.0: + resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + jest-mock: 29.7.0 + jest-util: 29.7.0 + dev: true + + /jest-get-type@29.6.3: + resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-haste-map@29.7.0: + resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/graceful-fs': 4.1.9 + '@types/node': 18.19.33 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 29.6.3 + jest-util: 29.7.0 + jest-worker: 29.7.0 + micromatch: 4.0.7 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-leak-detector@29.7.0: + resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-matcher-utils@29.7.0: + resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + pretty-format: 29.7.0 + dev: true + + /jest-message-util@29.7.0: + resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/code-frame': 7.24.6 + '@jest/types': 29.6.3 + '@types/stack-utils': 2.0.3 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.7 + pretty-format: 29.7.0 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@29.7.0: + resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + jest-util: 29.7.0 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 29.7.0 + dev: true + + /jest-regex-util@29.6.3: + resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dev: true + + /jest-resolve-dependencies@29.7.0: + resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + jest-regex-util: 29.6.3 + jest-snapshot: 29.7.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@29.7.0: + resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) + jest-util: 29.7.0 + jest-validate: 29.7.0 + resolve: 1.22.8 + resolve.exports: 2.0.2 + slash: 3.0.0 + dev: true + + /jest-runner@29.7.0: + resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/console': 29.7.0 + '@jest/environment': 29.7.0 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + chalk: 4.1.2 + emittery: 0.13.1 + graceful-fs: 4.2.11 + jest-docblock: 29.7.0 + jest-environment-node: 29.7.0 + jest-haste-map: 29.7.0 + jest-leak-detector: 29.7.0 + jest-message-util: 29.7.0 + jest-resolve: 29.7.0 + jest-runtime: 29.7.0 + jest-util: 29.7.0 + jest-watcher: 29.7.0 + jest-worker: 29.7.0 + p-limit: 3.1.0 + source-map-support: 0.5.13 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-runtime@29.7.0: + resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/environment': 29.7.0 + '@jest/fake-timers': 29.7.0 + '@jest/globals': 29.7.0 + '@jest/source-map': 29.6.3 + '@jest/test-result': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + chalk: 4.1.2 + cjs-module-lexer: 1.3.1 + collect-v8-coverage: 1.0.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 29.7.0 + jest-message-util: 29.7.0 + jest-mock: 29.7.0 + jest-regex-util: 29.6.3 + jest-resolve: 29.7.0 + jest-snapshot: 29.7.0 + jest-util: 29.7.0 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-snapshot@29.7.0: + resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@babel/core': 7.24.6 + '@babel/generator': 7.24.6 + '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) + '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) + '@babel/types': 7.24.6 + '@jest/expect-utils': 29.7.0 + '@jest/transform': 29.7.0 + '@jest/types': 29.6.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) + chalk: 4.1.2 + expect: 29.7.0 + graceful-fs: 4.2.11 + jest-diff: 29.7.0 + jest-get-type: 29.6.3 + jest-matcher-utils: 29.7.0 + jest-message-util: 29.7.0 + jest-util: 29.7.0 + natural-compare: 1.4.0 + pretty-format: 29.7.0 + semver: 7.6.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@29.7.0: + resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@29.7.0: + resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/types': 29.6.3 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 29.6.3 + leven: 3.1.0 + pretty-format: 29.7.0 + dev: true + + /jest-watcher@29.7.0: + resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/test-result': 29.7.0 + '@jest/types': 29.6.3 + '@types/node': 18.19.33 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.13.1 + jest-util: 29.7.0 + string-length: 4.0.2 + dev: true + + /jest-worker@29.7.0: + resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@types/node': 18.19.33 + jest-util: 29.7.0 + merge-stream: 2.0.0 + supports-color: 8.1.1 + dev: true + + /jest@29.7.0(@types/node@18.19.33)(ts-node@10.9.2): + resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/types': 29.6.3 + import-local: 3.1.0 + jest-cli: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + transitivePeerDependencies: + - '@types/node' + - babel-plugin-macros + - supports-color + - ts-node + dev: true + + /jju@1.4.0: + resolution: {integrity: sha512-8wb9Yw966OSxApiCt0K3yNJL8pnNeIv+OEq2YMidz4FKP6nonSRoOXc80iXY4JaN2FC11B9qsNmDsm+ZOfMROA==} + + /joycon@3.1.1: + resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} + engines: {node: '>=10'} + dev: false + + /jpeg-js@0.4.4: + resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} + + /js-library-detector@6.7.0: + resolution: {integrity: sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==} + engines: {node: '>=12'} + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + + /jsbn@1.1.0: + resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} + + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.11.3 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.10 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.4 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-ref-resolver@1.0.1: + resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} + dependencies: + fast-deep-equal: 3.1.3 + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + dev: true + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonfile@4.0.0: + resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.1 + optionalDependencies: + graceful-fs: 4.2.11 + + /jszip@3.10.1: + resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} + dependencies: + lie: 3.3.0 + pako: 1.0.11 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /keyv@4.5.4: + resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} + dependencies: + json-buffer: 3.0.1 + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /knex@2.5.1(mysql2@3.6.2): + resolution: {integrity: sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + better-sqlite3: '*' + mysql: '*' + mysql2: '*' + pg: '*' + pg-native: '*' + sqlite3: '*' + tedious: '*' + peerDependenciesMeta: + better-sqlite3: + optional: true + mysql: + optional: true + mysql2: + optional: true + pg: + optional: true + pg-native: + optional: true + sqlite3: + optional: true + tedious: + optional: true + dependencies: + colorette: 2.0.19 + commander: 10.0.1 + debug: 4.3.4 + escalade: 3.1.2 + esm: 3.2.25 + get-package-type: 0.1.0 + getopts: 2.3.0 + interpret: 2.2.0 + lodash: 4.17.21 + mysql2: 3.6.2 + pg-connection-string: 2.6.1 + rechoir: 0.8.0 + resolve-from: 5.0.0 + tarn: 3.0.2 + tildify: 2.0.0 + transitivePeerDependencies: + - supports-color + + /lazystream@1.0.1: + resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} + engines: {node: '>= 0.6.3'} + dependencies: + readable-stream: 2.3.8 + dev: false + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /lie@3.3.0: + resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} + dependencies: + immediate: 3.0.6 + dev: false + + /light-my-request@5.13.0: + resolution: {integrity: sha512-9IjUN9ZyCS9pTG+KqTDEQo68Sui2lHsYBrfMyVUTTZ3XhH8PMZq7xO94Kr+eP9dhi/kcKsx4N41p2IXEBil1pQ==} + dependencies: + cookie: 0.6.0 + process-warning: 3.0.0 + set-cookie-parser: 2.6.0 + + /lighthouse-logger@2.0.1: + resolution: {integrity: sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==} + dependencies: + debug: 2.6.9 + marky: 1.2.5 + transitivePeerDependencies: + - supports-color + + /lighthouse-stack-packs@1.12.1: + resolution: {integrity: sha512-i4jTmg7tvZQFwNFiwB+nCK6a7ICR68Xcwo+VIVd6Spi71vBNFUlds5HiDrSbClZdkQDON2Bhqv+KKJIo5zkPeA==} + + /lighthouse@11.7.1: + resolution: {integrity: sha512-QuvkZvobZ8Gjv2Jkxl6TKhV5JYBzU+lzpqTY+Y1iH5IUc1SMYK4IOpBnSpp6PkM2FbNyur9uoNutPhsuLLqGTg==} + engines: {node: '>=18.16'} + hasBin: true + dependencies: + '@paulirish/trace_engine': 0.0.19 + '@sentry/node': 6.19.7 + axe-core: 4.9.1 + chrome-launcher: 1.1.1 + configstore: 5.0.1 + csp_evaluator: 1.1.1 + devtools-protocol: 0.0.1232444 + enquirer: 2.4.1 + http-link-header: 1.1.3 + intl-messageformat: 10.5.14 + jpeg-js: 0.4.4 + js-library-detector: 6.7.0 + lighthouse-logger: 2.0.1 + lighthouse-stack-packs: 1.12.1 + lodash: 4.17.21 + lookup-closest-locale: 6.2.0 + metaviewport-parser: 0.3.0 + open: 8.4.2 + parse-cache-control: 1.0.1 + ps-list: 8.1.1 + puppeteer-core: 22.10.0 + robots-parser: 3.0.1 + semver: 5.7.2 + speedline-core: 1.4.3 + third-party-web: 0.24.3 + tldts-icann: 6.1.23 + ws: 7.5.9 + yargs: 17.7.2 + yargs-parser: 21.1.1 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /listenercount@1.0.1: + resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + + /lodash.difference@4.5.0: + resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} + dev: false + + /lodash.escaperegexp@4.1.2: + resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} + dev: false + + /lodash.flatten@4.4.0: + resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} + dev: false + + /lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + dev: false + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isequal@4.5.0: + resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} + dev: false + + /lodash.isfunction@3.0.9: + resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} + dev: false + + /lodash.isnil@4.0.0: + resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isundefined@3.0.1: + resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: true + + /lodash.union@4.6.0: + resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} + dev: false + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@6.0.0: + resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} + engines: {node: '>=18'} + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + dev: false + + /long@5.2.3: + resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} + + /lookup-closest-locale@6.2.0: + resolution: {integrity: sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==} + + /lowercase-keys@2.0.0: + resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} + engines: {node: '>=8'} + dev: false + + /lru-cache@10.2.2: + resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} + engines: {node: 14 || >=16.14} + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-cache@7.18.3: + resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} + engines: {node: '>=12'} + + /lru-cache@8.0.5: + resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} + engines: {node: '>=16.14'} + + /lru_map@0.3.3: + resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + + /make-dir@3.1.0: + resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} + engines: {node: '>=8'} + dependencies: + semver: 6.3.1 + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.6.2 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + dev: true + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /marky@1.2.5: + resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: true + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + + /metaviewport-parser@0.3.0: + resolution: {integrity: sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==} + + /micromatch@4.0.7: + resolution: {integrity: sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.3 + picomatch: 2.3.1 + + /mikro-orm@5.9.8: + resolution: {integrity: sha512-iBku1gU9xkA2FCw2wy0K4x3EQzsRE52dYGkGUVQEthRmc/vIMBwXyiTAj+oARzXrkWqslFtlZA/2upeqZhMQlw==} + engines: {node: '>= 14.0.0'} + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /mimic-response@1.0.1: + resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} + engines: {node: '>=4'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + dev: false + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + + /minimatch@7.4.6: + resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimatch@9.0.4: + resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} + + /mitt@3.0.1: + resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + dev: false + + /mkdirp@2.1.6: + resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /mnemonist@0.39.6: + resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} + dependencies: + obliterator: 2.0.4 + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + dev: false + + /mysql2@3.6.2: + resolution: {integrity: sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==} + engines: {node: '>= 8.0'} + dependencies: + denque: 2.1.0 + generate-function: 2.3.1 + iconv-lite: 0.6.3 + long: 5.2.3 + lru-cache: 8.0.5 + named-placeholders: 1.1.3 + seq-queue: 0.0.5 + sqlstring: 2.3.3 + + /named-placeholders@1.1.3: + resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} + engines: {node: '>=12.0.0'} + dependencies: + lru-cache: 7.18.3 + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /netmask@2.0.2: + resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} + engines: {node: '>= 0.4.0'} + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: true + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /normalize-url@6.1.0: + resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} + engines: {node: '>=10'} + dev: false + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + dev: true + + /nwsapi@2.2.10: + resolution: {integrity: sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==} + dev: false + + /obliterator@2.0.4: + resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} + + /on-exit-leak-free@2.1.2: + resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} + engines: {node: '>=14.0.0'} + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /open@8.4.2: + resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} + engines: {node: '>=12'} + dependencies: + define-lazy-prop: 2.0.0 + is-docker: 2.2.1 + is-wsl: 2.2.0 + + /optionator@0.9.4: + resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} + engines: {node: '>= 0.8.0'} + dependencies: + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + word-wrap: 1.2.5 + dev: true + + /ora@8.0.1: + resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} + engines: {node: '>=18'} + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.2 + is-interactive: 2.0.0 + is-unicode-supported: 2.0.0 + log-symbols: 6.0.0 + stdin-discarder: 0.2.2 + string-width: 7.1.0 + strip-ansi: 7.1.0 + dev: false + + /p-cancelable@2.1.1: + resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} + engines: {node: '>=8'} + dev: false + + /p-finally@1.0.0: + resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} + engines: {node: '>=4'} + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-queue@6.6.2: + resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} + engines: {node: '>=8'} + dependencies: + eventemitter3: 4.0.7 + p-timeout: 3.2.0 + dev: false + + /p-retry@4.6.2: + resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} + engines: {node: '>=8'} + dependencies: + '@types/retry': 0.12.0 + retry: 0.13.1 + dev: false + + /p-timeout@3.2.0: + resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} + engines: {node: '>=8'} + dependencies: + p-finally: 1.0.0 + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + + /pac-proxy-agent@7.0.1: + resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} + engines: {node: '>= 14'} + dependencies: + '@tootallnate/quickjs-emscripten': 0.23.0 + agent-base: 7.1.1 + debug: 4.3.5 + get-uri: 6.0.3 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + pac-resolver: 7.0.1 + socks-proxy-agent: 8.0.3 + transitivePeerDependencies: + - supports-color + + /pac-resolver@7.0.1: + resolution: {integrity: sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==} + engines: {node: '>= 14'} + dependencies: + degenerator: 5.0.1 + netmask: 2.0.2 + + /pako@1.0.11: + resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parent-require@1.0.0: + resolution: {integrity: sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==} + engines: {node: '>= 0.4.0'} + dev: true + + /parse-cache-control@1.0.1: + resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.24.6 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: false + + /path-browserify@1.0.1: + resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + dependencies: + lru-cache: 10.2.2 + minipass: 7.1.2 + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pend@1.2.0: + resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} + + /pg-connection-string@2.6.1: + resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} + + /picocolors@1.0.1: + resolution: {integrity: sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pino-abstract-transport@1.2.0: + resolution: {integrity: sha512-Guhh8EZfPCfH+PMXAb6rKOjGQEoy0xlAIn+irODG5kgfYV+BQ0rGYYWTIel3P5mmyXqkYkPmdIkywsn6QKUR1Q==} + dependencies: + readable-stream: 4.5.2 + split2: 4.2.0 + + /pino-pretty@10.3.1: + resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} + hasBin: true + dependencies: + colorette: 2.0.20 + dateformat: 4.6.3 + fast-copy: 3.0.2 + fast-safe-stringify: 2.1.1 + help-me: 5.0.0 + joycon: 3.1.1 + minimist: 1.2.8 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pump: 3.0.0 + readable-stream: 4.5.2 + secure-json-parse: 2.7.0 + sonic-boom: 3.8.1 + strip-json-comments: 3.1.1 + dev: false + + /pino-std-serializers@6.2.2: + resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} + dev: false + + /pino-std-serializers@7.0.0: + resolution: {integrity: sha512-e906FRY0+tV27iq4juKzSYPbUj2do2X2JX4EzSca1631EB2QJQUqGbDuERal7LCtOpxl6x3+nvo9NPZcmjkiFA==} + + /pino@8.21.0: + resolution: {integrity: sha512-ip4qdzjkAyDDZklUaZkcRFb2iA118H9SgRh8yzTkSQK8HilsOJF7rSY8HoW5+I0M46AZgX/pxbprf2vvzQCE0Q==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 6.2.2 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 3.8.1 + thread-stream: 2.7.0 + dev: false + + /pino@9.1.0: + resolution: {integrity: sha512-qUcgfrlyOtjwhNLdbhoL7NR4NkHjzykAPw0V2QLFbvu/zss29h4NkRnibyFzBrNCbzCOY3WZ9hhKSwfOkNggYA==} + hasBin: true + dependencies: + atomic-sleep: 1.0.0 + fast-redact: 3.5.0 + on-exit-leak-free: 2.1.2 + pino-abstract-transport: 1.2.0 + pino-std-serializers: 7.0.0 + process-warning: 3.0.0 + quick-format-unescaped: 4.0.4 + real-require: 0.2.0 + safe-stable-stringify: 2.4.3 + sonic-boom: 4.0.1 + thread-stream: 3.0.2 + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + + /pony-cause@2.1.11: + resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} + engines: {node: '>=12.0.0'} + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /pretty-format@29.7.0: + resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} + engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} + dependencies: + '@jest/schemas': 29.6.3 + ansi-styles: 5.2.0 + react-is: 18.3.1 + dev: true + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + dev: false + + /process-warning@3.0.0: + resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} + + /process@0.11.10: + resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} + engines: {node: '>= 0.6.0'} + + /progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + /proxy-agent@6.3.1: + resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.3 + transitivePeerDependencies: + - supports-color + dev: false + + /proxy-agent@6.4.0: + resolution: {integrity: sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + http-proxy-agent: 7.0.2 + https-proxy-agent: 7.0.4 + lru-cache: 7.18.3 + pac-proxy-agent: 7.0.1 + proxy-from-env: 1.1.0 + socks-proxy-agent: 8.0.3 + transitivePeerDependencies: + - supports-color + + /proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + + /ps-list@8.1.1: + resolution: {integrity: sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /punycode@2.3.1: + resolution: {integrity: sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==} + engines: {node: '>=6'} + + /puppeteer-core@21.11.0: + resolution: {integrity: sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==} + engines: {node: '>=16.13.2'} + dependencies: + '@puppeteer/browsers': 1.9.1 + chromium-bidi: 0.5.8(devtools-protocol@0.0.1232444) + cross-fetch: 4.0.0 + debug: 4.3.4 + devtools-protocol: 0.0.1232444 + ws: 8.16.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /puppeteer-core@22.10.0: + resolution: {integrity: sha512-I54J4Vy4I07UHsgB1QSmuFoF7KNQjJWcvFBPhtY+ezMdBfwgGDr8dzYrJa11aPgP9kxIUHjhktcMmmfJkOAtTw==} + engines: {node: '>=18'} + dependencies: + '@puppeteer/browsers': 2.2.3 + chromium-bidi: 0.5.19(devtools-protocol@0.0.1286932) + debug: 4.3.4 + devtools-protocol: 0.0.1286932 + ws: 8.17.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + + /puppeteer-har@1.1.2(puppeteer@5.5.0): + resolution: {integrity: sha512-Z5zfoj8RkhUT9UbrrR8JjOHNnCr7sNINoeR346F40sLo/4zn+KX/sw/eoKNrtsISc1s/2YCZaqaSEVx6cZ8NQg==} + engines: {node: '>=7.6.0'} + peerDependencies: + puppeteer: '>=1.0.0' + dependencies: + chrome-har: 0.11.12 + puppeteer: 5.5.0 + transitivePeerDependencies: + - supports-color + dev: false + + /puppeteer@21.11.0(typescript@5.4.5): + resolution: {integrity: sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg==} + engines: {node: '>=16.13.2'} + deprecated: < 22.5.0 is no longer supported + hasBin: true + requiresBuild: true + dependencies: + '@puppeteer/browsers': 1.9.1 + cosmiconfig: 9.0.0(typescript@5.4.5) + puppeteer-core: 21.11.0 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - typescript + - utf-8-validate + dev: false + + /puppeteer@5.5.0: + resolution: {integrity: sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==} + engines: {node: '>=10.18.1'} + deprecated: < 22.5.0 is no longer supported + requiresBuild: true + dependencies: + debug: 4.3.5 + devtools-protocol: 0.0.818844 + extract-zip: 2.0.1 + https-proxy-agent: 4.0.0 + node-fetch: 2.7.0 + pkg-dir: 4.2.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + rimraf: 3.0.2 + tar-fs: 2.1.1 + unbzip2-stream: 1.4.3 + ws: 7.5.9 + transitivePeerDependencies: + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /pure-rand@6.1.0: + resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} + dev: true + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: false + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + + /quick-lru@5.1.1: + resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} + engines: {node: '>=10'} + dev: false + + /react-is@18.3.1: + resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} + dev: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readable-stream@4.5.2: + resolution: {integrity: sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + abort-controller: 3.0.0 + buffer: 6.0.3 + events: 3.3.0 + process: 0.11.10 + string_decoder: 1.3.0 + + /readdir-glob@1.1.3: + resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + dependencies: + minimatch: 5.1.6 + dev: false + + /real-require@0.2.0: + resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} + engines: {node: '>= 12.13.0'} + + /rechoir@0.8.0: + resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} + engines: {node: '>= 10.13.0'} + dependencies: + resolve: 1.22.8 + + /reflect-metadata@0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + + /regenerator-runtime@0.14.1: + resolution: {integrity: sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==} + dev: false + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: false + + /resolve-alpn@1.2.1: + resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} + dev: false + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + + /resolve.exports@2.0.2: + resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /responselike@2.0.1: + resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} + dependencies: + lowercase-keys: 2.0.0 + dev: false + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /ret@0.4.3: + resolution: {integrity: sha512-0f4Memo5QP7WQyUEAYUO3esD/XjOc3Zjjg5CPsAq1p8sIu0XPeMbHJemKA0BO7tV0X7+A0FoEpbmHXWxPyD3wQ==} + engines: {node: '>=10'} + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + + /rfdc@1.3.1: + resolution: {integrity: sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==} + + /rimraf@2.7.1: + resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + deprecated: Rimraf versions prior to v4 are no longer supported + hasBin: true + dependencies: + glob: 7.2.3 + + /rimraf@5.0.7: + resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} + engines: {node: '>=14.18'} + hasBin: true + dependencies: + glob: 10.4.1 + + /robots-parser@3.0.1: + resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} + engines: {node: '>=10.0.0'} + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + dev: false + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex2@3.1.0: + resolution: {integrity: sha512-RAAZAGbap2kBfbVhvmnTFv73NWLMvDGOITFYTZBAaY8eR+Ir4ef7Up/e7amo+y1+AH+3PtLkrt9mvcTsG9LXug==} + dependencies: + ret: 0.4.3 + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /sax@1.4.1: + resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + dev: false + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: false + + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /semver@7.6.2: + resolution: {integrity: sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==} + engines: {node: '>=10'} + hasBin: true + + /seq-queue@0.0.5: + resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} + + /set-cookie-parser@2.6.0: + resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} + + /setimmediate@1.0.5: + resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /sitemapper@3.2.8: + resolution: {integrity: sha512-xs1W76bRtJYn6WLQePX1QQaBBjhZgaimu1LbskJ9/8nv71Y+YSM3XRMdLYSiLeObCKuUh45zk+AOUUMKbVMbmg==} + engines: {node: '>= 10.0.0'} + dependencies: + got: 11.8.6 + is-gzip: 2.0.0 + p-limit: 3.1.0 + xml2js: 0.4.23 + dev: false + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + + /socks-proxy-agent@8.0.3: + resolution: {integrity: sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==} + engines: {node: '>= 14'} + dependencies: + agent-base: 7.1.1 + debug: 4.3.5 + socks: 2.8.3 + transitivePeerDependencies: + - supports-color + + /socks@2.8.3: + resolution: {integrity: sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==} + engines: {node: '>= 10.0.0', npm: '>= 3.0.0'} + dependencies: + ip-address: 9.0.5 + smart-buffer: 4.2.0 + + /sonic-boom@3.8.1: + resolution: {integrity: sha512-y4Z8LCDBuum+PBP3lSV7RHrXscqksve/bi0as7mhwVnBW+/wUqKT/2Kb7um8yqcFy0duYbbPxzt89Zy2nOCaxg==} + dependencies: + atomic-sleep: 1.0.0 + dev: false + + /sonic-boom@4.0.1: + resolution: {integrity: sha512-hTSD/6JMLyT4r9zeof6UtuBDpjJ9sO08/nmS5djaA9eozT9oOlNdpXSnzcgj4FTqpk3nkLrs61l4gip9r1HCrQ==} + dependencies: + atomic-sleep: 1.0.0 + + /source-map-support@0.5.13: + resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: true + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /speedline-core@1.4.3: + resolution: {integrity: sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==} + engines: {node: '>=8.0'} + dependencies: + '@types/node': 18.19.33 + image-ssim: 0.2.0 + jpeg-js: 0.4.4 + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + + /sprintf-js@1.1.3: + resolution: {integrity: sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==} + + /sqlstring@2.3.3: + resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} + engines: {node: '>= 0.6'} + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stdin-discarder@0.2.2: + resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} + engines: {node: '>=18'} + dev: false + + /streamx@2.18.0: + resolution: {integrity: sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==} + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + text-decoder: 1.1.0 + optionalDependencies: + bare-events: 2.3.1 + + /string-argv@0.3.2: + resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} + engines: {node: '>=0.6.19'} + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: true + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + dev: true + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + dev: true + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.7 + dev: false + + /tar-fs@3.0.5: + resolution: {integrity: sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==} + dependencies: + pump: 3.0.0 + tar-stream: 3.1.7 + optionalDependencies: + bare-fs: 2.3.0 + bare-path: 2.1.3 + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /tar-stream@3.1.7: + resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} + dependencies: + b4a: 1.6.6 + fast-fifo: 1.3.2 + streamx: 2.18.0 + + /tarn@3.0.2: + resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} + engines: {node: '>=8.0.0'} + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-decoder@1.1.0: + resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} + dependencies: + b4a: 1.6.6 + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /third-party-web@0.24.3: + resolution: {integrity: sha512-imE6hXZyaCeGinGFCvpWsv0oelsEaufSG39qYBQhp3urGq4OLOtsuEddf3XgKxmAAczBD/I1Tnp8L3gJ3ksTuQ==} + + /thread-stream@2.7.0: + resolution: {integrity: sha512-qQiRWsU/wvNolI6tbbCKd9iKaTnCXsTwVxhhKM6nctPdujTyztjlbUkUTUymidWcMnZ5pWR0ej4a0tjsW021vw==} + dependencies: + real-require: 0.2.0 + dev: false + + /thread-stream@3.0.2: + resolution: {integrity: sha512-cBL4xF2A3lSINV4rD5tyqnKH4z/TgWPvT+NaVhJDSwK962oo/Ye7cHSMbDzwcu7tAE1SfU6Q4XtV6Hucmi6Hlw==} + dependencies: + real-require: 0.2.0 + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /thymeleaf@0.20.5: + resolution: {integrity: sha512-3LGXOiKWoJthENI+5oSUy6Y4XhYrQEq8WgoIEiJQixatycTVWPZY1UAiq8gMazcknXGJkVRSMD9OJv42v7uktw==} + engines: {node: '>=10'} + dependencies: + '@babel/runtime': 7.24.6 + '@ultraq/array-utils': 2.1.0 + '@ultraq/dom-utils': 0.4.0 + '@ultraq/string-utils': 2.1.0 + dumb-query-selector: 3.3.0 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: false + + /tildify@2.0.0: + resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} + engines: {node: '>=8'} + + /tldts-core@6.1.23: + resolution: {integrity: sha512-NoYYa06h5WN9BU4wjpVK/bKg3fw2BlhZSB1omr+CkEygSzhe5Ojp8mTFae93eVV2mv7d/ootxPqVhW1GoCeogw==} + + /tldts-icann@6.1.23: + resolution: {integrity: sha512-mG4ponflAVI4lsVPpqB5BAYhuWAkm5GuOk99lS5YSouy1KYfpL6mfmQkOJabOTtP6i8M2bTtMxX8YxXpc6ta9Q==} + dependencies: + tldts-core: 6.1.23 + + /tmp@0.2.3: + resolution: {integrity: sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w==} + engines: {node: '>=14.14'} + dev: false + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /toad-cache@3.7.0: + resolution: {integrity: sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw==} + engines: {node: '>=12'} + + /tough-cookie@4.0.0: + resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.1.2 + dev: false + + /tough-cookie@4.1.4: + resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.1 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.1 + dev: false + + /traverse@0.3.9: + resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} + dev: false + + /ts-api-utils@1.3.0(typescript@5.4.5): + resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} + engines: {node: '>=16'} + peerDependencies: + typescript: '>=4.2.0' + dependencies: + typescript: 5.4.5 + dev: true + + /ts-jest@29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5): + resolution: {integrity: sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q==} + engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@jest/transform': ^29.0.0 + '@jest/types': ^29.0.0 + babel-jest: ^29.0.0 + esbuild: '*' + jest: ^29.0.0 + typescript: '>=4.3 <6' + peerDependenciesMeta: + '@babel/core': + optional: true + '@jest/transform': + optional: true + '@jest/types': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.24.6 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest-util: 29.7.0 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.6.2 + typescript: 5.4.5 + yargs-parser: 21.1.1 + dev: true + + /ts-morph@20.0.0: + resolution: {integrity: sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==} + dependencies: + '@ts-morph/common': 0.21.0 + code-block-writer: 12.0.0 + dev: false + + /ts-node@10.9.2(@types/node@18.19.33)(typescript@5.4.5): + resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.11 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 18.19.33 + acorn: 8.11.3 + acorn-walk: 8.3.2 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 5.4.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths@4.2.0: + resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} + engines: {node: '>=6'} + dependencies: + json5: 2.2.3 + minimist: 1.2.8 + strip-bom: 3.0.0 + dev: true + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + dev: true + + /type-fest@3.13.1: + resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} + engines: {node: '>=14.16'} + + /type-fest@4.18.3: + resolution: {integrity: sha512-Q08/0IrpvM+NMY9PA2rti9Jb+JejTddwmwmVQGskAlhtcrw1wsRzoR6ode6mR+OAabNa75w/dxedSUY2mlphaQ==} + engines: {node: '>=16'} + dev: true + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + + /typescript@5.4.5: + resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} + engines: {node: '>=14.17'} + hasBin: true + + /umzug@3.3.1(@types/node@18.19.33): + resolution: {integrity: sha512-jG3C35jti1YnCuH/k3fJEfHbnIG9c3Q9ITZ0B9eWwnXngh/AUd0mRHv8OdpE2Q9VoK7tB6xL990JrMCr0LtfNA==} + engines: {node: '>=12'} + dependencies: + '@rushstack/ts-command-line': 4.22.0(@types/node@18.19.33) + emittery: 0.13.1 + glob: 8.1.0 + pony-cause: 2.1.11 + type-fest: 3.13.1 + transitivePeerDependencies: + - '@types/node' + + /unbzip2-stream@1.4.3: + resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} + dependencies: + buffer: 5.7.1 + through: 2.3.8 + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + + /unique-string@2.0.0: + resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} + engines: {node: '>=8'} + dependencies: + crypto-random-string: 2.0.0 + + /universalify@0.1.2: + resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} + engines: {node: '>= 4.0.0'} + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: false + + /universalify@2.0.1: + resolution: {integrity: sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==} + engines: {node: '>= 10.0.0'} + + /unzipper@0.10.14: + resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} + dependencies: + big-integer: 1.6.52 + binary: 0.3.0 + bluebird: 3.4.7 + buffer-indexof-polyfill: 1.0.2 + duplexer2: 0.1.4 + fstream: 1.0.12 + graceful-fs: 4.2.11 + listenercount: 1.0.1 + readable-stream: 2.3.8 + setimmediate: 1.0.5 + dev: false + + /update-browserslist-db@1.0.16(browserslist@4.23.0): + resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.2 + picocolors: 1.0.1 + dev: true + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.1 + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: false + + /urlpattern-polyfill@10.0.0: + resolution: {integrity: sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==} + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /uuid@8.0.0: + resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} + hasBin: true + dev: false + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + dev: false + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-to-istanbul@9.2.0: + resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} + engines: {node: '>=10.12.0'} + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + '@types/istanbul-lib-coverage': 2.0.6 + convert-source-map: 2.0.0 + dev: true + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: false + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: false + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: false + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: false + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: false + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /word-wrap@1.2.5: + resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} + engines: {node: '>=0.10.0'} + dev: true + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + + /write-file-atomic@4.0.2: + resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + imurmurhash: 0.1.4 + signal-exit: 3.0.7 + dev: true + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /ws@8.16.0: + resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + dev: false + + /ws@8.17.0: + resolution: {integrity: sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==} + engines: {node: '>=10.0.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: '>=5.0.2' + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xdg-basedir@4.0.0: + resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} + engines: {node: '>=8'} + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: false + + /xml2js@0.4.23: + resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} + engines: {node: '>=4.0.0'} + dependencies: + sax: 1.4.1 + xmlbuilder: 11.0.1 + dev: false + + /xmlbuilder@11.0.1: + resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} + engines: {node: '>=4.0'} + dev: false + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: false + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + dev: false + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: false + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.2 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + + /yauzl@2.10.0: + resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} + dependencies: + buffer-crc32: 0.2.13 + fd-slicer: 1.1.0 + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + + /zip-stream@4.1.1: + resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} + engines: {node: '>= 10'} + dependencies: + archiver-utils: 3.0.4 + compress-commons: 4.1.2 + readable-stream: 3.6.2 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + + github.com/cnumr/GreenIT-Analysis-cli/a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571: + resolution: {tarball: https://codeload.github.com/cnumr/GreenIT-Analysis-cli/tar.gz/a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571} + name: greenit-cli + version: 1.0.0 + hasBin: true + requiresBuild: true + dependencies: + axios: 0.21.4 + concat-files: 0.1.1 + exceljs: 4.4.0 + glob: 7.2.3 + progress: 2.0.3 + puppeteer: 5.5.0 + puppeteer-har: 1.1.2(puppeteer@5.5.0) + sitemapper: 3.2.8 + thymeleaf: 0.20.5 + yaml: 1.10.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - debug + - encoding + - supports-color + - utf-8-validate + dev: false diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 00000000..6366f46e --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - 'modules/*' \ No newline at end of file From 8253959a537664c9ab744d83d9547f951b9582ad Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 18:16:59 +0200 Subject: [PATCH 07/28] feat: set default package manager and sync reference in tsconfig --- .moon/toolchain.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.moon/toolchain.yml b/.moon/toolchain.yml index f579d014..f647e453 100644 --- a/.moon/toolchain.yml +++ b/.moon/toolchain.yml @@ -1,3 +1,7 @@ $schema: 'https://moonrepo.dev/schemas/toolchain.json' -node: {} \ No newline at end of file +node: + packageManager: pnpm + +typescript: + syncProjectReferences: true \ No newline at end of file From e2708e625c86317128b2d7315a35fc54f5b782ad Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 18:17:31 +0200 Subject: [PATCH 08/28] feat: set tasks --- .moon/tasks.yml | 13 +++++++++++++ modules/api/package.json | 6 +----- modules/cli/package.json | 6 +----- modules/common/package.json | 6 +----- modules/greenit/package.json | 6 +----- modules/lighthouse/package.json | 6 +----- modules/mysql/package.json | 6 +----- modules/observatory/package.json | 6 +----- modules/slack/package.json | 6 +----- modules/ssllabs-server/package.json | 6 +----- 10 files changed, 22 insertions(+), 45 deletions(-) create mode 100644 .moon/tasks.yml diff --git a/.moon/tasks.yml b/.moon/tasks.yml new file mode 100644 index 00000000..82a90848 --- /dev/null +++ b/.moon/tasks.yml @@ -0,0 +1,13 @@ +tasks: + build: + command: tsc --project tsconfig.build.json + deps: + - ~:cleanup + cleanup: + command: rimraf lib + lint: + command: eslint . + test: + command: jest + env: + NODE_OPTIONS: --experimental-vm-modules \ No newline at end of file diff --git a/modules/api/package.json b/modules/api/package.json index 8bda38a3..e3e65e13 100644 --- a/modules/api/package.json +++ b/modules/api/package.json @@ -27,11 +27,7 @@ ".env.schema.json" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0", diff --git a/modules/cli/package.json b/modules/cli/package.json index eea40ad0..8eff5e9a 100644 --- a/modules/cli/package.json +++ b/modules/cli/package.json @@ -29,11 +29,7 @@ "lib/**/*" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0", diff --git a/modules/common/package.json b/modules/common/package.json index 27507cbf..e5eda6aa 100644 --- a/modules/common/package.json +++ b/modules/common/package.json @@ -25,11 +25,7 @@ "lib/**/*" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@mikro-orm/core": "^5.9.7", diff --git a/modules/greenit/package.json b/modules/greenit/package.json index 5665f8df..4dcad73a 100644 --- a/modules/greenit/package.json +++ b/modules/greenit/package.json @@ -34,11 +34,7 @@ ".env.schema.json" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0", diff --git a/modules/lighthouse/package.json b/modules/lighthouse/package.json index 19faa812..d30f8969 100644 --- a/modules/lighthouse/package.json +++ b/modules/lighthouse/package.json @@ -28,11 +28,7 @@ ".env.schema.json" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0", diff --git a/modules/mysql/package.json b/modules/mysql/package.json index 571e74fa..0baf3559 100644 --- a/modules/mysql/package.json +++ b/modules/mysql/package.json @@ -27,11 +27,7 @@ ".env.schema.json" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest --passWithNoTests" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0", diff --git a/modules/observatory/package.json b/modules/observatory/package.json index 644dd46a..c61c2790 100644 --- a/modules/observatory/package.json +++ b/modules/observatory/package.json @@ -27,11 +27,7 @@ ".env.schema.json" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest --no-cache" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0" diff --git a/modules/slack/package.json b/modules/slack/package.json index 256f3e16..4e33702d 100644 --- a/modules/slack/package.json +++ b/modules/slack/package.json @@ -27,11 +27,7 @@ ".env.schema.json" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest --passWithNoTests" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0", diff --git a/modules/ssllabs-server/package.json b/modules/ssllabs-server/package.json index 1033023c..75f241a0 100644 --- a/modules/ssllabs-server/package.json +++ b/modules/ssllabs-server/package.json @@ -27,11 +27,7 @@ ".env.schema.json" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest --passWithNoTests" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0" From 290c535b0d2fde2500fc2fe12d06af0520fcaf00 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 20:15:16 +0200 Subject: [PATCH 09/28] feat: put contributors tools to the root of the workspace --- modules/api/package.json | 11 +- modules/cli/package.json | 11 +- modules/common/package.json | 11 +- modules/greenit/package.json | 11 +- modules/lighthouse/package.json | 11 +- modules/mysql/package.json | 11 +- modules/observatory/package.json | 11 +- modules/slack/package.json | 11 +- modules/ssllabs-server/package.json | 11 +- modules/tpl/package.json | 11 +- package.json | 13 + pnpm-lock.yaml | 373 +++++----------------------- 12 files changed, 89 insertions(+), 407 deletions(-) create mode 100644 package.json diff --git a/modules/api/package.json b/modules/api/package.json index e3e65e13..7574e3a5 100644 --- a/modules/api/package.json +++ b/modules/api/package.json @@ -37,18 +37,9 @@ "fastify": "^4.25.2" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", "@types/express": "^4.17.21", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" + "rimraf": "^5.0.5" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/cli/package.json b/modules/cli/package.json index 8eff5e9a..a5b364b5 100644 --- a/modules/cli/package.json +++ b/modules/cli/package.json @@ -41,20 +41,11 @@ "ora": "^8.0.1" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", "@fastify/cors": "^8.5.0", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", "fastify": "^4.25.2", - "jest": "^29.7.0", "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "type-fest": "^4.9.0", - "typescript": "^5.3.3" + "type-fest": "^4.9.0" }, "engines": { "node": ">=18 <22" diff --git a/modules/common/package.json b/modules/common/package.json index e5eda6aa..f6f0af77 100644 --- a/modules/common/package.json +++ b/modules/common/package.json @@ -36,22 +36,13 @@ "pino-pretty": "^10.3.1" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", "@fastify/cors": "^8.5.0", - "@jest/globals": "^29.7.0", "@types/har-format": "^1.2.15", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", "fastify": "^4.25.2", - "jest": "^29.7.0", "lighthouse": "^11.4.0", "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "type-fest": "^4.9.0", - "typescript": "^5.3.3" + "type-fest": "^4.9.0" }, "engines": { "node": ">=18 <22" diff --git a/modules/greenit/package.json b/modules/greenit/package.json index 4dcad73a..75925c2c 100644 --- a/modules/greenit/package.json +++ b/modules/greenit/package.json @@ -43,16 +43,7 @@ "rimraf": "^5.0.5" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", - "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", - "jest": "^29.7.0", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" + "@types/node": "^18.19.6" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/lighthouse/package.json b/modules/lighthouse/package.json index d30f8969..f8974598 100644 --- a/modules/lighthouse/package.json +++ b/modules/lighthouse/package.json @@ -36,17 +36,8 @@ "puppeteer": "^21.7.0" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" + "rimraf": "^5.0.5" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/mysql/package.json b/modules/mysql/package.json index 0baf3559..6e979cd0 100644 --- a/modules/mysql/package.json +++ b/modules/mysql/package.json @@ -36,19 +36,10 @@ "@mikro-orm/mysql": "^5.9.7" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", "@mikro-orm/cli": "^5.9.7", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", - "jest": "^29.7.0", "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "ts-node": "^10.9.1", - "typescript": "^5.3.3" + "ts-node": "^10.9.1" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/observatory/package.json b/modules/observatory/package.json index c61c2790..6d319303 100644 --- a/modules/observatory/package.json +++ b/modules/observatory/package.json @@ -33,17 +33,8 @@ "@fabernovel/heart-common": "workspace:^4.0.0" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" + "rimraf": "^5.0.5" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/slack/package.json b/modules/slack/package.json index 4e33702d..ac5ef26d 100644 --- a/modules/slack/package.json +++ b/modules/slack/package.json @@ -34,17 +34,8 @@ "@slack/web-api": "^6.11.2" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" + "rimraf": "^5.0.5" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/ssllabs-server/package.json b/modules/ssllabs-server/package.json index 75f241a0..337d2785 100644 --- a/modules/ssllabs-server/package.json +++ b/modules/ssllabs-server/package.json @@ -33,17 +33,8 @@ "@fabernovel/heart-common": "workspace:^4.0.0" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" + "rimraf": "^5.0.5" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/tpl/package.json b/modules/tpl/package.json index e7473349..559ed154 100644 --- a/modules/tpl/package.json +++ b/modules/tpl/package.json @@ -35,17 +35,8 @@ "@fabernovel/heart-common": "workspace:^4.0.0" }, "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", "@types/node": "^18.19.6", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "^8.56.0", - "jest": "^29.7.0", - "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" + "rimraf": "^5.0.5" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/package.json b/package.json new file mode 100644 index 00000000..05e0afb0 --- /dev/null +++ b/package.json @@ -0,0 +1,13 @@ +{ + "devDependencies": { + "@ecocode/eslint-plugin": "^1.4.0", + "@jest/globals": "^29.7.0", + "@types/jest": "^29.5.11", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser": "^6.18.1", + "eslint": "8.56.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "typescript": "^5.3.3" + } +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0a5b3f4..1ff5722f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -6,6 +6,36 @@ settings: importers: + .: + devDependencies: + '@ecocode/eslint-plugin': + specifier: ^1.4.0 + version: 1.5.0(eslint@8.56.0) + '@jest/globals': + specifier: ^29.7.0 + version: 29.7.0 + '@types/jest': + specifier: ^29.5.11 + version: 29.5.12 + '@typescript-eslint/eslint-plugin': + specifier: ^6.18.1 + version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/parser': + specifier: ^6.18.1 + version: 6.21.0(eslint@8.56.0)(typescript@5.4.5) + eslint: + specifier: 8.56.0 + version: 8.56.0 + jest: + specifier: ^29.7.0 + version: 29.7.0 + ts-jest: + specifier: ^29.1.1 + version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + typescript: + specifier: ^5.3.3 + version: 5.4.5 + modules/api: dependencies: '@fabernovel/heart-cli': @@ -27,42 +57,15 @@ importers: specifier: ^4.25.2 version: 4.27.0 devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 '@types/express': specifier: ^4.17.21 version: 4.17.21 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/cli: dependencies: @@ -88,48 +91,21 @@ importers: specifier: ^8.0.1 version: 8.0.1 devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) '@fastify/cors': specifier: ^8.5.0 version: 8.5.0 - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 fastify: specifier: ^4.25.2 version: 4.27.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) type-fest: specifier: ^4.9.0 version: 4.18.3 - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/common: dependencies: @@ -152,54 +128,27 @@ importers: specifier: ^10.3.1 version: 10.3.1 devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) '@fastify/cors': specifier: ^8.5.0 version: 8.5.0 - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 '@types/har-format': specifier: ^1.2.15 version: 1.2.15 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 fastify: specifier: ^4.25.2 version: 4.27.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) lighthouse: specifier: ^11.4.0 version: 11.7.1 rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) type-fest: specifier: ^4.9.0 version: 4.18.3 - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/greenit: dependencies: @@ -219,36 +168,9 @@ importers: specifier: ^5.0.5 version: 5.0.7 devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/lighthouse: dependencies: @@ -265,39 +187,12 @@ importers: specifier: ^21.7.0 version: 21.11.0(typescript@5.4.5) devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/mysql: dependencies: @@ -317,45 +212,18 @@ importers: specifier: ^5.9.7 version: 5.9.8(@mikro-orm/core@5.9.8)(@mikro-orm/migrations@5.9.8) devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 '@mikro-orm/cli': specifier: ^5.9.7 version: 5.9.8(@mikro-orm/migrations@5.9.8)(@mikro-orm/mysql@5.9.8) - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@18.19.33)(typescript@5.4.5) - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/observatory: dependencies: @@ -366,39 +234,12 @@ importers: specifier: workspace:^4.0.0 version: link:../common devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/slack: dependencies: @@ -412,39 +253,12 @@ importers: specifier: ^6.11.2 version: 6.12.0 devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/ssllabs-server: dependencies: @@ -455,39 +269,12 @@ importers: specifier: workspace:^4.0.0 version: link:../common devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) - typescript: - specifier: ^5.3.3 - version: 5.4.5 modules/tpl: dependencies: @@ -498,39 +285,12 @@ importers: specifier: workspace:^4.0.0 version: link:../common devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.57.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.12 '@types/node': specifier: ^18.19.6 version: 18.19.33 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.57.0)(typescript@5.4.5) - eslint: - specifier: ^8.56.0 - version: 8.57.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) rimraf: specifier: ^5.0.5 version: 5.0.7 - ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) - typescript: - specifier: ^5.3.3 - version: 5.4.5 packages: @@ -880,22 +640,22 @@ packages: '@jridgewell/trace-mapping': 0.3.9 dev: true - /@ecocode/eslint-plugin@1.5.0(eslint@8.57.0): + /@ecocode/eslint-plugin@1.5.0(eslint@8.56.0): resolution: {integrity: sha512-q2WBsKw4C/z1mS0lACAkkxPKfTjEj0PbGeFk58bYZW4Bs2A/VHf5epmQOmx9QrPBm6xWY49goH7MZRTfaNqT7w==} engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} peerDependencies: eslint: '>=7' dependencies: - eslint: 8.57.0 + eslint: 8.56.0 dev: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.57.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 dependencies: - eslint: 8.57.0 + eslint: 8.56.0 eslint-visitor-keys: 3.4.3 dev: true @@ -921,8 +681,8 @@ packages: - supports-color dev: true - /@eslint/js@8.57.0: - resolution: {integrity: sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==} + /@eslint/js@8.56.0: + resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -1071,7 +831,7 @@ packages: slash: 3.0.0 dev: true - /@jest/core@29.7.0(ts-node@10.9.2): + /@jest/core@29.7.0: resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -1092,7 +852,7 @@ packages: exit: 0.1.2 graceful-fs: 4.2.11 jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.19.33) jest-haste-map: 29.7.0 jest-message-util: 29.7.0 jest-regex-util: 29.6.3 @@ -1963,7 +1723,7 @@ packages: '@types/node': 18.19.33 optional: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.4.5): resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -1975,13 +1735,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.5 - eslint: 8.57.0 + eslint: 8.56.0 graphemer: 1.4.0 ignore: 5.3.1 natural-compare: 1.4.0 @@ -1992,7 +1752,7 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.21.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5): resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -2007,7 +1767,7 @@ packages: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) '@typescript-eslint/visitor-keys': 6.21.0 debug: 4.3.5 - eslint: 8.57.0 + eslint: 8.56.0 typescript: 5.4.5 transitivePeerDependencies: - supports-color @@ -2021,7 +1781,7 @@ packages: '@typescript-eslint/visitor-keys': 6.21.0 dev: true - /@typescript-eslint/type-utils@6.21.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.4.5): resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -2032,9 +1792,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.57.0)(typescript@5.4.5) + '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) debug: 4.3.5 - eslint: 8.57.0 + eslint: 8.56.0 ts-api-utils: 1.3.0(typescript@5.4.5) typescript: 5.4.5 transitivePeerDependencies: @@ -2068,19 +1828,19 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.21.0(eslint@8.57.0)(typescript@5.4.5): + /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.4.5): resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@types/json-schema': 7.0.15 '@types/semver': 7.5.8 '@typescript-eslint/scope-manager': 6.21.0 '@typescript-eslint/types': 6.21.0 '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - eslint: 8.57.0 + eslint: 8.56.0 semver: 7.6.2 transitivePeerDependencies: - supports-color @@ -2930,7 +2690,7 @@ packages: readable-stream: 3.6.2 dev: false - /create-jest@29.7.0(@types/node@18.19.33)(ts-node@10.9.2): + /create-jest@29.7.0: resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -2939,7 +2699,7 @@ packages: chalk: 4.1.2 exit: 0.1.2 graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.19.33) jest-util: 29.7.0 prompts: 2.4.2 transitivePeerDependencies: @@ -3270,15 +3030,15 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.57.0: - resolution: {integrity: sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==} + /eslint@8.56.0: + resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.57.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) '@eslint-community/regexpp': 4.10.0 '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.57.0 + '@eslint/js': 8.56.0 '@humanwhocodes/config-array': 0.11.14 '@humanwhocodes/module-importer': 1.0.1 '@nodelib/fs.walk': 1.2.8 @@ -4226,7 +3986,7 @@ packages: - supports-color dev: true - /jest-cli@29.7.0(@types/node@18.19.33)(ts-node@10.9.2): + /jest-cli@29.7.0: resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4236,14 +3996,14 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0 '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + create-jest: 29.7.0 exit: 0.1.2 import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest-config: 29.7.0(@types/node@18.19.33) jest-util: 29.7.0 jest-validate: 29.7.0 yargs: 17.7.2 @@ -4254,7 +4014,7 @@ packages: - ts-node dev: true - /jest-config@29.7.0(@types/node@18.19.33)(ts-node@10.9.2): + /jest-config@29.7.0(@types/node@18.19.33): resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: @@ -4289,7 +4049,6 @@ packages: pretty-format: 29.7.0 slash: 3.0.0 strip-json-comments: 3.1.1 - ts-node: 10.9.2(@types/node@18.19.33)(typescript@5.4.5) transitivePeerDependencies: - babel-plugin-macros - supports-color @@ -4578,7 +4337,7 @@ packages: supports-color: 8.1.1 dev: true - /jest@29.7.0(@types/node@18.19.33)(ts-node@10.9.2): + /jest@29.7.0: resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} hasBin: true @@ -4588,10 +4347,10 @@ packages: node-notifier: optional: true dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2) + '@jest/core': 29.7.0 '@jest/types': 29.6.3 import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest-cli: 29.7.0 transitivePeerDependencies: - '@types/node' - babel-plugin-macros @@ -6375,7 +6134,7 @@ packages: '@babel/core': 7.24.6 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.33)(ts-node@10.9.2) + jest: 29.7.0 jest-util: 29.7.0 json5: 2.2.3 lodash.memoize: 4.1.2 From 6bb68d9b25c20fae49d729dd6ff3b8d7c8feac7b Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 20:41:01 +0200 Subject: [PATCH 10/28] refactor: remove explicit dependencies, as the node plugin can guess from package.json file --- modules/api/moon.yml | 5 ----- modules/cli/moon.yml | 3 --- modules/greenit/moon.yml | 5 ----- modules/lighthouse/moon.yml | 5 ----- modules/mysql/moon.yml | 5 ----- modules/observatory/moon.yml | 5 ----- modules/slack/moon.yml | 5 ----- modules/ssllabs-server/moon.yml | 5 ----- 8 files changed, 38 deletions(-) diff --git a/modules/api/moon.yml b/modules/api/moon.yml index 0e2d822e..57223271 100644 --- a/modules/api/moon.yml +++ b/modules/api/moon.yml @@ -1,8 +1,3 @@ -dependsOn: - - id: 'common' - scope: 'production' - - id: 'cli' - scope: 'peer' language: typescript project: name: Heart REST API diff --git a/modules/cli/moon.yml b/modules/cli/moon.yml index 0a6d9180..3e7e0786 100644 --- a/modules/cli/moon.yml +++ b/modules/cli/moon.yml @@ -1,6 +1,3 @@ -dependsOn: - - id: 'common' - scope: 'production' language: typescript project: name: Heart CLI diff --git a/modules/greenit/moon.yml b/modules/greenit/moon.yml index a5ac651d..708d2487 100644 --- a/modules/greenit/moon.yml +++ b/modules/greenit/moon.yml @@ -1,8 +1,3 @@ -dependsOn: - - id: 'common' - scope: 'production' - - id: 'cli' - scope: 'peer' language: typescript project: name: Heart GreenIT diff --git a/modules/lighthouse/moon.yml b/modules/lighthouse/moon.yml index 69d64044..8e978be6 100644 --- a/modules/lighthouse/moon.yml +++ b/modules/lighthouse/moon.yml @@ -1,8 +1,3 @@ -dependsOn: - - id: 'common' - scope: 'production' - - id: 'cli' - scope: 'peer' language: typescript project: name: Heart Lighthouse diff --git a/modules/mysql/moon.yml b/modules/mysql/moon.yml index 90ee35f9..391ea1b7 100644 --- a/modules/mysql/moon.yml +++ b/modules/mysql/moon.yml @@ -1,8 +1,3 @@ -dependsOn: - - id: 'common' - scope: 'production' - - id: 'cli' - scope: 'peer' language: typescript project: name: Heart MySQL diff --git a/modules/observatory/moon.yml b/modules/observatory/moon.yml index 96177174..233acbc9 100644 --- a/modules/observatory/moon.yml +++ b/modules/observatory/moon.yml @@ -1,8 +1,3 @@ -dependsOn: - - id: 'common' - scope: 'production' - - id: 'cli' - scope: 'peer' language: typescript project: name: Heart Observatory diff --git a/modules/slack/moon.yml b/modules/slack/moon.yml index 209ed187..290ed2d8 100644 --- a/modules/slack/moon.yml +++ b/modules/slack/moon.yml @@ -1,8 +1,3 @@ -dependsOn: - - id: 'common' - scope: 'production' - - id: 'cli' - scope: 'peer' language: typescript project: name: Heart Slack diff --git a/modules/ssllabs-server/moon.yml b/modules/ssllabs-server/moon.yml index 31c45202..c12429cf 100644 --- a/modules/ssllabs-server/moon.yml +++ b/modules/ssllabs-server/moon.yml @@ -1,8 +1,3 @@ -dependsOn: - - id: 'common' - scope: 'production' - - id: 'cli' - scope: 'peer' language: typescript project: name: Heart SSLLabs Server From 645c15a9e49edf5e6f098a6ca10bcceb8dd51c0c Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 21:12:03 +0200 Subject: [PATCH 11/28] feat: fix build --- .gitignore | 10 +++--- .../_abandoned/bigquery/tsconfig.build.json | 2 +- .../_abandoned/dareboost/tsconfig.build.json | 2 +- modules/api/tsconfig.build.json | 5 +-- modules/api/tsconfig.json | 24 ++++++++++--- modules/cli/tsconfig.build.json | 5 +-- modules/cli/tsconfig.json | 22 ++++++++---- modules/common/src/error/InputError.ts | 2 +- modules/common/src/time/timeout.ts | 5 +-- .../input/analysis/AnalysisInputValidation.ts | 6 ++-- .../input/server/ServerInputValidation.ts | 6 ++-- modules/common/tsconfig.build.json | 5 +-- modules/common/tsconfig.json | 14 +++++--- modules/greenit/tests/GreenITModule.test.ts | 2 +- modules/greenit/tsconfig.build.json | 5 +-- modules/greenit/tsconfig.json | 25 ++++++++++---- modules/lighthouse/tsconfig.build.json | 5 +-- modules/lighthouse/tsconfig.json | 25 ++++++++++---- modules/mysql/tsconfig.build.json | 5 +-- modules/mysql/tsconfig.json | 25 ++++++++++---- modules/observatory/tsconfig.build.json | 5 +-- modules/observatory/tsconfig.json | 25 ++++++++++---- modules/slack/tsconfig.build.json | 5 +-- modules/slack/tsconfig.json | 24 ++++++++++--- modules/ssllabs-server/tsconfig.build.json | 5 +-- modules/ssllabs-server/tsconfig.json | 24 ++++++++++--- modules/tpl/tsconfig.build.json | 2 +- package.json | 27 +++++++++------ pnpm-lock.yaml | 7 ++++ tsconfig.json | 34 +++++++++++++++++++ .../tsconfig.json => tsconfig.options.json | 8 ++--- 31 files changed, 270 insertions(+), 96 deletions(-) create mode 100644 tsconfig.json rename modules/tsconfig.json => tsconfig.options.json (94%) diff --git a/.gitignore b/.gitignore index 61f5f951..df0b9a1d 100644 --- a/.gitignore +++ b/.gitignore @@ -33,7 +33,9 @@ common/autoinstallers/*/.npmrc # MikroORM temporary directory modules/*/temp -test/temp -# moon -.moon/cache -.moon/docker +test/temp +# moon +.moon/cache +.moon/docker + +*.tsbuildinfo diff --git a/modules/_abandoned/bigquery/tsconfig.build.json b/modules/_abandoned/bigquery/tsconfig.build.json index 28255d08..65be6db9 100644 --- a/modules/_abandoned/bigquery/tsconfig.build.json +++ b/modules/_abandoned/bigquery/tsconfig.build.json @@ -8,5 +8,5 @@ "removeComments": true }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/_abandoned/dareboost/tsconfig.build.json b/modules/_abandoned/dareboost/tsconfig.build.json index 52c4e3f9..9443796c 100644 --- a/modules/_abandoned/dareboost/tsconfig.build.json +++ b/modules/_abandoned/dareboost/tsconfig.build.json @@ -7,5 +7,5 @@ "outDir": "lib" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/api/tsconfig.build.json b/modules/api/tsconfig.build.json index 52c4e3f9..55e1ee6e 100644 --- a/modules/api/tsconfig.build.json +++ b/modules/api/tsconfig.build.json @@ -4,8 +4,9 @@ "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/api/tsconfig.json b/modules/api/tsconfig.json index 8ae4b51d..8b8d48be 100644 --- a/modules/api/tsconfig.json +++ b/modules/api/tsconfig.json @@ -1,7 +1,23 @@ { "$schema": "http://json.schemastore.org/tsconfig", - - "extends": "../tsconfig.json", - - "include": ["src/**/*.ts", "tests/**/*.ts"] + "extends": "../../tsconfig.options.json", + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib", + "rootDir": "src" + }, + "references": [ + { + "path": "./tsconfig.build.json" + }, + { + "path": "../cli" + }, + { + "path": "../common" + } + ] } diff --git a/modules/cli/tsconfig.build.json b/modules/cli/tsconfig.build.json index 52c4e3f9..55e1ee6e 100644 --- a/modules/cli/tsconfig.build.json +++ b/modules/cli/tsconfig.build.json @@ -4,8 +4,9 @@ "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/cli/tsconfig.json b/modules/cli/tsconfig.json index e3459aad..fb98d747 100644 --- a/modules/cli/tsconfig.json +++ b/modules/cli/tsconfig.json @@ -1,12 +1,22 @@ { "$schema": "http://json.schemastore.org/tsconfig", - - "extends": "../tsconfig.json", - + "extends": "../../tsconfig.options.json", "compilerOptions": { "esModuleInterop": true, - "resolveJsonModule": true + "resolveJsonModule": true, + "outDir": "lib", + "rootDir": "src" }, - - "include": ["src/**/*.ts", "tests/**/*.ts"] + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.build.json" + }, + { + "path": "../common" + } + ] } diff --git a/modules/common/src/error/InputError.ts b/modules/common/src/error/InputError.ts index c2d56f7e..916641c5 100644 --- a/modules/common/src/error/InputError.ts +++ b/modules/common/src/error/InputError.ts @@ -1,7 +1,7 @@ import type { ErrorObject } from "ajv" export class InputError extends Error { - cause: ErrorObject[] = [] + override cause: ErrorObject[] = [] constructor(errors: ErrorObject[]) { super("Something went wrong with the input validation") diff --git a/modules/common/src/time/timeout.ts b/modules/common/src/time/timeout.ts index 0d90729d..6167b6cf 100644 --- a/modules/common/src/time/timeout.ts +++ b/modules/common/src/time/timeout.ts @@ -1,5 +1,6 @@ /** * This is Promise wrapper of the setTimeout() function. */ -export const timeout = (delay: number): Promise => - new Promise((resolve) => setTimeout(resolve, delay)) +export const timeout = (delay: number): Promise => + new Promise((resolve) => setTimeout(() => { + resolve() }, delay)) diff --git a/modules/common/src/validation/input/analysis/AnalysisInputValidation.ts b/modules/common/src/validation/input/analysis/AnalysisInputValidation.ts index 39204832..87af6d9a 100644 --- a/modules/common/src/validation/input/analysis/AnalysisInputValidation.ts +++ b/modules/common/src/validation/input/analysis/AnalysisInputValidation.ts @@ -1,9 +1,9 @@ import type { SchemaObject } from "ajv" import type { ModuleMetadata, ValidatedAnalysisInput } from "../../../index.js" import { validateInput } from "../InputValidation.js" -import configSchema from "./schema/config.json" assert { type: "json" } -import thresholdSchema from "./schema/threshold.json" assert { type: "json" } -import verboseSchema from "../schema/verbose.json" assert { type: "json" } +import configSchema from "./schema/config.json" with { type: "json" } +import thresholdSchema from "./schema/threshold.json" with { type: "json" } +import verboseSchema from "../schema/verbose.json" with { type: "json" } export function getAnalysisValidationSchema(listenerModulesIds: ModuleMetadata["id"][]): SchemaObject { const listenerSchema = { diff --git a/modules/common/src/validation/input/server/ServerInputValidation.ts b/modules/common/src/validation/input/server/ServerInputValidation.ts index 46e052c0..8205a80a 100644 --- a/modules/common/src/validation/input/server/ServerInputValidation.ts +++ b/modules/common/src/validation/input/server/ServerInputValidation.ts @@ -1,9 +1,9 @@ import type { SchemaObject } from "ajv" import type { ValidatedServerInput } from "../../../input/ServerInput.js" import { validateInput } from "../InputValidation.js" -import corsSchema from "./schema/cors.json" assert { type: "json" } -import portSchema from "./schema/port.json" assert { type: "json" } -import verboseSchema from "../schema/verbose.json" assert { type: "json" } +import corsSchema from "./schema/cors.json" with { type: "json" } +import portSchema from "./schema/port.json" with { type: "json" } +import verboseSchema from "../schema/verbose.json" with { type: "json" } function getValidationSchema(): SchemaObject { return { diff --git a/modules/common/tsconfig.build.json b/modules/common/tsconfig.build.json index 52c4e3f9..cabd906e 100644 --- a/modules/common/tsconfig.build.json +++ b/modules/common/tsconfig.build.json @@ -4,8 +4,9 @@ "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts", "*.json"] } diff --git a/modules/common/tsconfig.json b/modules/common/tsconfig.json index b476366d..c95558bd 100644 --- a/modules/common/tsconfig.json +++ b/modules/common/tsconfig.json @@ -1,14 +1,20 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "../tsconfig.json", + "extends": "../../tsconfig.options.json", "compilerOptions": { "emitDecoratorMetadata": true, "esModuleInterop": true, "experimentalDecorators": true, - "resolveJsonModule": true + "resolveJsonModule": true, }, - "include": ["src/**/*.ts", "tests/**/*.ts"] -} + "references": [ + { + "path": "./tsconfig.build.json" + } + ], + + "include": ["src/**/*", "tests/**/*", "*.ts", "*.json"] +} \ No newline at end of file diff --git a/modules/greenit/tests/GreenITModule.test.ts b/modules/greenit/tests/GreenITModule.test.ts index 8f7d212e..a387cbc8 100644 --- a/modules/greenit/tests/GreenITModule.test.ts +++ b/modules/greenit/tests/GreenITModule.test.ts @@ -1,7 +1,7 @@ import type { ModuleMetadata } from "@fabernovel/heart-common" import { jest } from "@jest/globals" import { Conf } from "./data/Conf.js" -import SuccessResult from "./data/SuccessResult.json" assert { type: "json" } +import SuccessResult from "./data/SuccessResult.json" with { type: "json" } jest.unstable_mockModule("greenit-cli/cli-core/analysis.js", () => ({ createJsonReports: jest.fn(), diff --git a/modules/greenit/tsconfig.build.json b/modules/greenit/tsconfig.build.json index 52c4e3f9..55e1ee6e 100644 --- a/modules/greenit/tsconfig.build.json +++ b/modules/greenit/tsconfig.build.json @@ -4,8 +4,9 @@ "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/greenit/tsconfig.json b/modules/greenit/tsconfig.json index c7f3f3b0..0929d7a1 100644 --- a/modules/greenit/tsconfig.json +++ b/modules/greenit/tsconfig.json @@ -1,12 +1,25 @@ { "$schema": "http://json.schemastore.org/tsconfig", - - "extends": "../tsconfig.json", - + "extends": "../../tsconfig.options.json", "compilerOptions": { "resolveJsonModule": true, - "esModuleInterop": true + "esModuleInterop": true, + "outDir": "lib", + "rootDir": "src" }, - - "include": ["src/**/*.ts", "tests/**/*.ts"] + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.build.json" + }, + { + "path": "../cli" + }, + { + "path": "../common" + } + ] } diff --git a/modules/lighthouse/tsconfig.build.json b/modules/lighthouse/tsconfig.build.json index edcfd3de..ed4d6754 100644 --- a/modules/lighthouse/tsconfig.build.json +++ b/modules/lighthouse/tsconfig.build.json @@ -5,8 +5,9 @@ "compilerOptions": { "esModuleInterop": false, - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/lighthouse/tsconfig.json b/modules/lighthouse/tsconfig.json index e547d27e..51834d5e 100644 --- a/modules/lighthouse/tsconfig.json +++ b/modules/lighthouse/tsconfig.json @@ -1,11 +1,24 @@ { "$schema": "http://json.schemastore.org/tsconfig", - - "extends": "../tsconfig.json", - + "extends": "../../tsconfig.options.json", "compilerOptions": { - "esModuleInterop": true + "esModuleInterop": true, + "outDir": "lib", + "rootDir": "src" }, - - "include": ["src/**/*.ts", "tests/**/*.ts"] + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.build.json" + }, + { + "path": "../cli" + }, + { + "path": "../common" + } + ] } diff --git a/modules/mysql/tsconfig.build.json b/modules/mysql/tsconfig.build.json index 52c4e3f9..55e1ee6e 100644 --- a/modules/mysql/tsconfig.build.json +++ b/modules/mysql/tsconfig.build.json @@ -4,8 +4,9 @@ "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/mysql/tsconfig.json b/modules/mysql/tsconfig.json index 8e2b231a..e97c7b75 100644 --- a/modules/mysql/tsconfig.json +++ b/modules/mysql/tsconfig.json @@ -1,13 +1,26 @@ { "$schema": "http://json.schemastore.org/tsconfig", - - "extends": "../tsconfig.json", - + "extends": "../../tsconfig.options.json", "compilerOptions": { "emitDecoratorMetadata": true, "esModuleInterop": true, - "experimentalDecorators": true + "experimentalDecorators": true, + "outDir": "lib", + "rootDir": "src" }, - - "include": ["src/**/*.ts", "tests/**/*.ts"] + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.build.json" + }, + { + "path": "../cli" + }, + { + "path": "../common" + } + ] } diff --git a/modules/observatory/tsconfig.build.json b/modules/observatory/tsconfig.build.json index edcfd3de..ed4d6754 100644 --- a/modules/observatory/tsconfig.build.json +++ b/modules/observatory/tsconfig.build.json @@ -5,8 +5,9 @@ "compilerOptions": { "esModuleInterop": false, - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/observatory/tsconfig.json b/modules/observatory/tsconfig.json index e547d27e..51834d5e 100644 --- a/modules/observatory/tsconfig.json +++ b/modules/observatory/tsconfig.json @@ -1,11 +1,24 @@ { "$schema": "http://json.schemastore.org/tsconfig", - - "extends": "../tsconfig.json", - + "extends": "../../tsconfig.options.json", "compilerOptions": { - "esModuleInterop": true + "esModuleInterop": true, + "outDir": "lib", + "rootDir": "src" }, - - "include": ["src/**/*.ts", "tests/**/*.ts"] + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ], + "references": [ + { + "path": "./tsconfig.build.json" + }, + { + "path": "../cli" + }, + { + "path": "../common" + } + ] } diff --git a/modules/slack/tsconfig.build.json b/modules/slack/tsconfig.build.json index 52c4e3f9..55e1ee6e 100644 --- a/modules/slack/tsconfig.build.json +++ b/modules/slack/tsconfig.build.json @@ -4,8 +4,9 @@ "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/slack/tsconfig.json b/modules/slack/tsconfig.json index 8ae4b51d..8b8d48be 100644 --- a/modules/slack/tsconfig.json +++ b/modules/slack/tsconfig.json @@ -1,7 +1,23 @@ { "$schema": "http://json.schemastore.org/tsconfig", - - "extends": "../tsconfig.json", - - "include": ["src/**/*.ts", "tests/**/*.ts"] + "extends": "../../tsconfig.options.json", + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib", + "rootDir": "src" + }, + "references": [ + { + "path": "./tsconfig.build.json" + }, + { + "path": "../cli" + }, + { + "path": "../common" + } + ] } diff --git a/modules/ssllabs-server/tsconfig.build.json b/modules/ssllabs-server/tsconfig.build.json index 52c4e3f9..55e1ee6e 100644 --- a/modules/ssllabs-server/tsconfig.build.json +++ b/modules/ssllabs-server/tsconfig.build.json @@ -4,8 +4,9 @@ "extends": "./tsconfig.json", "compilerOptions": { - "outDir": "lib" + "outDir": "lib", + "rootDir": "src" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/modules/ssllabs-server/tsconfig.json b/modules/ssllabs-server/tsconfig.json index 8ae4b51d..8b8d48be 100644 --- a/modules/ssllabs-server/tsconfig.json +++ b/modules/ssllabs-server/tsconfig.json @@ -1,7 +1,23 @@ { "$schema": "http://json.schemastore.org/tsconfig", - - "extends": "../tsconfig.json", - - "include": ["src/**/*.ts", "tests/**/*.ts"] + "extends": "../../tsconfig.options.json", + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ], + "compilerOptions": { + "outDir": "lib", + "rootDir": "src" + }, + "references": [ + { + "path": "./tsconfig.build.json" + }, + { + "path": "../cli" + }, + { + "path": "../common" + } + ] } diff --git a/modules/tpl/tsconfig.build.json b/modules/tpl/tsconfig.build.json index 52c4e3f9..9443796c 100644 --- a/modules/tpl/tsconfig.build.json +++ b/modules/tpl/tsconfig.build.json @@ -7,5 +7,5 @@ "outDir": "lib" }, - "include": ["src/**/*.ts"] + "include": ["src/**/*", "*.ts"] } diff --git a/package.json b/package.json index 05e0afb0..3ea42065 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,18 @@ { - "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "8.56.0", - "jest": "^29.7.0", - "ts-jest": "^29.1.1", - "typescript": "^5.3.3" - } + "devDependencies": { + "@ecocode/eslint-plugin": "^1.4.0", + "@jest/globals": "^29.7.0", + "@types/jest": "^29.5.11", + "@typescript-eslint/eslint-plugin": "^6.18.1", + "@typescript-eslint/parser": "^6.18.1", + "eslint": "8.56.0", + "jest": "^29.7.0", + "ts-jest": "^29.1.1", + "tsconfig-moon": "^1.3.0", + "typescript": "^5.3.3" + }, + "packageManager": "pnpm@~8", + "engines": { + "node": "~18" + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1ff5722f..f299b905 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -32,6 +32,9 @@ importers: ts-jest: specifier: ^29.1.1 version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + tsconfig-moon: + specifier: ^1.3.0 + version: 1.3.0 typescript: specifier: ^5.3.3 version: 5.4.5 @@ -6182,6 +6185,10 @@ packages: yn: 3.1.1 dev: true + /tsconfig-moon@1.3.0: + resolution: {integrity: sha512-OVa+cjaKIsXIQqEWVqvF3xH6xmFOjKnbwiCmAKx2J8uq7M1KTX/NFFi/YXZdKb6YjHJhq8tvg2JsGSBTxTANcQ==} + dev: true + /tsconfig-paths@4.2.0: resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} engines: {node: '>=6'} diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..8372164a --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,34 @@ +{ + "$schema": "http://json.schemastore.org/tsconfig", + "extends": "./tsconfig.options.json", + "files": [], + "references": [ + { + "path": "modules/api" + }, + { + "path": "modules/cli" + }, + { + "path": "modules/common" + }, + { + "path": "modules/greenit" + }, + { + "path": "modules/lighthouse" + }, + { + "path": "modules/mysql" + }, + { + "path": "modules/observatory" + }, + { + "path": "modules/slack" + }, + { + "path": "modules/ssllabs-server" + } + ] +} diff --git a/modules/tsconfig.json b/tsconfig.options.json similarity index 94% rename from modules/tsconfig.json rename to tsconfig.options.json index 8862c85c..c1198564 100644 --- a/modules/tsconfig.json +++ b/tsconfig.options.json @@ -1,6 +1,8 @@ { "$schema": "http://json.schemastore.org/tsconfig", + "extends": "tsconfig-moon/tsconfig.json", + "compilerOptions": { // Disable error reporting for unreachable code. "allowUnreachableCode": false, @@ -22,7 +24,5 @@ "module": "NodeNext", "moduleResolution": "nodenext", "target": "ESNext" - }, - - "exclude": ["node_modules", "lib"] -} + } +} \ No newline at end of file From 5e93776053a4f9b1aa2d7f2e4e91f59642afca93 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 1 Jun 2024 21:38:52 +0200 Subject: [PATCH 12/28] feat: replace eslint and prettier by biome --- .gitignore | 11 +- .moon/tasks.yml | 4 +- .prettierignore | 53 -- .prettierrc.yaml | 5 - .prototools | 2 +- biome.jsonc | 24 + .../autoinstallers/rush-prettier/package.json | 10 - .../rush-prettier/pnpm-lock.yaml | 704 ----------------- common/scripts/install-run-rush-pnpm.js | 28 - common/scripts/install-run-rush.js | 215 ------ common/scripts/install-run-rushx.js | 28 - common/scripts/install-run.js | 716 ------------------ modules/api/.eslintrc.yaml | 12 - modules/cli/.eslintrc.yaml | 14 - modules/common/.eslintrc.yaml | 12 - modules/greenit/.eslintrc.yaml | 12 - modules/lighthouse/.eslintrc.yaml | 12 - modules/mysql/.eslintrc.yaml | 12 - modules/observatory/.eslintrc.yaml | 12 - modules/slack/.eslintrc.yaml | 12 - modules/ssllabs-server/.eslintrc.yaml | 12 - modules/tpl/.eslintrc.yaml | 12 - package.json | 5 +- pnpm-lock.yaml | 565 +++----------- 24 files changed, 125 insertions(+), 2367 deletions(-) delete mode 100644 .prettierignore delete mode 100644 .prettierrc.yaml create mode 100644 biome.jsonc delete mode 100644 common/autoinstallers/rush-prettier/package.json delete mode 100644 common/autoinstallers/rush-prettier/pnpm-lock.yaml delete mode 100644 common/scripts/install-run-rush-pnpm.js delete mode 100644 common/scripts/install-run-rush.js delete mode 100644 common/scripts/install-run-rushx.js delete mode 100644 common/scripts/install-run.js delete mode 100644 modules/api/.eslintrc.yaml delete mode 100644 modules/cli/.eslintrc.yaml delete mode 100644 modules/common/.eslintrc.yaml delete mode 100644 modules/greenit/.eslintrc.yaml delete mode 100644 modules/lighthouse/.eslintrc.yaml delete mode 100644 modules/mysql/.eslintrc.yaml delete mode 100644 modules/observatory/.eslintrc.yaml delete mode 100644 modules/slack/.eslintrc.yaml delete mode 100644 modules/ssllabs-server/.eslintrc.yaml delete mode 100644 modules/tpl/.eslintrc.yaml diff --git a/.gitignore b/.gitignore index df0b9a1d..e083e83b 100644 --- a/.gitignore +++ b/.gitignore @@ -4,9 +4,6 @@ # Dependency directories node_modules/ -# Optional eslint cache -.eslintcache - # Coverage report coverage @@ -22,20 +19,16 @@ lib # OS X temporary files .DS_Store -# Rush temporary files -common/deploy/ -common/temp/ -common/autoinstallers/*/.npmrc -**/.rush/temp/ - # Visual Studio Code .vscode # MikroORM temporary directory modules/*/temp test/temp + # moon .moon/cache .moon/docker +# TypeScript *.tsbuildinfo diff --git a/.moon/tasks.yml b/.moon/tasks.yml index 82a90848..7b7795b6 100644 --- a/.moon/tasks.yml +++ b/.moon/tasks.yml @@ -5,8 +5,10 @@ tasks: - ~:cleanup cleanup: command: rimraf lib + format: + command: pnpm biome format ./ lint: - command: eslint . + command: pnpm biome lint ./ test: command: jest env: diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index a7e92ca3..00000000 --- a/.prettierignore +++ /dev/null @@ -1,53 +0,0 @@ -#------------------------------------------------------------------------------------------------------------------- -# Keep this section in sync with .gitignore -#------------------------------------------------------------------------------------------------------------------- - -# Logs -*.log - -# Dependency directories -node_modules/ - -# Optional eslint cache -.eslintcache - -# Output of 'npm pack' -*.tgz - -# dotenv environment variables file -.env - -# Common toolchain intermediate files -lib -dist - -# OS X temporary files -.DS_Store - -# Rush temporary files -common/deploy/ -common/temp/ -common/autoinstallers/*/.npmrc -**/.rush/temp/ - -# Visual Studio Code -.vscode - -#------------------------------------------------------------------------------------------------------------------- -# Prettier-specific overrides -#------------------------------------------------------------------------------------------------------------------- - -# Rush files -common/changes/ -common/scripts/ -common/config/ -CHANGELOG.* - -# Package manager files -pnpm-lock.yaml -yarn.lock -package-lock.json -shrinkwrap.json - -# Prettier reformats code blocks inside Markdown, which affects rendered output -*.md \ No newline at end of file diff --git a/.prettierrc.yaml b/.prettierrc.yaml deleted file mode 100644 index 39187ba5..00000000 --- a/.prettierrc.yaml +++ /dev/null @@ -1,5 +0,0 @@ -# Documentation for this file: https://prettier.io/docs/en/configuration.html -printWidth: 110 -semi: false -plugins: - - "./common/autoinstallers/rush-prettier/node_modules/prettier-plugin-packagejson" diff --git a/.prototools b/.prototools index 8f345679..fcb31a60 100644 --- a/.prototools +++ b/.prototools @@ -1,6 +1,6 @@ +moon = "~1" node = "~18" pnpm = "~8" -moon = "~1.25" [plugins] moon = "source:https://raw.githubusercontent.com/moonrepo/moon/master/proto-plugin.toml" diff --git a/biome.jsonc b/biome.jsonc new file mode 100644 index 00000000..647b71fc --- /dev/null +++ b/biome.jsonc @@ -0,0 +1,24 @@ +{ + "$schema": "https://biomejs.dev/schemas/1.7.3/schema.json", + "organizeImports": { + "enabled": true + }, + "linter": { + "enabled": true, + "rules": { + "recommended": true + } + }, + "files": { + "include": [ + "src/**/*.ts", + "tests/**/*.ts" + ] + }, + "vcs": { + "enabled": true, + "clientKind": "git", + "useIgnoreFile": true, + "defaultBranch": "main" + } +} diff --git a/common/autoinstallers/rush-prettier/package.json b/common/autoinstallers/rush-prettier/package.json deleted file mode 100644 index e6d80be6..00000000 --- a/common/autoinstallers/rush-prettier/package.json +++ /dev/null @@ -1,10 +0,0 @@ -{ - "name": "rush-prettier", - "version": "1.0.0", - "private": true, - "dependencies": { - "prettier": "^2.8.8", - "prettier-plugin-packagejson": "^2.4.5", - "pretty-quick": "^3.1.3" - } -} diff --git a/common/autoinstallers/rush-prettier/pnpm-lock.yaml b/common/autoinstallers/rush-prettier/pnpm-lock.yaml deleted file mode 100644 index 4104149b..00000000 --- a/common/autoinstallers/rush-prettier/pnpm-lock.yaml +++ /dev/null @@ -1,704 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: true - excludeLinksFromLockfile: false - -dependencies: - prettier: - specifier: ^2.8.8 - version: 2.8.8 - prettier-plugin-packagejson: - specifier: ^2.4.5 - version: 2.4.6(prettier@2.8.8) - pretty-quick: - specifier: ^3.1.3 - version: 3.1.3(prettier@2.8.8) - -packages: - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - dev: false - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - dev: false - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - dev: false - - /@pkgr/utils@2.4.2: - resolution: {integrity: sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw==} - engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - dependencies: - cross-spawn: 7.0.3 - fast-glob: 3.3.1 - is-glob: 4.0.3 - open: 9.1.0 - picocolors: 1.0.0 - tslib: 2.6.2 - dev: false - - /@types/minimatch@3.0.5: - resolution: {integrity: sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==} - dev: false - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - dev: false - - /array-differ@3.0.0: - resolution: {integrity: sha512-THtfYS6KtME/yIAhKjZ2ul7XI96lQGHRputJQHO80LAWQnuGP4iCIN8vdMRboGbIEYBwU33q8Tch1os2+X0kMg==} - engines: {node: '>=8'} - dev: false - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - dev: false - - /arrify@2.0.1: - resolution: {integrity: sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==} - engines: {node: '>=8'} - dev: false - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - dev: false - - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: false - - /bplist-parser@0.2.0: - resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} - engines: {node: '>= 5.10.0'} - dependencies: - big-integer: 1.6.51 - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - dev: false - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - dev: false - - /bundle-name@3.0.0: - resolution: {integrity: sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw==} - engines: {node: '>=12'} - dependencies: - run-applescript: 5.0.0 - dev: false - - /chalk@3.0.0: - resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} - engines: {node: '>=8'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: false - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - dev: false - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - dev: false - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - dev: false - - /default-browser-id@3.0.0: - resolution: {integrity: sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA==} - engines: {node: '>=12'} - dependencies: - bplist-parser: 0.2.0 - untildify: 4.0.0 - dev: false - - /default-browser@4.0.0: - resolution: {integrity: sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA==} - engines: {node: '>=14.16'} - dependencies: - bundle-name: 3.0.0 - default-browser-id: 3.0.0 - execa: 7.2.0 - titleize: 3.0.0 - dev: false - - /define-lazy-prop@3.0.0: - resolution: {integrity: sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg==} - engines: {node: '>=12'} - dev: false - - /detect-indent@7.0.1: - resolution: {integrity: sha512-Mc7QhQ8s+cLrnUfU/Ji94vG/r8M26m8f++vyres4ZoojaRDpZ1eSIh/EpzLNwlWuvzSZ3UbDFspjFvTDXe6e/g==} - engines: {node: '>=12.20'} - dev: false - - /detect-newline@4.0.1: - resolution: {integrity: sha512-qE3Veg1YXzGHQhlA6jzebZN2qVf6NX+A7m7qlhCGG30dJixrAQhYOsJjsnBjJkCSmuOPpCk30145fr8FV0bzog==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - dev: false - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - dev: false - - /execa@4.1.0: - resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 5.2.0 - human-signals: 1.1.1 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: false - - /execa@7.2.0: - resolution: {integrity: sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA==} - engines: {node: ^14.18.0 || ^16.14.0 || >=18.0.0} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 4.3.1 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.1.0 - onetime: 6.0.0 - signal-exit: 3.0.7 - strip-final-newline: 3.0.0 - dev: false - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - dev: false - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - dev: false - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - dev: false - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - dev: false - - /get-stdin@9.0.0: - resolution: {integrity: sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==} - engines: {node: '>=12'} - dev: false - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - dev: false - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: false - - /git-hooks-list@3.1.0: - resolution: {integrity: sha512-LF8VeHeR7v+wAbXqfgRlTSX/1BJR9Q1vEMR8JAz1cEg6GX07+zyj3sAdDvYjj/xnlIfVuGgj4qBei1K3hKH+PA==} - dev: false - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - dev: false - - /globby@13.2.2: - resolution: {integrity: sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 4.0.0 - dev: false - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: false - - /human-signals@1.1.1: - resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} - engines: {node: '>=8.12.0'} - dev: false - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: false - - /human-signals@4.3.1: - resolution: {integrity: sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ==} - engines: {node: '>=14.18.0'} - dev: false - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - dev: false - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - dev: false - - /is-docker@3.0.0: - resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - hasBin: true - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - dev: false - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - dev: false - - /is-inside-container@1.0.0: - resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} - engines: {node: '>=14.16'} - hasBin: true - dependencies: - is-docker: 3.0.0 - dev: false - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - dev: false - - /is-plain-obj@4.1.0: - resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} - engines: {node: '>=12'} - dev: false - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: false - - /is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dev: false - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - dev: false - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - dev: false - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: false - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - dev: false - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - dev: false - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - dev: false - - /mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - dev: false - - /mri@1.2.0: - resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} - engines: {node: '>=4'} - dev: false - - /multimatch@4.0.0: - resolution: {integrity: sha512-lDmx79y1z6i7RNx0ZGCPq1bzJ6ZoDDKbvh7jxr9SJcWLkShMzXrHbYVpTdnhNM5MXpDUxCQ4DgqVttVXlBgiBQ==} - engines: {node: '>=8'} - dependencies: - '@types/minimatch': 3.0.5 - array-differ: 3.0.0 - array-union: 2.1.0 - arrify: 2.0.1 - minimatch: 3.1.2 - dev: false - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: false - - /npm-run-path@5.1.0: - resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - path-key: 4.0.0 - dev: false - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - dev: false - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - dev: false - - /onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - dependencies: - mimic-fn: 4.0.0 - dev: false - - /open@9.1.0: - resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} - engines: {node: '>=14.16'} - dependencies: - default-browser: 4.0.0 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 2.2.0 - dev: false - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - dev: false - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - dev: false - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - dev: false - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - dev: false - - /path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - dev: false - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - dev: false - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: false - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - dev: false - - /prettier-plugin-packagejson@2.4.6(prettier@2.8.8): - resolution: {integrity: sha512-5JGfzkJRL0DLNyhwmiAV9mV0hZLHDwddFCs2lc9CNxOChpoWUQVe8K4qTMktmevmDlMpok2uT10nvHUyU59sNw==} - peerDependencies: - prettier: '>= 1.16.0' - peerDependenciesMeta: - prettier: - optional: true - dependencies: - prettier: 2.8.8 - sort-package-json: 2.6.0 - synckit: 0.8.5 - dev: false - - /prettier@2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - dev: false - - /pretty-quick@3.1.3(prettier@2.8.8): - resolution: {integrity: sha512-kOCi2FJabvuh1as9enxYmrnBC6tVMoVOenMaBqRfsvBHB0cbpYHjdQEpSglpASDFEXVwplpcGR4CLEaisYAFcA==} - engines: {node: '>=10.13'} - hasBin: true - peerDependencies: - prettier: '>=2.0.0' - dependencies: - chalk: 3.0.0 - execa: 4.1.0 - find-up: 4.1.0 - ignore: 5.2.4 - mri: 1.2.0 - multimatch: 4.0.0 - prettier: 2.8.8 - dev: false - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - dev: false - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - dev: false - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - dev: false - - /run-applescript@5.0.0: - resolution: {integrity: sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg==} - engines: {node: '>=12'} - dependencies: - execa: 5.1.1 - dev: false - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - dev: false - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - dev: false - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - dev: false - - /slash@4.0.0: - resolution: {integrity: sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==} - engines: {node: '>=12'} - dev: false - - /sort-object-keys@1.1.3: - resolution: {integrity: sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==} - dev: false - - /sort-package-json@2.6.0: - resolution: {integrity: sha512-XSQ+lY9bAYA8ZsoChcEoPlgcSMaheziEp1beox1JVxy1SV4F2jSq9+h2rJ+3mC/Dhu9Ius1DLnInD5AWcsDXZw==} - hasBin: true - dependencies: - detect-indent: 7.0.1 - detect-newline: 4.0.1 - get-stdin: 9.0.0 - git-hooks-list: 3.1.0 - globby: 13.2.2 - is-plain-obj: 4.1.0 - sort-object-keys: 1.1.3 - dev: false - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: false - - /strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - dev: false - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: false - - /synckit@0.8.5: - resolution: {integrity: sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q==} - engines: {node: ^14.18.0 || >=16.0.0} - dependencies: - '@pkgr/utils': 2.4.2 - tslib: 2.6.2 - dev: false - - /titleize@3.0.0: - resolution: {integrity: sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ==} - engines: {node: '>=12'} - dev: false - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - dev: false - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - dev: false - - /untildify@4.0.0: - resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} - engines: {node: '>=8'} - dev: false - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - dev: false - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - dev: false diff --git a/common/scripts/install-run-rush-pnpm.js b/common/scripts/install-run-rush-pnpm.js deleted file mode 100644 index 72a7bfdf..00000000 --- a/common/scripts/install-run-rush-pnpm.js +++ /dev/null @@ -1,28 +0,0 @@ -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the -// rush-pnpm command. -// -// An example usage would be: -// -// node common/scripts/install-run-rush-pnpm.js pnpm-command -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ - -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -var __webpack_exports__ = {}; -/*!*****************************************************!*\ - !*** ./lib-esnext/scripts/install-run-rush-pnpm.js ***! - \*****************************************************/ - -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See LICENSE in the project root for license information. -require('./install-run-rush'); -//# sourceMappingURL=install-run-rush-pnpm.js.map -module.exports = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=install-run-rush-pnpm.js.map \ No newline at end of file diff --git a/common/scripts/install-run-rush.js b/common/scripts/install-run-rush.js deleted file mode 100644 index fe5101a2..00000000 --- a/common/scripts/install-run-rush.js +++ /dev/null @@ -1,215 +0,0 @@ -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to it. -// An example usage would be: -// -// node common/scripts/install-run-rush.js install -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ - -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 657147: -/*!*********************!*\ - !*** external "fs" ***! - \*********************/ -/***/ ((module) => { - -module.exports = require("fs"); - -/***/ }), - -/***/ 371017: -/*!***********************!*\ - !*** external "path" ***! - \***********************/ -/***/ ((module) => { - -module.exports = require("path"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -/*!************************************************!*\ - !*** ./lib-esnext/scripts/install-run-rush.js ***! - \************************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! path */ 371017); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 657147); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See LICENSE in the project root for license information. -/* eslint-disable no-console */ - - -const { installAndRun, findRushJsonFolder, RUSH_JSON_FILENAME, runWithErrorAndStatusCode } = require('./install-run'); -const PACKAGE_NAME = '@microsoft/rush'; -const RUSH_PREVIEW_VERSION = 'RUSH_PREVIEW_VERSION'; -const INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_RUSH_LOCKFILE_PATH'; -function _getRushVersion(logger) { - const rushPreviewVersion = process.env[RUSH_PREVIEW_VERSION]; - if (rushPreviewVersion !== undefined) { - logger.info(`Using Rush version from environment variable ${RUSH_PREVIEW_VERSION}=${rushPreviewVersion}`); - return rushPreviewVersion; - } - const rushJsonFolder = findRushJsonFolder(); - const rushJsonPath = path__WEBPACK_IMPORTED_MODULE_0__.join(rushJsonFolder, RUSH_JSON_FILENAME); - try { - const rushJsonContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(rushJsonPath, 'utf-8'); - // Use a regular expression to parse out the rushVersion value because rush.json supports comments, - // but JSON.parse does not and we don't want to pull in more dependencies than we need to in this script. - const rushJsonMatches = rushJsonContents.match(/\"rushVersion\"\s*\:\s*\"([0-9a-zA-Z.+\-]+)\"/); - return rushJsonMatches[1]; - } - catch (e) { - throw new Error(`Unable to determine the required version of Rush from rush.json (${rushJsonFolder}). ` + - "The 'rushVersion' field is either not assigned in rush.json or was specified " + - 'using an unexpected syntax.'); - } -} -function _getBin(scriptName) { - switch (scriptName.toLowerCase()) { - case 'install-run-rush-pnpm.js': - return 'rush-pnpm'; - case 'install-run-rushx.js': - return 'rushx'; - default: - return 'rush'; - } -} -function _run() { - const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, ...packageBinArgs /* [build, --to, myproject] */] = process.argv; - // Detect if this script was directly invoked, or if the install-run-rushx script was invokved to select the - // appropriate binary inside the rush package to run - const scriptName = path__WEBPACK_IMPORTED_MODULE_0__.basename(scriptPath); - const bin = _getBin(scriptName); - if (!nodePath || !scriptPath) { - throw new Error('Unexpected exception: could not detect node path or script path'); - } - let commandFound = false; - let logger = { info: console.log, error: console.error }; - for (const arg of packageBinArgs) { - if (arg === '-q' || arg === '--quiet') { - // The -q/--quiet flag is supported by both `rush` and `rushx`, and will suppress - // any normal informational/diagnostic information printed during startup. - // - // To maintain the same user experience, the install-run* scripts pass along this - // flag but also use it to suppress any diagnostic information normally printed - // to stdout. - logger = { - info: () => { }, - error: console.error - }; - } - else if (!arg.startsWith('-') || arg === '-h' || arg === '--help') { - // We either found something that looks like a command (i.e. - doesn't start with a "-"), - // or we found the -h/--help flag, which can be run without a command - commandFound = true; - } - } - if (!commandFound) { - console.log(`Usage: ${scriptName} [args...]`); - if (scriptName === 'install-run-rush-pnpm.js') { - console.log(`Example: ${scriptName} pnpm-command`); - } - else if (scriptName === 'install-run-rush.js') { - console.log(`Example: ${scriptName} build --to myproject`); - } - else { - console.log(`Example: ${scriptName} custom-command`); - } - process.exit(1); - } - runWithErrorAndStatusCode(logger, () => { - const version = _getRushVersion(logger); - logger.info(`The rush.json configuration requests Rush version ${version}`); - const lockFilePath = process.env[INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE]; - if (lockFilePath) { - logger.info(`Found ${INSTALL_RUN_RUSH_LOCKFILE_PATH_VARIABLE}="${lockFilePath}", installing with lockfile.`); - } - return installAndRun(logger, PACKAGE_NAME, version, bin, packageBinArgs, lockFilePath); - }); -} -_run(); -//# sourceMappingURL=install-run-rush.js.map -})(); - -module.exports = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=install-run-rush.js.map \ No newline at end of file diff --git a/common/scripts/install-run-rushx.js b/common/scripts/install-run-rushx.js deleted file mode 100644 index 0a0235f2..00000000 --- a/common/scripts/install-run-rushx.js +++ /dev/null @@ -1,28 +0,0 @@ -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where the Rush command may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the version of Rush -// specified in the rush.json configuration file (if not already installed), and then pass a command-line to the -// rushx command. -// -// An example usage would be: -// -// node common/scripts/install-run-rushx.js custom-command -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ - -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -var __webpack_exports__ = {}; -/*!*************************************************!*\ - !*** ./lib-esnext/scripts/install-run-rushx.js ***! - \*************************************************/ - -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See LICENSE in the project root for license information. -require('./install-run-rush'); -//# sourceMappingURL=install-run-rushx.js.map -module.exports = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=install-run-rushx.js.map \ No newline at end of file diff --git a/common/scripts/install-run.js b/common/scripts/install-run.js deleted file mode 100644 index bf89cd23..00000000 --- a/common/scripts/install-run.js +++ /dev/null @@ -1,716 +0,0 @@ -// THIS FILE WAS GENERATED BY A TOOL. ANY MANUAL MODIFICATIONS WILL GET OVERWRITTEN WHENEVER RUSH IS UPGRADED. -// -// This script is intended for usage in an automated build environment where a Node tool may not have -// been preinstalled, or may have an unpredictable version. This script will automatically install the specified -// version of the specified tool (if not already installed), and then pass a command-line to it. -// An example usage would be: -// -// node common/scripts/install-run.js qrcode@1.2.2 qrcode https://rushjs.io -// -// For more information, see: https://rushjs.io/pages/maintainer/setup_new_repo/ - -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 679877: -/*!************************************************!*\ - !*** ./lib-esnext/utilities/npmrcUtilities.js ***! - \************************************************/ -/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => { - -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "isVariableSetInNpmrcFile": () => (/* binding */ isVariableSetInNpmrcFile), -/* harmony export */ "syncNpmrc": () => (/* binding */ syncNpmrc) -/* harmony export */ }); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! fs */ 657147); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! path */ 371017); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_1__); -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See LICENSE in the project root for license information. -// IMPORTANT - do not use any non-built-in libraries in this file - - -/** - * This function reads the content for given .npmrc file path, and also trims - * unusable lines from the .npmrc file. - * - * @returns - * The text of the the .npmrc. - */ -// create a global _combinedNpmrc for cache purpose -const _combinedNpmrcMap = new Map(); -function _trimNpmrcFile(sourceNpmrcPath) { - const combinedNpmrcFromCache = _combinedNpmrcMap.get(sourceNpmrcPath); - if (combinedNpmrcFromCache !== undefined) { - return combinedNpmrcFromCache; - } - let npmrcFileLines = fs__WEBPACK_IMPORTED_MODULE_0__.readFileSync(sourceNpmrcPath).toString().split('\n'); - npmrcFileLines = npmrcFileLines.map((line) => (line || '').trim()); - const resultLines = []; - // This finds environment variable tokens that look like "${VAR_NAME}" - const expansionRegExp = /\$\{([^\}]+)\}/g; - // Comment lines start with "#" or ";" - const commentRegExp = /^\s*[#;]/; - // Trim out lines that reference environment variables that aren't defined - for (let line of npmrcFileLines) { - let lineShouldBeTrimmed = false; - //remove spaces before or after key and value - line = line - .split('=') - .map((lineToTrim) => lineToTrim.trim()) - .join('='); - // Ignore comment lines - if (!commentRegExp.test(line)) { - const environmentVariables = line.match(expansionRegExp); - if (environmentVariables) { - for (const token of environmentVariables) { - // Remove the leading "${" and the trailing "}" from the token - const environmentVariableName = token.substring(2, token.length - 1); - // Is the environment variable defined? - if (!process.env[environmentVariableName]) { - // No, so trim this line - lineShouldBeTrimmed = true; - break; - } - } - } - } - if (lineShouldBeTrimmed) { - // Example output: - // "; MISSING ENVIRONMENT VARIABLE: //my-registry.com/npm/:_authToken=${MY_AUTH_TOKEN}" - resultLines.push('; MISSING ENVIRONMENT VARIABLE: ' + line); - } - else { - resultLines.push(line); - } - } - const combinedNpmrc = resultLines.join('\n'); - //save the cache - _combinedNpmrcMap.set(sourceNpmrcPath, combinedNpmrc); - return combinedNpmrc; -} -/** - * As a workaround, copyAndTrimNpmrcFile() copies the .npmrc file to the target folder, and also trims - * unusable lines from the .npmrc file. - * - * Why are we trimming the .npmrc lines? NPM allows environment variables to be specified in - * the .npmrc file to provide different authentication tokens for different registry. - * However, if the environment variable is undefined, it expands to an empty string, which - * produces a valid-looking mapping with an invalid URL that causes an error. Instead, - * we'd prefer to skip that line and continue looking in other places such as the user's - * home directory. - * - * @returns - * The text of the the .npmrc with lines containing undefined variables commented out. - */ -function _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath) { - logger.info(`Transforming ${sourceNpmrcPath}`); // Verbose - logger.info(` --> "${targetNpmrcPath}"`); - const combinedNpmrc = _trimNpmrcFile(sourceNpmrcPath); - fs__WEBPACK_IMPORTED_MODULE_0__.writeFileSync(targetNpmrcPath, combinedNpmrc); - return combinedNpmrc; -} -/** - * syncNpmrc() copies the .npmrc file to the target folder, and also trims unusable lines from the .npmrc file. - * If the source .npmrc file not exist, then syncNpmrc() will delete an .npmrc that is found in the target folder. - * - * IMPORTANT: THIS CODE SHOULD BE KEPT UP TO DATE WITH Utilities._syncNpmrc() - * - * @returns - * The text of the the synced .npmrc, if one exists. If one does not exist, then undefined is returned. - */ -function syncNpmrc(sourceNpmrcFolder, targetNpmrcFolder, useNpmrcPublish, logger = { - // eslint-disable-next-line no-console - info: console.log, - // eslint-disable-next-line no-console - error: console.error -}) { - const sourceNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(sourceNpmrcFolder, !useNpmrcPublish ? '.npmrc' : '.npmrc-publish'); - const targetNpmrcPath = path__WEBPACK_IMPORTED_MODULE_1__.join(targetNpmrcFolder, '.npmrc'); - try { - if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { - return _copyAndTrimNpmrcFile(logger, sourceNpmrcPath, targetNpmrcPath); - } - else if (fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(targetNpmrcPath)) { - // If the source .npmrc doesn't exist and there is one in the target, delete the one in the target - logger.info(`Deleting ${targetNpmrcPath}`); // Verbose - fs__WEBPACK_IMPORTED_MODULE_0__.unlinkSync(targetNpmrcPath); - } - } - catch (e) { - throw new Error(`Error syncing .npmrc file: ${e}`); - } -} -function isVariableSetInNpmrcFile(sourceNpmrcFolder, variableKey) { - const sourceNpmrcPath = `${sourceNpmrcFolder}/.npmrc`; - //if .npmrc file does not exist, return false directly - if (!fs__WEBPACK_IMPORTED_MODULE_0__.existsSync(sourceNpmrcPath)) { - return false; - } - const trimmedNpmrcFile = _trimNpmrcFile(sourceNpmrcPath); - const variableKeyRegExp = new RegExp(`^${variableKey}=`, 'm'); - return trimmedNpmrcFile.match(variableKeyRegExp) !== null; -} -//# sourceMappingURL=npmrcUtilities.js.map - -/***/ }), - -/***/ 532081: -/*!********************************!*\ - !*** external "child_process" ***! - \********************************/ -/***/ ((module) => { - -module.exports = require("child_process"); - -/***/ }), - -/***/ 657147: -/*!*********************!*\ - !*** external "fs" ***! - \*********************/ -/***/ ((module) => { - -module.exports = require("fs"); - -/***/ }), - -/***/ 822037: -/*!*********************!*\ - !*** external "os" ***! - \*********************/ -/***/ ((module) => { - -module.exports = require("os"); - -/***/ }), - -/***/ 371017: -/*!***********************!*\ - !*** external "path" ***! - \***********************/ -/***/ ((module) => { - -module.exports = require("path"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ /* webpack/runtime/compat get default export */ -/******/ (() => { -/******/ // getDefaultExport function for compatibility with non-harmony modules -/******/ __webpack_require__.n = (module) => { -/******/ var getter = module && module.__esModule ? -/******/ () => (module['default']) : -/******/ () => (module); -/******/ __webpack_require__.d(getter, { a: getter }); -/******/ return getter; -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/define property getters */ -/******/ (() => { -/******/ // define getter functions for harmony exports -/******/ __webpack_require__.d = (exports, definition) => { -/******/ for(var key in definition) { -/******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) { -/******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] }); -/******/ } -/******/ } -/******/ }; -/******/ })(); -/******/ -/******/ /* webpack/runtime/hasOwnProperty shorthand */ -/******/ (() => { -/******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop)) -/******/ })(); -/******/ -/******/ /* webpack/runtime/make namespace object */ -/******/ (() => { -/******/ // define __esModule on exports -/******/ __webpack_require__.r = (exports) => { -/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) { -/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' }); -/******/ } -/******/ Object.defineProperty(exports, '__esModule', { value: true }); -/******/ }; -/******/ })(); -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk. -(() => { -/*!*******************************************!*\ - !*** ./lib-esnext/scripts/install-run.js ***! - \*******************************************/ -__webpack_require__.r(__webpack_exports__); -/* harmony export */ __webpack_require__.d(__webpack_exports__, { -/* harmony export */ "RUSH_JSON_FILENAME": () => (/* binding */ RUSH_JSON_FILENAME), -/* harmony export */ "findRushJsonFolder": () => (/* binding */ findRushJsonFolder), -/* harmony export */ "getNpmPath": () => (/* binding */ getNpmPath), -/* harmony export */ "installAndRun": () => (/* binding */ installAndRun), -/* harmony export */ "runWithErrorAndStatusCode": () => (/* binding */ runWithErrorAndStatusCode) -/* harmony export */ }); -/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! child_process */ 532081); -/* harmony import */ var child_process__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(child_process__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! fs */ 657147); -/* harmony import */ var fs__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(fs__WEBPACK_IMPORTED_MODULE_1__); -/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(/*! os */ 822037); -/* harmony import */ var os__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(os__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(/*! path */ 371017); -/* harmony import */ var path__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(path__WEBPACK_IMPORTED_MODULE_3__); -/* harmony import */ var _utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(/*! ../utilities/npmrcUtilities */ 679877); -// Copyright (c) Microsoft Corporation. All rights reserved. Licensed under the MIT license. -// See LICENSE in the project root for license information. -/* eslint-disable no-console */ - - - - - -const RUSH_JSON_FILENAME = 'rush.json'; -const RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME = 'RUSH_TEMP_FOLDER'; -const INSTALL_RUN_LOCKFILE_PATH_VARIABLE = 'INSTALL_RUN_LOCKFILE_PATH'; -const INSTALLED_FLAG_FILENAME = 'installed.flag'; -const NODE_MODULES_FOLDER_NAME = 'node_modules'; -const PACKAGE_JSON_FILENAME = 'package.json'; -/** - * Parse a package specifier (in the form of name\@version) into name and version parts. - */ -function _parsePackageSpecifier(rawPackageSpecifier) { - rawPackageSpecifier = (rawPackageSpecifier || '').trim(); - const separatorIndex = rawPackageSpecifier.lastIndexOf('@'); - let name; - let version = undefined; - if (separatorIndex === 0) { - // The specifier starts with a scope and doesn't have a version specified - name = rawPackageSpecifier; - } - else if (separatorIndex === -1) { - // The specifier doesn't have a version - name = rawPackageSpecifier; - } - else { - name = rawPackageSpecifier.substring(0, separatorIndex); - version = rawPackageSpecifier.substring(separatorIndex + 1); - } - if (!name) { - throw new Error(`Invalid package specifier: ${rawPackageSpecifier}`); - } - return { name, version }; -} -let _npmPath = undefined; -/** - * Get the absolute path to the npm executable - */ -function getNpmPath() { - if (!_npmPath) { - try { - if (os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32') { - // We're on Windows - const whereOutput = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('where npm', { stdio: [] }).toString(); - const lines = whereOutput.split(os__WEBPACK_IMPORTED_MODULE_2__.EOL).filter((line) => !!line); - // take the last result, we are looking for a .cmd command - // see https://github.com/microsoft/rushstack/issues/759 - _npmPath = lines[lines.length - 1]; - } - else { - // We aren't on Windows - assume we're on *NIX or Darwin - _npmPath = child_process__WEBPACK_IMPORTED_MODULE_0__.execSync('command -v npm', { stdio: [] }).toString(); - } - } - catch (e) { - throw new Error(`Unable to determine the path to the NPM tool: ${e}`); - } - _npmPath = _npmPath.trim(); - if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(_npmPath)) { - throw new Error('The NPM executable does not exist'); - } - } - return _npmPath; -} -function _ensureFolder(folderPath) { - if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(folderPath)) { - const parentDir = path__WEBPACK_IMPORTED_MODULE_3__.dirname(folderPath); - _ensureFolder(parentDir); - fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(folderPath); - } -} -/** - * Create missing directories under the specified base directory, and return the resolved directory. - * - * Does not support "." or ".." path segments. - * Assumes the baseFolder exists. - */ -function _ensureAndJoinPath(baseFolder, ...pathSegments) { - let joinedPath = baseFolder; - try { - for (let pathSegment of pathSegments) { - pathSegment = pathSegment.replace(/[\\\/]/g, '+'); - joinedPath = path__WEBPACK_IMPORTED_MODULE_3__.join(joinedPath, pathSegment); - if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(joinedPath)) { - fs__WEBPACK_IMPORTED_MODULE_1__.mkdirSync(joinedPath); - } - } - } - catch (e) { - throw new Error(`Error building local installation folder (${path__WEBPACK_IMPORTED_MODULE_3__.join(baseFolder, ...pathSegments)}): ${e}`); - } - return joinedPath; -} -function _getRushTempFolder(rushCommonFolder) { - const rushTempFolder = process.env[RUSH_TEMP_FOLDER_ENV_VARIABLE_NAME]; - if (rushTempFolder !== undefined) { - _ensureFolder(rushTempFolder); - return rushTempFolder; - } - else { - return _ensureAndJoinPath(rushCommonFolder, 'temp'); - } -} -/** - * Compare version strings according to semantic versioning. - * Returns a positive integer if "a" is a later version than "b", - * a negative integer if "b" is later than "a", - * and 0 otherwise. - */ -function _compareVersionStrings(a, b) { - const aParts = a.split(/[.-]/); - const bParts = b.split(/[.-]/); - const numberOfParts = Math.max(aParts.length, bParts.length); - for (let i = 0; i < numberOfParts; i++) { - if (aParts[i] !== bParts[i]) { - return (Number(aParts[i]) || 0) - (Number(bParts[i]) || 0); - } - } - return 0; -} -/** - * Resolve a package specifier to a static version - */ -function _resolvePackageVersion(logger, rushCommonFolder, { name, version }) { - if (!version) { - version = '*'; // If no version is specified, use the latest version - } - if (version.match(/^[a-zA-Z0-9\-\+\.]+$/)) { - // If the version contains only characters that we recognize to be used in static version specifiers, - // pass the version through - return version; - } - else { - // version resolves to - try { - const rushTempFolder = _getRushTempFolder(rushCommonFolder); - const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); - (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)(sourceNpmrcFolder, rushTempFolder, undefined, logger); - const npmPath = getNpmPath(); - // This returns something that looks like: - // ``` - // [ - // "3.0.0", - // "3.0.1", - // ... - // "3.0.20" - // ] - // ``` - // - // if multiple versions match the selector, or - // - // ``` - // "3.0.0" - // ``` - // - // if only a single version matches. - const npmVersionSpawnResult = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(npmPath, ['view', `${name}@${version}`, 'version', '--no-update-notifier', '--json'], { - cwd: rushTempFolder, - stdio: [] - }); - if (npmVersionSpawnResult.status !== 0) { - throw new Error(`"npm view" returned error code ${npmVersionSpawnResult.status}`); - } - const npmViewVersionOutput = npmVersionSpawnResult.stdout.toString(); - const parsedVersionOutput = JSON.parse(npmViewVersionOutput); - const versions = Array.isArray(parsedVersionOutput) - ? parsedVersionOutput - : [parsedVersionOutput]; - let latestVersion = versions[0]; - for (let i = 1; i < versions.length; i++) { - const latestVersionCandidate = versions[i]; - if (_compareVersionStrings(latestVersionCandidate, latestVersion) > 0) { - latestVersion = latestVersionCandidate; - } - } - if (!latestVersion) { - throw new Error('No versions found for the specified version range.'); - } - return latestVersion; - } - catch (e) { - throw new Error(`Unable to resolve version ${version} of package ${name}: ${e}`); - } - } -} -let _rushJsonFolder; -/** - * Find the absolute path to the folder containing rush.json - */ -function findRushJsonFolder() { - if (!_rushJsonFolder) { - let basePath = __dirname; - let tempPath = __dirname; - do { - const testRushJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(basePath, RUSH_JSON_FILENAME); - if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(testRushJsonPath)) { - _rushJsonFolder = basePath; - break; - } - else { - basePath = tempPath; - } - } while (basePath !== (tempPath = path__WEBPACK_IMPORTED_MODULE_3__.dirname(basePath))); // Exit the loop when we hit the disk root - if (!_rushJsonFolder) { - throw new Error('Unable to find rush.json.'); - } - } - return _rushJsonFolder; -} -/** - * Detects if the package in the specified directory is installed - */ -function _isPackageAlreadyInstalled(packageInstallFolder) { - try { - const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); - if (!fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(flagFilePath)) { - return false; - } - const fileContents = fs__WEBPACK_IMPORTED_MODULE_1__.readFileSync(flagFilePath).toString(); - return fileContents.trim() === process.version; - } - catch (e) { - return false; - } -} -/** - * Delete a file. Fail silently if it does not exist. - */ -function _deleteFile(file) { - try { - fs__WEBPACK_IMPORTED_MODULE_1__.unlinkSync(file); - } - catch (err) { - if (err.code !== 'ENOENT' && err.code !== 'ENOTDIR') { - throw err; - } - } -} -/** - * Removes the following files and directories under the specified folder path: - * - installed.flag - * - - * - node_modules - */ -function _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath) { - try { - const flagFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, INSTALLED_FLAG_FILENAME); - _deleteFile(flagFile); - const packageLockFile = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, 'package-lock.json'); - if (lockFilePath) { - fs__WEBPACK_IMPORTED_MODULE_1__.copyFileSync(lockFilePath, packageLockFile); - } - else { - // Not running `npm ci`, so need to cleanup - _deleteFile(packageLockFile); - const nodeModulesFolder = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME); - if (fs__WEBPACK_IMPORTED_MODULE_1__.existsSync(nodeModulesFolder)) { - const rushRecyclerFolder = _ensureAndJoinPath(rushTempFolder, 'rush-recycler'); - fs__WEBPACK_IMPORTED_MODULE_1__.renameSync(nodeModulesFolder, path__WEBPACK_IMPORTED_MODULE_3__.join(rushRecyclerFolder, `install-run-${Date.now().toString()}`)); - } - } - } - catch (e) { - throw new Error(`Error cleaning the package install folder (${packageInstallFolder}): ${e}`); - } -} -function _createPackageJson(packageInstallFolder, name, version) { - try { - const packageJsonContents = { - name: 'ci-rush', - version: '0.0.0', - dependencies: { - [name]: version - }, - description: "DON'T WARN", - repository: "DON'T WARN", - license: 'MIT' - }; - const packageJsonPath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, PACKAGE_JSON_FILENAME); - fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(packageJsonPath, JSON.stringify(packageJsonContents, undefined, 2)); - } - catch (e) { - throw new Error(`Unable to create package.json: ${e}`); - } -} -/** - * Run "npm install" in the package install folder. - */ -function _installPackage(logger, packageInstallFolder, name, version, command) { - try { - logger.info(`Installing ${name}...`); - const npmPath = getNpmPath(); - const result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(npmPath, [command], { - stdio: 'inherit', - cwd: packageInstallFolder, - env: process.env - }); - if (result.status !== 0) { - throw new Error(`"npm ${command}" encountered an error`); - } - logger.info(`Successfully installed ${name}@${version}`); - } - catch (e) { - throw new Error(`Unable to install package: ${e}`); - } -} -/** - * Get the ".bin" path for the package. - */ -function _getBinPath(packageInstallFolder, binName) { - const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); - const resolvedBinName = os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32' ? `${binName}.cmd` : binName; - return path__WEBPACK_IMPORTED_MODULE_3__.resolve(binFolderPath, resolvedBinName); -} -/** - * Write a flag file to the package's install directory, signifying that the install was successful. - */ -function _writeFlagFile(packageInstallFolder) { - try { - const flagFilePath = path__WEBPACK_IMPORTED_MODULE_3__.join(packageInstallFolder, INSTALLED_FLAG_FILENAME); - fs__WEBPACK_IMPORTED_MODULE_1__.writeFileSync(flagFilePath, process.version); - } - catch (e) { - throw new Error(`Unable to create installed.flag file in ${packageInstallFolder}`); - } -} -function installAndRun(logger, packageName, packageVersion, packageBinName, packageBinArgs, lockFilePath = process.env[INSTALL_RUN_LOCKFILE_PATH_VARIABLE]) { - const rushJsonFolder = findRushJsonFolder(); - const rushCommonFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushJsonFolder, 'common'); - const rushTempFolder = _getRushTempFolder(rushCommonFolder); - const packageInstallFolder = _ensureAndJoinPath(rushTempFolder, 'install-run', `${packageName}@${packageVersion}`); - if (!_isPackageAlreadyInstalled(packageInstallFolder)) { - // The package isn't already installed - _cleanInstallFolder(rushTempFolder, packageInstallFolder, lockFilePath); - const sourceNpmrcFolder = path__WEBPACK_IMPORTED_MODULE_3__.join(rushCommonFolder, 'config', 'rush'); - (0,_utilities_npmrcUtilities__WEBPACK_IMPORTED_MODULE_4__.syncNpmrc)(sourceNpmrcFolder, packageInstallFolder, undefined, logger); - _createPackageJson(packageInstallFolder, packageName, packageVersion); - const command = lockFilePath ? 'ci' : 'install'; - _installPackage(logger, packageInstallFolder, packageName, packageVersion, command); - _writeFlagFile(packageInstallFolder); - } - const statusMessage = `Invoking "${packageBinName} ${packageBinArgs.join(' ')}"`; - const statusMessageLine = new Array(statusMessage.length + 1).join('-'); - logger.info('\n' + statusMessage + '\n' + statusMessageLine + '\n'); - const binPath = _getBinPath(packageInstallFolder, packageBinName); - const binFolderPath = path__WEBPACK_IMPORTED_MODULE_3__.resolve(packageInstallFolder, NODE_MODULES_FOLDER_NAME, '.bin'); - // Windows environment variables are case-insensitive. Instead of using SpawnSyncOptions.env, we need to - // assign via the process.env proxy to ensure that we append to the right PATH key. - const originalEnvPath = process.env.PATH || ''; - let result; - try { - // Node.js on Windows can not spawn a file when the path has a space on it - // unless the path gets wrapped in a cmd friendly way and shell mode is used - const shouldUseShell = binPath.includes(' ') && os__WEBPACK_IMPORTED_MODULE_2__.platform() === 'win32'; - const platformBinPath = shouldUseShell ? `"${binPath}"` : binPath; - process.env.PATH = [binFolderPath, originalEnvPath].join(path__WEBPACK_IMPORTED_MODULE_3__.delimiter); - result = child_process__WEBPACK_IMPORTED_MODULE_0__.spawnSync(platformBinPath, packageBinArgs, { - stdio: 'inherit', - windowsVerbatimArguments: false, - shell: shouldUseShell, - cwd: process.cwd(), - env: process.env - }); - } - finally { - process.env.PATH = originalEnvPath; - } - if (result.status !== null) { - return result.status; - } - else { - throw result.error || new Error('An unknown error occurred.'); - } -} -function runWithErrorAndStatusCode(logger, fn) { - process.exitCode = 1; - try { - const exitCode = fn(); - process.exitCode = exitCode; - } - catch (e) { - logger.error('\n\n' + e.toString() + '\n\n'); - } -} -function _run() { - const [nodePath /* Ex: /bin/node */, scriptPath /* /repo/common/scripts/install-run-rush.js */, rawPackageSpecifier /* qrcode@^1.2.0 */, packageBinName /* qrcode */, ...packageBinArgs /* [-f, myproject/lib] */] = process.argv; - if (!nodePath) { - throw new Error('Unexpected exception: could not detect node path'); - } - if (path__WEBPACK_IMPORTED_MODULE_3__.basename(scriptPath).toLowerCase() !== 'install-run.js') { - // If install-run.js wasn't directly invoked, don't execute the rest of this function. Return control - // to the script that (presumably) imported this file - return; - } - if (process.argv.length < 4) { - console.log('Usage: install-run.js @ [args...]'); - console.log('Example: install-run.js qrcode@1.2.2 qrcode https://rushjs.io'); - process.exit(1); - } - const logger = { info: console.log, error: console.error }; - runWithErrorAndStatusCode(logger, () => { - const rushJsonFolder = findRushJsonFolder(); - const rushCommonFolder = _ensureAndJoinPath(rushJsonFolder, 'common'); - const packageSpecifier = _parsePackageSpecifier(rawPackageSpecifier); - const name = packageSpecifier.name; - const version = _resolvePackageVersion(logger, rushCommonFolder, packageSpecifier); - if (packageSpecifier.version !== version) { - console.log(`Resolved to ${name}@${version}`); - } - return installAndRun(logger, name, version, packageBinName, packageBinArgs); - }); -} -_run(); -//# sourceMappingURL=install-run.js.map -})(); - -module.exports = __webpack_exports__; -/******/ })() -; -//# sourceMappingURL=install-run.js.map \ No newline at end of file diff --git a/modules/api/.eslintrc.yaml b/modules/api/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/api/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/cli/.eslintrc.yaml b/modules/cli/.eslintrc.yaml deleted file mode 100644 index 26c7ff40..00000000 --- a/modules/cli/.eslintrc.yaml +++ /dev/null @@ -1,14 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -ignorePatterns: - - "bin/" -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/common/.eslintrc.yaml b/modules/common/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/common/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/greenit/.eslintrc.yaml b/modules/greenit/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/greenit/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/lighthouse/.eslintrc.yaml b/modules/lighthouse/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/lighthouse/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/mysql/.eslintrc.yaml b/modules/mysql/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/mysql/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/observatory/.eslintrc.yaml b/modules/observatory/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/observatory/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/slack/.eslintrc.yaml b/modules/slack/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/slack/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/ssllabs-server/.eslintrc.yaml b/modules/ssllabs-server/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/ssllabs-server/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/modules/tpl/.eslintrc.yaml b/modules/tpl/.eslintrc.yaml deleted file mode 100644 index 6615ef24..00000000 --- a/modules/tpl/.eslintrc.yaml +++ /dev/null @@ -1,12 +0,0 @@ -parser: "@typescript-eslint/parser" -parserOptions: - tsconfigRootDir: __dirname - project: true -plugins: - - "@typescript-eslint" -extends: - # @see {@link https://eslint.org/docs/latest/rules/ } - - "eslint:recommended" - - "plugin:@typescript-eslint/strict-type-checked" - - "plugin:@typescript-eslint/stylistic-type-checked" - - "plugin:@ecocode/recommended" diff --git a/package.json b/package.json index 3ea42065..ffbdeaef 100644 --- a/package.json +++ b/package.json @@ -1,11 +1,8 @@ { "devDependencies": { - "@ecocode/eslint-plugin": "^1.4.0", + "@biomejs/biome": "1.7.3", "@jest/globals": "^29.7.0", "@types/jest": "^29.5.11", - "@typescript-eslint/eslint-plugin": "^6.18.1", - "@typescript-eslint/parser": "^6.18.1", - "eslint": "8.56.0", "jest": "^29.7.0", "ts-jest": "^29.1.1", "tsconfig-moon": "^1.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f299b905..def228d9 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,24 +8,15 @@ importers: .: devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.5.0(eslint@8.56.0) + '@biomejs/biome': + specifier: 1.7.3 + version: 1.7.3 '@jest/globals': specifier: ^29.7.0 version: 29.7.0 '@types/jest': specifier: ^29.5.11 version: 29.5.12 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.4.5) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.21.0(eslint@8.56.0)(typescript@5.4.5) - eslint: - specifier: 8.56.0 - version: 8.56.0 jest: specifier: ^29.7.0 version: 29.7.0 @@ -636,57 +627,99 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 + /@biomejs/biome@1.7.3: + resolution: {integrity: sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==} + engines: {node: '>=14.21.3'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.7.3 + '@biomejs/cli-darwin-x64': 1.7.3 + '@biomejs/cli-linux-arm64': 1.7.3 + '@biomejs/cli-linux-arm64-musl': 1.7.3 + '@biomejs/cli-linux-x64': 1.7.3 + '@biomejs/cli-linux-x64-musl': 1.7.3 + '@biomejs/cli-win32-arm64': 1.7.3 + '@biomejs/cli-win32-x64': 1.7.3 + dev: true + + /@biomejs/cli-darwin-arm64@1.7.3: + resolution: {integrity: sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@ecocode/eslint-plugin@1.5.0(eslint@8.56.0): - resolution: {integrity: sha512-q2WBsKw4C/z1mS0lACAkkxPKfTjEj0PbGeFk58bYZW4Bs2A/VHf5epmQOmx9QrPBm6xWY49goH7MZRTfaNqT7w==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} - peerDependencies: - eslint: '>=7' - dependencies: - eslint: 8.56.0 + /@biomejs/cli-darwin-x64@1.7.3: + resolution: {integrity: sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 + /@biomejs/cli-linux-arm64-musl@1.7.3: + resolution: {integrity: sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@eslint-community/regexpp@4.10.0: - resolution: {integrity: sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + /@biomejs/cli-linux-arm64@1.7.3: + resolution: {integrity: sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.5 - espree: 9.6.1 - globals: 13.24.0 - ignore: 5.3.1 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color + /@biomejs/cli-linux-x64-musl@1.7.3: + resolution: {integrity: sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + /@biomejs/cli-linux-x64@1.7.3: + resolution: {integrity: sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-arm64@1.7.3: + resolution: {integrity: sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@biomejs/cli-win32-x64@1.7.3: + resolution: {integrity: sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 dev: true /@fast-csv/format@4.3.5: @@ -767,26 +800,6 @@ packages: dependencies: tslib: 2.6.2 - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.3 - debug: 4.3.5 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.3: - resolution: {integrity: sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==} - dev: true - /@isaacs/cliui@8.0.2: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1645,10 +1658,6 @@ packages: pretty-format: 29.7.0 dev: true - /@types/json-schema@7.0.15: - resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} - dev: true - /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: @@ -1686,10 +1695,6 @@ packages: resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} dev: false - /@types/semver@7.5.8: - resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==} - dev: true - /@types/send@0.17.4: resolution: {integrity: sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==} dependencies: @@ -1726,138 +1731,6 @@ packages: '@types/node': 18.19.33 optional: true - /@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0)(eslint@8.56.0)(typescript@5.4.5): - resolution: {integrity: sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.10.0 - '@typescript-eslint/parser': 6.21.0(eslint@8.56.0)(typescript@5.4.5) - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/type-utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.3.1 - natural-compare: 1.4.0 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.21.0(eslint@8.56.0)(typescript@5.4.5): - resolution: {integrity: sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 - eslint: 8.56.0 - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@6.21.0: - resolution: {integrity: sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - dev: true - - /@typescript-eslint/type-utils@6.21.0(eslint@8.56.0)(typescript@5.4.5): - resolution: {integrity: sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - '@typescript-eslint/utils': 6.21.0(eslint@8.56.0)(typescript@5.4.5) - debug: 4.3.5 - eslint: 8.56.0 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@6.21.0: - resolution: {integrity: sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/typescript-estree@6.21.0(typescript@5.4.5): - resolution: {integrity: sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/visitor-keys': 6.21.0 - debug: 4.3.5 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.6.2 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@6.21.0(eslint@8.56.0)(typescript@5.4.5): - resolution: {integrity: sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.15 - '@types/semver': 7.5.8 - '@typescript-eslint/scope-manager': 6.21.0 - '@typescript-eslint/types': 6.21.0 - '@typescript-eslint/typescript-estree': 6.21.0(typescript@5.4.5) - eslint: 8.56.0 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@6.21.0: - resolution: {integrity: sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.21.0 - eslint-visitor-keys: 3.4.3 - dev: true - /@ultraq/array-utils@2.1.0: resolution: {integrity: sha512-TKO1zE6foqs5HG3+QH32yKwJ0zhZrm6J3UmltscveQmxCdbgIPXhNf3A8C9HakjyZDHVRK5pYZOU0tTl28YGFg==} engines: {node: '>=10'} @@ -1873,10 +1746,6 @@ packages: engines: {node: '>=10'} dev: false - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -1898,14 +1767,6 @@ packages: acorn-walk: 7.2.0 dev: false - /acorn-jsx@5.3.2(acorn@8.11.3): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.11.3 - dev: true - /acorn-loose@8.3.0: resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} engines: {node: '>=0.4.0'} @@ -2006,15 +1867,6 @@ packages: dependencies: ajv: 8.14.0 - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - /ajv@8.13.0: resolution: {integrity: sha512-PRA911Blj99jR5RMeTunVbNXMF6Lp4vZXnk5GQjcnUWUTsrXtekg/pnmFFI2u/I36Y/2bITGS30GZCXei6uNkA==} dependencies: @@ -2135,6 +1987,7 @@ packages: /argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false /array-union@2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} @@ -2843,10 +2696,6 @@ packages: optional: true dev: true - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - /deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -2909,13 +2758,6 @@ packages: dependencies: path-type: 4.0.0 - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - /domexception@2.0.1: resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} engines: {node: '>=8'} @@ -3020,98 +2862,15 @@ packages: optionalDependencies: source-map: 0.6.1 - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.10.0 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.5 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.24.0 - graphemer: 1.4.0 - ignore: 5.3.1 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.4 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - /esm@3.2.25: resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} engines: {node: '>=6'} - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.11.3 - acorn-jsx: 5.3.2(acorn@8.11.3) - eslint-visitor-keys: 3.4.3 - dev: true - /esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} hasBin: true - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - /estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -3244,10 +3003,6 @@ packages: json-schema-ref-resolver: 1.0.1 rfdc: 1.3.1 - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - /fast-querystring@1.1.2: resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} dependencies: @@ -3309,13 +3064,6 @@ packages: hasBin: true dev: true - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.2.0 - dev: true - /fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -3337,27 +3085,6 @@ packages: locate-path: 5.0.0 path-exists: 4.0.0 - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.2.0: - resolution: {integrity: sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flatted: 3.3.1 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flatted@3.3.1: - resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - dev: true - /follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} engines: {node: '>=4.0'} @@ -3513,13 +3240,6 @@ packages: dependencies: is-glob: 4.0.3 - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - /glob@10.4.1: resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} engines: {node: '>=16 || 14 >=14.18'} @@ -3558,13 +3278,6 @@ packages: engines: {node: '>=4'} dev: true - /globals@13.24.0: - resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -3596,10 +3309,6 @@ packages: /graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} @@ -3731,6 +3440,7 @@ packages: dependencies: parent-module: 1.0.1 resolve-from: 4.0.0 + dev: false /import-lazy@4.0.0: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} @@ -3836,11 +3546,6 @@ packages: resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} engines: {node: '>=8'} - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - /is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} dev: false @@ -4392,6 +4097,7 @@ packages: hasBin: true dependencies: argparse: 2.0.1 + dev: false /jsbn@1.1.0: resolution: {integrity: sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==} @@ -4446,6 +4152,7 @@ packages: /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: false /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} @@ -4455,17 +4162,9 @@ packages: dependencies: fast-deep-equal: 3.1.3 - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - /json-schema-traverse@1.0.0: resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - /json5@2.2.3: resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} engines: {node: '>=6'} @@ -4497,6 +4196,7 @@ packages: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} dependencies: json-buffer: 3.0.1 + dev: false /kleur@3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} @@ -4561,14 +4261,6 @@ packages: engines: {node: '>=6'} dev: true - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - /lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} dependencies: @@ -4645,13 +4337,6 @@ packages: dependencies: p-locate: 4.1.0 - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} dev: false @@ -4700,10 +4385,6 @@ packages: resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} dev: true - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - /lodash.union@4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} dev: false @@ -4853,13 +4534,6 @@ packages: brace-expansion: 2.0.1 dev: false - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - dev: true - /minimatch@9.0.4: resolution: {integrity: sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==} engines: {node: '>=16 || 14 >=14.17'} @@ -5001,18 +4675,6 @@ packages: is-docker: 2.2.1 is-wsl: 2.2.0 - /optionator@0.9.4: - resolution: {integrity: sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==} - engines: {node: '>= 0.8.0'} - dependencies: - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - word-wrap: 1.2.5 - dev: true - /ora@8.0.1: resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} engines: {node: '>=18'} @@ -5056,13 +4718,6 @@ packages: dependencies: p-limit: 2.3.0 - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - /p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} engines: {node: '>=8'} @@ -5121,6 +4776,7 @@ packages: engines: {node: '>=6'} dependencies: callsites: 3.1.0 + dev: false /parent-require@1.0.0: resolution: {integrity: sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==} @@ -5267,11 +4923,6 @@ packages: resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} engines: {node: '>=12.0.0'} - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -5555,6 +5206,7 @@ packages: /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + dev: false /resolve-from@5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} @@ -5617,6 +5269,7 @@ packages: hasBin: true dependencies: glob: 7.2.3 + dev: false /rimraf@5.0.7: resolution: {integrity: sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==} @@ -5993,10 +5646,6 @@ packages: dependencies: b4a: 1.6.6 - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - /third-party-web@0.24.3: resolution: {integrity: sha512-imE6hXZyaCeGinGFCvpWsv0oelsEaufSG39qYBQhp3urGq4OLOtsuEddf3XgKxmAAczBD/I1Tnp8L3gJ3ksTuQ==} @@ -6101,15 +5750,6 @@ packages: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: false - /ts-api-utils@1.3.0(typescript@5.4.5): - resolution: {integrity: sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==} - engines: {node: '>=16'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.4.5 - dev: true - /ts-jest@29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5): resolution: {integrity: sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} @@ -6204,23 +5844,11 @@ packages: /tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - /type-detect@4.0.8: resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} engines: {node: '>=4'} dev: true - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - /type-fest@0.21.3: resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} engines: {node: '>=10'} @@ -6420,11 +6048,6 @@ packages: dependencies: isexe: 2.0.0 - /word-wrap@1.2.5: - resolution: {integrity: sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==} - engines: {node: '>=0.10.0'} - dev: true - /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} From cbd79db8a5dbdc21cdab02769ffc1fbdc667236e Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 01:02:38 +0200 Subject: [PATCH 13/28] feat: add format and lint pre-commit hook --- .moon/hooks/pre-commit.sh | 8 ++++++++ .moon/tasks.yml | 10 ++++++++-- .moon/workspace.yml | 9 +++++++++ modules/common/src/error/InputError.ts | 18 +++++++++--------- 4 files changed, 34 insertions(+), 11 deletions(-) create mode 100755 .moon/hooks/pre-commit.sh diff --git a/.moon/hooks/pre-commit.sh b/.moon/hooks/pre-commit.sh new file mode 100755 index 00000000..abfead63 --- /dev/null +++ b/.moon/hooks/pre-commit.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -eo pipefail + +# Automatically generated by moon. DO NOT MODIFY! +# https://moonrepo.dev/docs/guides/vcs-hooks + +moon run :lint :format --affected --status=staged -- --staged --files-ignore-unknown=true --no-errors-on-unmatched + diff --git a/.moon/tasks.yml b/.moon/tasks.yml index 7b7795b6..ae62a67d 100644 --- a/.moon/tasks.yml +++ b/.moon/tasks.yml @@ -6,9 +6,15 @@ tasks: cleanup: command: rimraf lib format: - command: pnpm biome format ./ + command: pnpm biome format + options: + affectedFiles: true + affectedPassInputs: true lint: - command: pnpm biome lint ./ + command: pnpm biome lint + options: + affectedFiles: true + affectedPassInputs: true test: command: jest env: diff --git a/.moon/workspace.yml b/.moon/workspace.yml index 9324cc8b..c43dbcda 100644 --- a/.moon/workspace.yml +++ b/.moon/workspace.yml @@ -30,3 +30,12 @@ vcs: provider: github syncHooks: true + + hooks: + pre-commit: + # --affected with the tasks options affectedFiles: true and affectedPassInputs: true allows to reduce the set of files needed to allow a project to match. + # https://moonrepo.dev/docs/guides/vcs-hooks#pre-commit + # + # --staged will run the operation only on the staged files that match the biome.jssonc::files.includes patterns + # https://biomejs.dev/reference/cli/#biome-lint + - 'moon run :lint :format --affected --status=staged -- --staged --files-ignore-unknown=true --no-errors-on-unmatched' \ No newline at end of file diff --git a/modules/common/src/error/InputError.ts b/modules/common/src/error/InputError.ts index 916641c5..da5800ec 100644 --- a/modules/common/src/error/InputError.ts +++ b/modules/common/src/error/InputError.ts @@ -1,15 +1,15 @@ -import type { ErrorObject } from "ajv" +import type { ErrorObject } from "ajv"; export class InputError extends Error { - override cause: ErrorObject[] = [] + override cause: ErrorObject[] = []; - constructor(errors: ErrorObject[]) { - super("Something went wrong with the input validation") + constructor(errors: ErrorObject[]) { + super("Something went wrong with the input validation"); - // @see {@link https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work} - Object.setPrototypeOf(this, InputError.prototype) + // @see {@link https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work} + Object.setPrototypeOf(this, InputError.prototype); - // using the ErroOptions.cause does not change the cause property, so we are doing like that - this.cause = errors - } + // using the ErroOptions.cause does not change the cause property, so we are doing like that + this.cause = errors; + } } From 83934701cc4af6f5aa22b0631d3f3f29a6f43cc3 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 03:15:58 +0200 Subject: [PATCH 14/28] refactor: autofix lint & format --- modules/api/src/ApiModule.ts | 139 +++---- modules/api/src/index.ts | 13 +- .../src/notification/NotifyListenerModules.ts | 73 ++-- modules/api/src/router/RouteHandler.ts | 67 ++-- modules/api/tests/ApiModule.test.ts | 298 +++++++------- modules/api/tests/build/CreateServer.ts | 44 +-- modules/api/tests/data/AnalysisModules.ts | 123 +++--- modules/api/tests/data/ListenerModules.ts | 22 +- modules/cli/src/command/CommonOption.ts | 10 +- .../src/command/analysis/AnalysisCommand.ts | 241 ++++++------ .../src/command/analysis/AnalysisOption.ts | 124 +++--- modules/cli/src/command/cli/CliCommand.ts | 99 +++-- .../cli/src/command/server/ServerCommand.ts | 167 ++++---- .../cli/src/command/server/ServerOption.ts | 54 +-- modules/cli/src/error/EnvironmentError.ts | 19 +- modules/cli/src/error/ErrnoException.ts | 6 +- modules/cli/src/filesystem/fs.ts | 10 +- modules/cli/src/index.ts | 26 +- modules/cli/src/module/ModuleLoader.ts | 310 ++++++++------- modules/cli/src/module/ModuleMigration.ts | 54 +-- modules/cli/src/module/ModuleOrchestrator.ts | 135 ++++--- modules/cli/src/module/PackageJson.ts | 12 +- modules/cli/src/text/case.ts | 4 +- .../cli/tests/command/AnalysisCommand.test.ts | 227 ++++++----- .../cli/tests/command/ServerCommand.test.ts | 71 ++-- .../tests/module/ModuleOrchestrator.test.ts | 66 ++-- modules/common/src/entities/ReportEntity.ts | 62 +-- modules/common/src/entities/ServiceEntity.ts | 20 +- modules/common/src/http/Request.ts | 35 +- modules/common/src/index.ts | 198 +++++----- modules/common/src/input/AnalysisInput.ts | 20 +- modules/common/src/input/CommonInput.ts | 4 +- modules/common/src/input/ServerInput.ts | 18 +- modules/common/src/logger/logger.ts | 18 +- modules/common/src/module/Module.ts | 22 +- modules/common/src/module/ModuleIndex.ts | 6 +- modules/common/src/module/ModuleMetadata.ts | 22 +- .../analysis/ModuleAnalysisInterface.ts | 30 +- modules/common/src/module/config/Config.ts | 4 +- .../module/config/greenit/GreeenITConfig.ts | 27 +- .../config/lighthouse/LighthouseConfig.ts | 10 +- .../config/observatory/ObservatoryConfig.ts | 10 +- .../ssllabs-server/SsllabsServerConfig.ts | 76 ++-- .../listener/ModuleListenerDatabaseConfig.ts | 28 +- .../ModuleListenerDatabaseInterface.ts | 31 +- .../listener/ModuleListenerInterface.ts | 18 +- .../module/server/ModuleServerInterface.ts | 34 +- modules/common/src/report/Report.ts | 70 ++-- modules/common/src/report/Result.ts | 2 +- .../src/report/greenit/GreenITReport.ts | 109 ++--- .../src/report/greenit/GreenITResult.ts | 206 +++++----- .../src/report/lighthouse/LighthouseReport.ts | 194 ++++----- .../src/report/lighthouse/LighthouseResult.ts | 6 +- .../report/observatory/ObservatoryReport.ts | 109 ++--- .../report/observatory/ObservatoryResult.ts | 12 +- .../observatory/enum/ObservatoryScanState.ts | 12 +- .../observatory/model/ObservatoryScan.ts | 50 +-- .../observatory/model/ObservatoryTests.ts | 46 +-- .../ssllabs-server/SsllabsServerReport.ts | 205 +++++----- .../ssllabs-server/enum/SsllabsServerGrade.ts | 20 +- .../enum/SsllabsServerStatus.ts | 8 +- .../model/SsllabsServerEndpoint.ts | 42 +- .../model/SsllabsServerResult.ts | 30 +- modules/common/src/service/Service.ts | 16 +- modules/common/src/time/timeout.ts | 7 +- .../src/validation/input/InputValidation.ts | 25 +- .../input/analysis/AnalysisInputValidation.ts | 111 +++--- .../input/server/ServerInputValidation.ts | 34 +- modules/common/tests/timeout.test.ts | 16 +- .../analysis/AnalysisInputValidation.test.ts | 372 +++++++++--------- .../server/ServerInputValidation.test.ts | 234 +++++------ .../@types/greenit-cli/cli-core/analysis.d.ts | 76 ++-- .../greenit/src/@types/greenit-cli/index.d.ts | 23 +- modules/greenit/src/GreenITModule.ts | 94 +++-- modules/greenit/src/api/Client.ts | 121 +++--- modules/greenit/src/index.ts | 13 +- modules/greenit/tests/GreenITModule.test.ts | 283 ++++++------- modules/greenit/tests/data/Conf.ts | 10 +- modules/lighthouse/src/LighthouseModule.ts | 76 ++-- modules/lighthouse/src/api/Client.ts | 60 +-- modules/lighthouse/src/index.ts | 13 +- .../lighthouse/tests/LighthouseModule.test.ts | 110 +++--- modules/lighthouse/tests/api/Client.test.ts | 46 +-- modules/lighthouse/tests/data/Conf.ts | 23 +- modules/mysql/src/MySQLModule.ts | 93 ++--- modules/mysql/src/client/Client.ts | 162 ++++---- modules/mysql/src/config/mikro-orm.config.ts | 36 +- modules/mysql/src/index.ts | 13 +- .../src/migrations/Migration20230702150637.ts | 30 +- modules/observatory/src/ObservatoryModule.ts | 137 ++++--- modules/observatory/src/api/Client.ts | 113 +++--- modules/observatory/src/api/error/Error.ts | 7 +- .../observatory/src/error/ObservatoryError.ts | 12 +- modules/observatory/src/index.ts | 13 +- .../tests/ObservatoryModule.test.ts | 181 ++++----- modules/observatory/tests/api/Client.test.ts | 64 +-- modules/observatory/tests/data/Result.ts | 63 +-- modules/slack/src/SlackModule.ts | 54 +-- modules/slack/src/api/Client.ts | 44 +-- .../slack/src/formatter/BlocksFormatter.ts | 211 +++++----- .../formatter/GreenITStatisticsFormatter.ts | 147 +++---- .../LighthouseStatisticsFormatter.ts | 127 +++--- .../ObservatoryStatisticsFormatter.ts | 30 +- modules/slack/src/formatter/TextFormatter.ts | 24 +- modules/slack/src/index.ts | 13 +- .../ssllabs-server/src/SsllabsServerModule.ts | 152 +++---- modules/ssllabs-server/src/api/Client.ts | 114 +++--- modules/ssllabs-server/src/api/Error.ts | 14 +- .../src/error/SsllabsServerError.ts | 10 +- modules/ssllabs-server/src/index.ts | 13 +- 110 files changed, 4159 insertions(+), 3709 deletions(-) diff --git a/modules/api/src/ApiModule.ts b/modules/api/src/ApiModule.ts index 99b670e3..af7fd2d9 100644 --- a/modules/api/src/ApiModule.ts +++ b/modules/api/src/ApiModule.ts @@ -1,88 +1,93 @@ import { - Module, - getAnalysisValidationSchema, - logger, - type Config, - type GenericReport, - type ModuleAnalysisInterface, - type ModuleListenerInterface, - type ModuleMetadata, - type ModuleServerInterface, - type Result, -} from "@fabernovel/heart-common" -import cors, { type FastifyCorsOptions } from "@fastify/cors" -import AjvErrors from "ajv-errors" -import Fastify, { type FastifyInstance } from "fastify" -import { createNotifyListenerModulesHandler } from "./notification/NotifyListenerModules.js" -import { createRouteHandler } from "./router/RouteHandler.js" + Module, + getAnalysisValidationSchema, + logger, + type Config, + type GenericReport, + type ModuleAnalysisInterface, + type ModuleListenerInterface, + type ModuleMetadata, + type ModuleServerInterface, + type Result, +} from "@fabernovel/heart-common"; +import cors, { type FastifyCorsOptions } from "@fastify/cors"; +import AjvErrors from "ajv-errors"; +import Fastify, { type FastifyInstance } from "fastify"; +import { createNotifyListenerModulesHandler } from "./notification/NotifyListenerModules.js"; +import { createRouteHandler } from "./router/RouteHandler.js"; // using declaration merging, add your plugin props to the appropriate fastify interfaces // if prop type is defined here, the value will be typechecked when you call decorate{,Request,Reply} declare module "fastify" { - interface FastifyRequest { - report: GenericReport - } + interface FastifyRequest { + report: GenericReport; + } } export class ApiModule extends Module implements ModuleServerInterface { - #fastify: FastifyInstance + #fastify: FastifyInstance; - constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { - super(moduleMetadata, verbose) + constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { + super(moduleMetadata, verbose); - this.#fastify = Fastify({ - logger: verbose, - ajv: { - customOptions: { - allErrors: true, - }, - plugins: [AjvErrors.default], - }, - }) + this.#fastify = Fastify({ + logger: verbose, + ajv: { + customOptions: { + allErrors: true, + }, + plugins: [AjvErrors.default], + }, + }); - if (verbose) { - logger.info(`${moduleMetadata.name} initialized.`) - } - } + if (verbose) { + logger.info(`${moduleMetadata.name} initialized.`); + } + } - async createServer( - analysisModules: ModuleAnalysisInterface>[], - listenerModules: ModuleListenerInterface[], - corsOptions?: FastifyCorsOptions - ): Promise { - // plugins registration - await this.#fastify.register(cors, corsOptions) + async createServer( + analysisModules: ModuleAnalysisInterface>[], + listenerModules: ModuleListenerInterface[], + corsOptions?: FastifyCorsOptions, + ): Promise { + // plugins registration + await this.#fastify.register(cors, corsOptions); - // decorator registration - // objects must be initialized with "null" - this.#fastify.decorateRequest("report", null) + // decorator registration + // objects must be initialized with "null" + this.#fastify.decorateRequest("report", null); - // hooks registration - this.#fastify.addHook("onResponse", createNotifyListenerModulesHandler(listenerModules)) + // hooks registration + this.#fastify.addHook( + "onResponse", + createNotifyListenerModulesHandler(listenerModules), + ); - // route registration - this.#registerRoutes(analysisModules, listenerModules) + // route registration + this.#registerRoutes(analysisModules, listenerModules); - return this.#fastify - } + return this.#fastify; + } - #registerRoutes( - analysisModules: ModuleAnalysisInterface>[], - listenerModules: ModuleListenerInterface[] - ): void { - const bodySchema = getAnalysisValidationSchema(listenerModules.map((m) => m.id)) + #registerRoutes( + analysisModules: ModuleAnalysisInterface>[], + listenerModules: ModuleListenerInterface[], + ): void { + const bodySchema = getAnalysisValidationSchema( + listenerModules.map((m) => m.id), + ); - analysisModules.forEach((analysisModule) => { - const path = `/${analysisModule.id}` + analysisModules.forEach((analysisModule, _index) => { + const path = `/${analysisModule.id}`; - const routeHandler = createRouteHandler(analysisModule) + const routeHandler = createRouteHandler(analysisModule); - this.#fastify.post(path, { - handler: routeHandler, - schema: { - body: bodySchema, - }, - }) - }) - } + this.#fastify.post(path, { + handler: routeHandler, + schema: { + body: bodySchema, + }, + }); + }); + } } diff --git a/modules/api/src/index.ts b/modules/api/src/index.ts index a138b403..9780838d 100644 --- a/modules/api/src/index.ts +++ b/modules/api/src/index.ts @@ -1,6 +1,9 @@ -import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" -import { ApiModule } from "./ApiModule.js" +import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common"; +import { ApiModule } from "./ApiModule.js"; -export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { - return new ApiModule(moduleMetadata, verbose) -} +export const initialize: ModuleIndex["initialize"] = ( + moduleMetadata: ModuleMetadata, + verbose: boolean, +) => { + return new ApiModule(moduleMetadata, verbose); +}; diff --git a/modules/api/src/notification/NotifyListenerModules.ts b/modules/api/src/notification/NotifyListenerModules.ts index 81a96706..c3507b2a 100644 --- a/modules/api/src/notification/NotifyListenerModules.ts +++ b/modules/api/src/notification/NotifyListenerModules.ts @@ -1,44 +1,53 @@ import type { - ModuleListenerInterface, - ValidatedAnalysisInput, - GenericReport, - Result, -} from "@fabernovel/heart-common" -import type { FastifyRequest, FastifyReply } from "fastify" + ModuleListenerInterface, + ValidatedAnalysisInput, + GenericReport, + Result, +} from "@fabernovel/heart-common"; +import type { FastifyRequest, FastifyReply } from "fastify"; function notifyListenerModules( - listenerModules: ModuleListenerInterface[], - report: GenericReport + listenerModules: ModuleListenerInterface[], + report: GenericReport, ): Promise { - const notifyListenerModulesPromises = listenerModules.map((listenerModule) => { - return listenerModule.notifyAnalysisDone(report) - }) + const notifyListenerModulesPromises = listenerModules.map( + (listenerModule) => { + return listenerModule.notifyAnalysisDone(report); + }, + ); - return Promise.all(notifyListenerModulesPromises) + return Promise.all(notifyListenerModulesPromises); } export function createNotifyListenerModulesHandler( - listenerModules: ModuleListenerInterface[] -): (request: FastifyRequest<{ Body: ValidatedAnalysisInput }>, reply: FastifyReply) => Promise { - return async (request, reply) => { - if (reply.statusCode >= 200 && reply.statusCode < 300) { - const { except_listeners, only_listeners } = request.body + listenerModules: ModuleListenerInterface[], +): ( + request: FastifyRequest<{ Body: ValidatedAnalysisInput }>, + reply: FastifyReply, +) => Promise { + return async (request, reply) => { + if (reply.statusCode >= 200 && reply.statusCode < 300) { + const { except_listeners, only_listeners } = request.body; - const listenerModulesResolved = new Array() + const listenerModulesResolved = new Array(); - if (except_listeners !== undefined) { - listenerModulesResolved.push( - ...listenerModules.filter((listenerModule) => !except_listeners.includes(listenerModule.id)) - ) - } else if (only_listeners !== undefined) { - listenerModulesResolved.push( - ...listenerModules.filter((listenerModules) => only_listeners.includes(listenerModules.id)) - ) - } else { - listenerModulesResolved.push(...listenerModules) - } + if (except_listeners !== undefined) { + listenerModulesResolved.push( + ...listenerModules.filter( + (listenerModule) => !except_listeners.includes(listenerModule.id), + ), + ); + } else if (only_listeners !== undefined) { + listenerModulesResolved.push( + ...listenerModules.filter((listenerModules) => + only_listeners.includes(listenerModules.id), + ), + ); + } else { + listenerModulesResolved.push(...listenerModules); + } - await notifyListenerModules(listenerModulesResolved, request.report) - } - } + await notifyListenerModules(listenerModulesResolved, request.report); + } + }; } diff --git a/modules/api/src/router/RouteHandler.ts b/modules/api/src/router/RouteHandler.ts index d8bdf578..4178ade1 100644 --- a/modules/api/src/router/RouteHandler.ts +++ b/modules/api/src/router/RouteHandler.ts @@ -1,38 +1,41 @@ -import { - type Config, - type GenericReport, - type ModuleAnalysisInterface, - type Result, - type ValidatedAnalysisInput, -} from "@fabernovel/heart-common" -import type { FastifyReply, FastifyRequest } from "fastify" +import type { + Config, + GenericReport, + ModuleAnalysisInterface, + Result, + ValidatedAnalysisInput, +} from "@fabernovel/heart-common"; +import type { FastifyReply, FastifyRequest } from "fastify"; export function createRouteHandler( - analysisModule: ModuleAnalysisInterface> -): (request: FastifyRequest<{ Body: ValidatedAnalysisInput }>, reply: FastifyReply) => Promise { - return async (request, reply) => { - const { config, threshold } = request.body + analysisModule: ModuleAnalysisInterface>, +): ( + request: FastifyRequest<{ Body: ValidatedAnalysisInput }>, + reply: FastifyReply, +) => Promise { + return async (request, reply) => { + const { config, threshold } = request.body; - const report = await analysisModule.startAnalysis(config, threshold) + const report = await analysisModule.startAnalysis(config, threshold); - request.report = report + request.report = report; - return reply.send({ - analyzedUrl: report.analyzedUrl, - date: report.date, - grade: report.grade, - inputs: { - config: report.inputs.config, - threshold: report.inputs.threshold ?? null, - }, - isThresholdReached: report.isThresholdReached() ?? null, - normalizedGrade: report.normalizedGrade, - result: report.result, - resultUrl: report.resultUrl ?? null, - service: { - name: report.service.name, - logoUrl: report.service.logoUrl ?? null, - }, - }) - } + return reply.send({ + analyzedUrl: report.analyzedUrl, + date: report.date, + grade: report.grade, + inputs: { + config: report.inputs.config, + threshold: report.inputs.threshold ?? null, + }, + isThresholdReached: report.isThresholdReached() ?? null, + normalizedGrade: report.normalizedGrade, + result: report.result, + resultUrl: report.resultUrl ?? null, + service: { + name: report.service.name, + logoUrl: report.service.logoUrl ?? null, + }, + }); + }; } diff --git a/modules/api/tests/ApiModule.test.ts b/modules/api/tests/ApiModule.test.ts index 97a78f90..7dd7277c 100644 --- a/modules/api/tests/ApiModule.test.ts +++ b/modules/api/tests/ApiModule.test.ts @@ -1,192 +1,192 @@ -import { createServer } from "./build/CreateServer.js" -import { analysisModules } from "./data/AnalysisModules.js" -import { listenerModules } from "./data/ListenerModules.js" +import { createServer } from "./build/CreateServer.js"; +import { analysisModules } from "./data/AnalysisModules.js"; +import { listenerModules } from "./data/ListenerModules.js"; describe("Start an analysis with an invalid request", () => { - test("Get a 404 status code with an invalid verb and path", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 404 status code with an invalid verb and path", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "GET", - url: "/invalid-path", - }) + const response = await fastify.inject({ + method: "GET", + url: "/invalid-path", + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(404) - }) + expect(response.statusCode).toBe(404); + }); - test("Get a 404 status code with an invalid verb but a valid path", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 404 status code with an invalid verb but a valid path", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "GET", - url: "/greenit", - }) + const response = await fastify.inject({ + method: "GET", + url: "/greenit", + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(404) - }) + expect(response.statusCode).toBe(404); + }); - test("Get a 404 status code with a valid verb but an invalid path", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 404 status code with a valid verb but an invalid path", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "POST", - url: "/invalid-path", - }) + const response = await fastify.inject({ + method: "POST", + url: "/invalid-path", + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(404) - }) + expect(response.statusCode).toBe(404); + }); - test("Get a 400 status code on POST /observatory with an missing body", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 400 status code on POST /observatory with an missing body", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "POST", - url: "/observatory", - }) + const response = await fastify.inject({ + method: "POST", + url: "/observatory", + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(400) - }) + expect(response.statusCode).toBe(400); + }); - test("Get a 400 status code on POST /observatory with an invalid format on the except_listeners property", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 400 status code on POST /observatory with an invalid format on the except_listeners property", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "POST", - url: "/observatory", - payload: { - except_listeners: "wrong-format", - }, - }) + const response = await fastify.inject({ + method: "POST", + url: "/observatory", + payload: { + except_listeners: "wrong-format", + }, + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(400) - }) + expect(response.statusCode).toBe(400); + }); - test("Get a 400 status code on POST /greenit with a valid format but an incorrect value on the except_listeners property", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 400 status code on POST /greenit with a valid format but an incorrect value on the except_listeners property", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "POST", - url: "/greenit", - payload: { - except_listeners: ["invalid-module-id"], - }, - }) + const response = await fastify.inject({ + method: "POST", + url: "/greenit", + payload: { + except_listeners: ["invalid-module-id"], + }, + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(400) - }) + expect(response.statusCode).toBe(400); + }); - test("Get a 400 status code on POST /observatory with an invalid format on the only_listeners property", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 400 status code on POST /observatory with an invalid format on the only_listeners property", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "POST", - url: "/observatory", - payload: { - only_listeners: "wrong-format", - }, - }) + const response = await fastify.inject({ + method: "POST", + url: "/observatory", + payload: { + only_listeners: "wrong-format", + }, + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(400) - }) + expect(response.statusCode).toBe(400); + }); - test("Get a 400 status code on POST /greenit with a valid format but an incorrect value on the only_listeners property", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 400 status code on POST /greenit with a valid format but an incorrect value on the only_listeners property", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "POST", - url: "/greenit", - payload: { - only_listeners: ["invalid-module-id"], - }, - }) + const response = await fastify.inject({ + method: "POST", + url: "/greenit", + payload: { + only_listeners: ["invalid-module-id"], + }, + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(400) - }) + expect(response.statusCode).toBe(400); + }); - test("Get a 400 status code on POST /greenit with an invalid threshold format", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 400 status code on POST /greenit with an invalid threshold format", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "POST", - url: "/greenit", - payload: {}, - query: { - threshold: "invalid", - }, - }) + const response = await fastify.inject({ + method: "POST", + url: "/greenit", + payload: {}, + query: { + threshold: "invalid", + }, + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(400) - }) + expect(response.statusCode).toBe(400); + }); - test("Get a 400 status code on POST /greenit with a valid threshold format but an incorrect value", async () => { - const fastify = await createServer(analysisModules, listenerModules) + test("Get a 400 status code on POST /greenit with a valid threshold format but an incorrect value", async () => { + const fastify = await createServer(analysisModules, listenerModules); - const response = await fastify.inject({ - method: "POST", - url: "/greenit", - payload: { - threshold: "123", - }, - }) + const response = await fastify.inject({ + method: "POST", + url: "/greenit", + payload: { + threshold: "123", + }, + }); - await fastify.close() + await fastify.close(); - expect(response.statusCode).toBe(400) - }) -}) + expect(response.statusCode).toBe(400); + }); +}); describe("Start an analysis with a valid request", () => { - test("Get a 200 status code on POST /greenit with a valid body", async () => { - const fastify = await createServer(analysisModules, listenerModules) - - const response = await fastify.inject({ - method: "POST", - url: "/greenit", - payload: { - config: { - url: "", - }, - }, - }) - - await fastify.close() - - expect(response.statusCode).toBe(200) - }) - - test("Get a 200 status code on POST /observatory with a valid body", async () => { - const fastify = await createServer(analysisModules, listenerModules) - - const response = await fastify.inject({ - method: "POST", - url: "/observatory", - payload: { - config: { - url: "", - }, - }, - }) - - await fastify.close() - - expect(response.statusCode).toBe(200) - }) -}) + test("Get a 200 status code on POST /greenit with a valid body", async () => { + const fastify = await createServer(analysisModules, listenerModules); + + const response = await fastify.inject({ + method: "POST", + url: "/greenit", + payload: { + config: { + url: "", + }, + }, + }); + + await fastify.close(); + + expect(response.statusCode).toBe(200); + }); + + test("Get a 200 status code on POST /observatory with a valid body", async () => { + const fastify = await createServer(analysisModules, listenerModules); + + const response = await fastify.inject({ + method: "POST", + url: "/observatory", + payload: { + config: { + url: "", + }, + }, + }); + + await fastify.close(); + + expect(response.statusCode).toBe(200); + }); +}); diff --git a/modules/api/tests/build/CreateServer.ts b/modules/api/tests/build/CreateServer.ts index 8661fc5d..16c5b358 100644 --- a/modules/api/tests/build/CreateServer.ts +++ b/modules/api/tests/build/CreateServer.ts @@ -1,28 +1,28 @@ import type { - Config, - GenericReport, - ModuleAnalysisInterface, - ModuleListenerInterface, - Result, -} from "@fabernovel/heart-common" -import type { FastifyInstance } from "fastify" -import { ApiModule } from "../../src/ApiModule.js" + Config, + GenericReport, + ModuleAnalysisInterface, + ModuleListenerInterface, + Result, +} from "@fabernovel/heart-common"; +import type { FastifyInstance } from "fastify"; +import { ApiModule } from "../../src/ApiModule.js"; export async function createServer( - analysisModules: ModuleAnalysisInterface>[], - listenerModules: ModuleListenerInterface[] + analysisModules: ModuleAnalysisInterface>[], + listenerModules: ModuleListenerInterface[], ): Promise { - const apiModule = new ApiModule( - { - id: "api", - type: "server", - name: "Heart API", - service: { - name: "Heart API", - }, - }, - false - ) + const apiModule = new ApiModule( + { + id: "api", + type: "server", + name: "Heart API", + service: { + name: "Heart API", + }, + }, + false, + ); - return apiModule.createServer(analysisModules, listenerModules) + return apiModule.createServer(analysisModules, listenerModules); } diff --git a/modules/api/tests/data/AnalysisModules.ts b/modules/api/tests/data/AnalysisModules.ts index b27ecbfc..8243a148 100644 --- a/modules/api/tests/data/AnalysisModules.ts +++ b/modules/api/tests/data/AnalysisModules.ts @@ -1,62 +1,65 @@ import { - type ModuleAnalysisInterface, - type Config, - type GenericReport, - type Result, - GreenITReport, - ObservatoryReport, -} from "@fabernovel/heart-common" + type ModuleAnalysisInterface, + type Config, + type GenericReport, + type Result, + GreenITReport, + ObservatoryReport, +} from "@fabernovel/heart-common"; -export const analysisModules: ModuleAnalysisInterface>[] = [ - { - id: "greenit", - name: "Heart GreenIT", - service: { - name: "GreenIT Analysis", - }, - startAnalysis: () => - Promise.resolve( - new GreenITReport({ - analyzedUrl: "", - date: new Date(), - inputs: { - config: {}, - }, - result: {} as unknown as GreenITReport["result"], - service: { - name: "GreenIT Analysis", - }, - }) - ), - verbose: false, - }, - { - id: "observatory", - name: "Heart Observatory", - service: { - name: "Mozilla Observatory", - }, - startAnalysis: () => - Promise.resolve( - new ObservatoryReport({ - analyzedUrl: "", - date: new Date(), - inputs: { - config: {}, - }, - result: { - scan: { - grade: "", - score: 100, - state: "FINISHED", - } as unknown as ObservatoryReport["result"]["scan"], - tests: {}, - }, - service: { - name: "GreenIT Analysis", - }, - }) - ), - verbose: false, - }, -] +export const analysisModules: ModuleAnalysisInterface< + Config, + GenericReport +>[] = [ + { + id: "greenit", + name: "Heart GreenIT", + service: { + name: "GreenIT Analysis", + }, + startAnalysis: () => + Promise.resolve( + new GreenITReport({ + analyzedUrl: "", + date: new Date(), + inputs: { + config: {}, + }, + result: {} as unknown as GreenITReport["result"], + service: { + name: "GreenIT Analysis", + }, + }), + ), + verbose: false, + }, + { + id: "observatory", + name: "Heart Observatory", + service: { + name: "Mozilla Observatory", + }, + startAnalysis: () => + Promise.resolve( + new ObservatoryReport({ + analyzedUrl: "", + date: new Date(), + inputs: { + config: {}, + }, + result: { + scan: { + grade: "", + score: 100, + state: "FINISHED", + } as unknown as ObservatoryReport["result"]["scan"], + tests: {}, + }, + service: { + name: "GreenIT Analysis", + }, + }), + ), + verbose: false, + }, +]; diff --git a/modules/api/tests/data/ListenerModules.ts b/modules/api/tests/data/ListenerModules.ts index fdcd9599..9e5cea12 100644 --- a/modules/api/tests/data/ListenerModules.ts +++ b/modules/api/tests/data/ListenerModules.ts @@ -1,13 +1,13 @@ -import type { ModuleListenerInterface } from "@fabernovel/heart-common" +import type { ModuleListenerInterface } from "@fabernovel/heart-common"; export const listenerModules: ModuleListenerInterface[] = [ - { - id: "listener1", - name: "Heart Listener1", - service: { - name: "Listener1", - }, - notifyAnalysisDone: () => Promise.resolve(), - verbose: false, - }, -] + { + id: "listener1", + name: "Heart Listener1", + service: { + name: "Listener1", + }, + notifyAnalysisDone: () => Promise.resolve(), + verbose: false, + }, +]; diff --git a/modules/cli/src/command/CommonOption.ts b/modules/cli/src/command/CommonOption.ts index fac522df..66e104b8 100644 --- a/modules/cli/src/command/CommonOption.ts +++ b/modules/cli/src/command/CommonOption.ts @@ -1,13 +1,13 @@ -import { Option } from "commander" +import { Option } from "commander"; export interface CommonOptions { - verbose: boolean + verbose: boolean; } export function createVerboseOption(): Option { - const option = new Option("-v,--verbose", "Displays debug informations") + const option = new Option("-v,--verbose", "Displays debug informations"); - option.defaultValue = false + option.defaultValue = false; - return option + return option; } diff --git a/modules/cli/src/command/analysis/AnalysisCommand.ts b/modules/cli/src/command/analysis/AnalysisCommand.ts index d5273cc4..d32c004d 100644 --- a/modules/cli/src/command/analysis/AnalysisCommand.ts +++ b/modules/cli/src/command/analysis/AnalysisCommand.ts @@ -1,107 +1,115 @@ import { - InputError, - validateAnalysisInput, - type Config, - type ModuleMetadata, - type ParsedAnalysisInput, - type ModuleListenerDatabaseInterface, - isModuleListenerDatabase, - type GenericReport, - type ModuleAnalysisInterface, - type ModuleListenerInterface, - type Result, -} from "@fabernovel/heart-common" -import { Command, InvalidArgumentError } from "commander" -import type { PackageJsonModule } from "../../module/PackageJson.js" -import { createVerboseOption, type CommonOptions } from "../CommonOption.js" + InputError, + validateAnalysisInput, + type Config, + type ModuleMetadata, + type ParsedAnalysisInput, + type ModuleListenerDatabaseInterface, + isModuleListenerDatabase, + type GenericReport, + type ModuleAnalysisInterface, + type ModuleListenerInterface, + type Result, +} from "@fabernovel/heart-common"; +import { Command, InvalidArgumentError } from "commander"; +import type { PackageJsonModule } from "../../module/PackageJson.js"; +import { createVerboseOption, type CommonOptions } from "../CommonOption.js"; import { - createConfigOption, - createExceptListenersOption, - createOnlyListenersOption, - createThresholdOption, - type AnalysisOptions, -} from "./AnalysisOption.js" -import { checkEnv, initializeModules } from "../../module/ModuleLoader.js" -import { migrateListenerDatabase } from "../../module/ModuleMigration.js" -import { startAnalysis, notifyListenerModules } from "../../module/ModuleOrchestrator.js" + createConfigOption, + createExceptListenersOption, + createOnlyListenersOption, + createThresholdOption, + type AnalysisOptions, +} from "./AnalysisOption.js"; +import { checkEnv, initializeModules } from "../../module/ModuleLoader.js"; +import { migrateListenerDatabase } from "../../module/ModuleMigration.js"; +import { + startAnalysis, + notifyListenerModules, +} from "../../module/ModuleOrchestrator.js"; type AnalysisSubcommandCallback = ( - verbose: boolean, - config: C, - threshold: number | undefined, - listenerModulesMetadataMapFiltered: Map -) => Promise + verbose: boolean, + config: C, + threshold: number | undefined, + listenerModulesMetadataMapFiltered: Map, +) => Promise; -function prepareOptionsForValidation(options: AnalysisOptions): ParsedAnalysisInput { - return { - config: options.config, - threshold: options.threshold, - except_listeners: options.exceptListeners, - only_listeners: options.onlyListeners, - verbose: options.verbose, - } +function prepareOptionsForValidation( + options: AnalysisOptions, +): ParsedAnalysisInput { + return { + config: options.config, + threshold: options.threshold, + except_listeners: options.exceptListeners, + only_listeners: options.onlyListeners, + verbose: options.verbose, + }; } /** * Create a command dedicated to the given analysis module */ export const createAnalysisSubcommand = ( - moduleMetadata: ModuleMetadata, - listenerModulesMetadataMap: Map, - callback: AnalysisSubcommandCallback + moduleMetadata: ModuleMetadata, + listenerModulesMetadataMap: Map, + callback: AnalysisSubcommandCallback, ): Command => { - const subcommand = new Command(moduleMetadata.id) + const subcommand = new Command(moduleMetadata.id); - subcommand - .description(`Analyzes a URL with ${moduleMetadata.service.name}`) - .addOption(createVerboseOption()) - .addOption(createConfigOption()) - .addOption(createThresholdOption()) - .addOption(createExceptListenersOption()) - .addOption(createOnlyListenersOption()) - .action(async (options: CommonOptions & AnalysisOptions) => { - const listenerModulesIds = new Array() - listenerModulesMetadataMap.forEach((metadata) => { - listenerModulesIds.push(metadata.heart.id) - }) + subcommand + .description(`Analyzes a URL with ${moduleMetadata.service.name}`) + .addOption(createVerboseOption()) + .addOption(createConfigOption()) + .addOption(createThresholdOption()) + .addOption(createExceptListenersOption()) + .addOption(createOnlyListenersOption()) + .action(async (options: CommonOptions & AnalysisOptions) => { + const listenerModulesIds = new Array(); + listenerModulesMetadataMap.forEach((metadata, _key) => { + listenerModulesIds.push(metadata.heart.id); + }); - try { - const unvalidatedInputs = prepareOptionsForValidation(options) - const { config, threshold, except_listeners, only_listeners } = validateAnalysisInput( - unvalidatedInputs, - listenerModulesIds - ) + try { + const unvalidatedInputs = prepareOptionsForValidation(options); + const { config, threshold, except_listeners, only_listeners } = + validateAnalysisInput(unvalidatedInputs, listenerModulesIds); - // reduce the listener modules that will be triggered at the end of the analysis - // if the --except-listeners or --only-listeners options are used. - // the options are mutually exclusive (see the validation above), that why there is an if/else. - if (except_listeners !== undefined) { - listenerModulesMetadataMap.forEach((metadata, modulePath, m) => { - if (except_listeners.includes(metadata.heart.id)) { - m.delete(modulePath) - } - }) - } else if (only_listeners !== undefined) { - listenerModulesMetadataMap.forEach((metadata, modulePath, m) => { - if (!only_listeners.includes(metadata.heart.id)) { - m.delete(modulePath) - } - }) - } + // reduce the listener modules that will be triggered at the end of the analysis + // if the --except-listeners or --only-listeners options are used. + // the options are mutually exclusive (see the validation above), that why there is an if/else. + if (except_listeners !== undefined) { + listenerModulesMetadataMap.forEach((metadata, modulePath, m) => { + if (except_listeners.includes(metadata.heart.id)) { + m.delete(modulePath); + } + }); + } else if (only_listeners !== undefined) { + listenerModulesMetadataMap.forEach((metadata, modulePath, m) => { + if (!only_listeners.includes(metadata.heart.id)) { + m.delete(modulePath); + } + }); + } - await callback(options.verbose, config as C, threshold, listenerModulesMetadataMap) - } catch (error) { - if (error instanceof InputError) { - const e = new InvalidArgumentError(error.cause[0].message ?? error.message) - return Promise.reject(e) - } else { - return Promise.reject(error) - } - } - }) + await callback( + options.verbose, + config as C, + threshold, + listenerModulesMetadataMap, + ); + } catch (error) { + const e = + error instanceof InputError + ? new InvalidArgumentError(error.cause[0].message ?? error.message) + : error; - return subcommand -} + return Promise.reject(e); + } + }); + + return subcommand; +}; /** * Callback function called once the CLI command has been executed (the user hit "enter"). @@ -110,39 +118,38 @@ export const createAnalysisSubcommand = ( * @param listenerModulesMetadataMap Filtered map of listener modules metadata and their file path */ export function createAnalysisSubcommandCallback( - packageJsonModule: PackageJsonModule, - modulePath: string + packageJsonModule: PackageJsonModule, + modulePath: string, ): AnalysisSubcommandCallback { - return async ( - verbose: boolean, - config: C, - threshold: number | undefined, - listenerModulesMetadataMap: Map - ) => { - await checkEnv([modulePath, ...listenerModulesMetadataMap.keys()]) + return async ( + verbose: boolean, + config: C, + threshold: number | undefined, + listenerModulesMetadataMap: Map, + ) => { + await checkEnv([modulePath, ...listenerModulesMetadataMap.keys()]); - // initialize the modules - const analysisModules = await initializeModules>>( - new Map([[modulePath, packageJsonModule]]), - verbose - ) - const listenerModules = await initializeModules( - listenerModulesMetadataMap, - verbose - ) + // initialize the modules + const analysisModules = await initializeModules< + ModuleAnalysisInterface> + >(new Map([[modulePath, packageJsonModule]]), verbose); + const listenerModules = await initializeModules( + listenerModulesMetadataMap, + verbose, + ); - // run database migrations for listener database modules - const listenerDatabaseModules = listenerModules.filter( - (listenerModule): listenerModule is ModuleListenerDatabaseInterface => - isModuleListenerDatabase(listenerModule) - ) - if (listenerDatabaseModules.length > 0) { - await migrateListenerDatabase(listenerDatabaseModules) - } + // run database migrations for listener database modules + const listenerDatabaseModules = listenerModules.filter( + (listenerModule): listenerModule is ModuleListenerDatabaseInterface => + isModuleListenerDatabase(listenerModule), + ); + if (listenerDatabaseModules.length > 0) { + await migrateListenerDatabase(listenerDatabaseModules); + } - const report = await startAnalysis(analysisModules[0], config, threshold) + const report = await startAnalysis(analysisModules[0], config, threshold); - // notify the listener modules - await notifyListenerModules(listenerModules, report) - } + // notify the listener modules + await notifyListenerModules(listenerModules, report); + }; } diff --git a/modules/cli/src/command/analysis/AnalysisOption.ts b/modules/cli/src/command/analysis/AnalysisOption.ts index e5afd99d..304ac580 100644 --- a/modules/cli/src/command/analysis/AnalysisOption.ts +++ b/modules/cli/src/command/analysis/AnalysisOption.ts @@ -1,28 +1,30 @@ -import { InvalidArgumentError, Option } from "commander" -import type { JsonValue } from "type-fest" -import { isErrnoException } from "../../error/ErrnoException.js" -import { readFile } from "../../filesystem/fs.js" -import { snakeCaseToCamelCase } from "../../text/case.js" -import type { CommonOptions } from "../CommonOption.js" +import { InvalidArgumentError, Option } from "commander"; +import type { JsonValue } from "type-fest"; +import { isErrnoException } from "../../error/ErrnoException.js"; +import { readFile } from "../../filesystem/fs.js"; +import { snakeCaseToCamelCase } from "../../text/case.js"; +import type { CommonOptions } from "../CommonOption.js"; export type AnalysisOptions = CommonOptions & { config: JsonValue } & Partial<{ - threshold: number - exceptListeners: string[] // array of strings because of the .argParser() on the Option - onlyListeners: string[] // array of strings because of the .argParser() on the Option - }> + threshold: number; + exceptListeners: string[]; // array of strings because of the .argParser() on the Option + onlyListeners: string[]; // array of strings because of the .argParser() on the Option + }>; // the keys are used to create the options names: // - options long names: keys names // - options short names: first letter of the keys names -const ANALYSIS_OPTIONS: { [key in keyof Omit]-?: string } = { - config: "config", - threshold: "threshold", - exceptListeners: "except-listeners", - onlyListeners: "only-listeners", -} +const ANALYSIS_OPTIONS: { + [key in keyof Omit]-?: string; +} = { + config: "config", + threshold: "threshold", + exceptListeners: "except-listeners", + onlyListeners: "only-listeners", +}; function parseConfig(config: string): JsonValue { - return JSON.parse(config) as JsonValue + return JSON.parse(config) as JsonValue; } /** @@ -31,32 +33,32 @@ function parseConfig(config: string): JsonValue { * Additional JSON schema validation is done in a dedicated validation process. */ export function createConfigOption(): Option { - return new Option( - `-${ANALYSIS_OPTIONS.config[0]}, --${ANALYSIS_OPTIONS.config} <${ANALYSIS_OPTIONS.config}>", "Path to the JSON configuration file` - ).argParser((config) => { - try { - const configStringified = readFile(config) + return new Option( + `-${ANALYSIS_OPTIONS.config[0]}, --${ANALYSIS_OPTIONS.config} <${ANALYSIS_OPTIONS.config}>", "Path to the JSON configuration file`, + ).argParser((config) => { + try { + const configStringified = readFile(config); - return parseConfig(configStringified) - } catch (error) { - if (isErrnoException(error)) { - // triggered if the file cannot be read (e.g. invalid path) - try { - return parseConfig(config) - } catch (error) { - throw new InvalidArgumentError( - "The configuration is neither a file or a valid stringified JSON. Please check the file path or the JSON syntax." - ) - } - } else if (error instanceof SyntaxError) { - throw new InvalidArgumentError( - "The content of the configuration file cannot be parsed as JSON. Please check the syntax." - ) - } + return parseConfig(configStringified); + } catch (error) { + if (isErrnoException(error)) { + // triggered if the file cannot be read (e.g. invalid path) + try { + return parseConfig(config); + } catch (error) { + throw new InvalidArgumentError( + "The configuration is neither a file or a valid stringified JSON. Please check the file path or the JSON syntax.", + ); + } + } else if (error instanceof SyntaxError) { + throw new InvalidArgumentError( + "The content of the configuration file cannot be parsed as JSON. Please check the syntax.", + ); + } - throw error - } - }) + throw error; + } + }); } /** @@ -65,18 +67,18 @@ export function createConfigOption(): Option { * Additional JSON schema validation is done in a dedicated validation process. */ export function createThresholdOption(): Option { - return new Option( - `-${ANALYSIS_OPTIONS.threshold[0]}, --${ANALYSIS_OPTIONS.threshold} <${ANALYSIS_OPTIONS.threshold}>`, - "A threshold between 0 and 100 that you want to reach with the analysis" - ).argParser((value) => { - const threshold = Number(value) + return new Option( + `-${ANALYSIS_OPTIONS.threshold[0]}, --${ANALYSIS_OPTIONS.threshold} <${ANALYSIS_OPTIONS.threshold}>`, + "A threshold between 0 and 100 that you want to reach with the analysis", + ).argParser((value) => { + const threshold = Number(value); - if (isNaN(threshold)) { - throw new InvalidArgumentError(`Must be a number`) - } + if (Number.isNaN(threshold)) { + throw new InvalidArgumentError("Must be a number"); + } - return threshold - }) + return threshold; + }); } /** @@ -85,10 +87,12 @@ export function createThresholdOption(): Option { * Additional JSON schema validation is done in a dedicated validation process. */ export function createExceptListenersOption(): Option { - return new Option( - `-le, --${ANALYSIS_OPTIONS.exceptListeners} <${snakeCaseToCamelCase(ANALYSIS_OPTIONS.exceptListeners)}>`, - "A comma-separated list of listener modules that will not be triggered after the analysis is done" - ).argParser((value) => value.split(",")) + return new Option( + `-le, --${ANALYSIS_OPTIONS.exceptListeners} <${snakeCaseToCamelCase( + ANALYSIS_OPTIONS.exceptListeners, + )}>`, + "A comma-separated list of listener modules that will not be triggered after the analysis is done", + ).argParser((value) => value.split(",")); } /** @@ -97,8 +101,10 @@ export function createExceptListenersOption(): Option { * Additional JSON schema validation is done in a dedicated validation process. */ export function createOnlyListenersOption(): Option { - return new Option( - `-lo, --${ANALYSIS_OPTIONS.onlyListeners} <${snakeCaseToCamelCase(ANALYSIS_OPTIONS.onlyListeners)}>`, - "A comma-separated list of listener modules that will be triggered after the analysis is done" - ).argParser((value) => value.split(",")) + return new Option( + `-lo, --${ANALYSIS_OPTIONS.onlyListeners} <${snakeCaseToCamelCase( + ANALYSIS_OPTIONS.onlyListeners, + )}>`, + "A comma-separated list of listener modules that will be triggered after the analysis is done", + ).argParser((value) => value.split(",")); } diff --git a/modules/cli/src/command/cli/CliCommand.ts b/modules/cli/src/command/cli/CliCommand.ts index a4aa04e9..84b70d3f 100644 --- a/modules/cli/src/command/cli/CliCommand.ts +++ b/modules/cli/src/command/cli/CliCommand.ts @@ -1,10 +1,16 @@ -import { Command } from "commander" -import { readFileSync } from "node:fs" -import { argv } from "node:process" -import type { PackageJson } from "type-fest" -import { loadModulesMetadata } from "../../module/ModuleLoader.js" -import { createAnalysisSubcommand, createAnalysisSubcommandCallback } from "../analysis/AnalysisCommand.js" -import { createServerSubcommand, createServerSubcommandCallback } from "../server/ServerCommand.js" +import { Command } from "commander"; +import { readFileSync } from "node:fs"; +import { argv } from "node:process"; +import type { PackageJson } from "type-fest"; +import { loadModulesMetadata } from "../../module/ModuleLoader.js"; +import { + createAnalysisSubcommand, + createAnalysisSubcommandCallback, +} from "../analysis/AnalysisCommand.js"; +import { + createServerSubcommand, + createServerSubcommandCallback, +} from "../server/ServerCommand.js"; /** * Create the Commander Command object. @@ -12,14 +18,16 @@ import { createServerSubcommand, createServerSubcommandCallback } from "../serve * Add a --debug option. */ function createCommand(): Command { - const cmd = new Command() + const cmd = new Command(); - const packageJsonUrl = new URL(`../../../package.json`, import.meta.url) - const packageJson = JSON.parse(readFileSync(packageJsonUrl, "utf8")) as PackageJson + const packageJsonUrl = new URL("../../../package.json", import.meta.url); + const packageJson = JSON.parse( + readFileSync(packageJsonUrl, "utf8"), + ) as PackageJson; - cmd.version(packageJson.version ?? "") + cmd.version(packageJson.version ?? ""); - return cmd + return cmd; } /** @@ -27,40 +35,49 @@ function createCommand(): Command { * 2. Create the CLI command: one CLI argument per analysis and server module. */ export async function start(cwd: string): Promise { - const cmd = createCommand() - const [analysisModulesMetadataMap, listenerModulesMetadataMap, serverModulesMetadataMap] = - await loadModulesMetadata(cwd) + const cmd = createCommand(); + const [ + analysisModulesMetadataMap, + listenerModulesMetadataMap, + serverModulesMetadataMap, + ] = await loadModulesMetadata(cwd); - // create and add 1 command for each analysis module - analysisModulesMetadataMap.forEach((packageJsonModule, modulePath) => { - const callback = createAnalysisSubcommandCallback(packageJsonModule, modulePath) + // create and add 1 command for each analysis module + analysisModulesMetadataMap.forEach((packageJsonModule, modulePath) => { + const callback = createAnalysisSubcommandCallback( + packageJsonModule, + modulePath, + ); - const analysisCommand = createAnalysisSubcommand( - packageJsonModule.heart, - listenerModulesMetadataMap, - callback - ) + const analysisCommand = createAnalysisSubcommand( + packageJsonModule.heart, + listenerModulesMetadataMap, + callback, + ); - cmd.addCommand(analysisCommand) - }) + cmd.addCommand(analysisCommand); + }); - // create and add 1 command for each server module - serverModulesMetadataMap.forEach((packageJsonModule, modulePath: string) => { - const callback = createServerSubcommandCallback( - packageJsonModule, - modulePath, - analysisModulesMetadataMap, - listenerModulesMetadataMap - ) + // create and add 1 command for each server module + serverModulesMetadataMap.forEach((packageJsonModule, modulePath: string) => { + const callback = createServerSubcommandCallback( + packageJsonModule, + modulePath, + analysisModulesMetadataMap, + listenerModulesMetadataMap, + ); - const serverCommand = createServerSubcommand(packageJsonModule.heart, callback) + const serverCommand = createServerSubcommand( + packageJsonModule.heart, + callback, + ); - cmd.addCommand(serverCommand) - }) + cmd.addCommand(serverCommand); + }); - return cmd - .on("command:*", () => { - cmd.error("Invalid command name.") - }) - .parseAsync(argv) + return cmd + .on("command:*", () => { + cmd.error("Invalid command name."); + }) + .parseAsync(argv); } diff --git a/modules/cli/src/command/server/ServerCommand.ts b/modules/cli/src/command/server/ServerCommand.ts index 211e3cd7..4aeaa740 100644 --- a/modules/cli/src/command/server/ServerCommand.ts +++ b/modules/cli/src/command/server/ServerCommand.ts @@ -1,69 +1,75 @@ import { - InputError, - validateServerInput, - type ModuleMetadata, - type ParsedServerInput, - type Config, - type GenericReport, - type ModuleAnalysisInterface, - type ModuleListenerInterface, - type ModuleServerInterface, - type Result, -} from "@fabernovel/heart-common" -import type { FastifyCorsOptions } from "@fastify/cors" -import { Command, InvalidArgumentError } from "commander" -import { createVerboseOption } from "../CommonOption.js" -import { createCorsOption, createPortOption, type ServerOptions } from "./ServerOption.js" -import type { PackageJsonModule } from "../../module/PackageJson.js" -import { checkEnv, initializeModules } from "../../module/ModuleLoader.js" -import { startServer } from "../../module/ModuleOrchestrator.js" + InputError, + validateServerInput, + type ModuleMetadata, + type ParsedServerInput, + type Config, + type GenericReport, + type ModuleAnalysisInterface, + type ModuleListenerInterface, + type ModuleServerInterface, + type Result, +} from "@fabernovel/heart-common"; +import type { FastifyCorsOptions } from "@fastify/cors"; +import { Command, InvalidArgumentError } from "commander"; +import { createVerboseOption } from "../CommonOption.js"; +import { + createCorsOption, + createPortOption, + type ServerOptions, +} from "./ServerOption.js"; +import type { PackageJsonModule } from "../../module/PackageJson.js"; +import { checkEnv, initializeModules } from "../../module/ModuleLoader.js"; +import { startServer } from "../../module/ModuleOrchestrator.js"; type ServerSubcommandCallback = ( - verbose: boolean, - port: number, - corsOptions: FastifyCorsOptions | undefined -) => Promise + verbose: boolean, + port: number, + corsOptions: FastifyCorsOptions | undefined, +) => Promise; -function prepareOptionsForValidation(options: ServerOptions): ParsedServerInput { - return { - cors: options.cors, - port: options.port, - verbose: options.verbose, - } +function prepareOptionsForValidation( + options: ServerOptions, +): ParsedServerInput { + return { + cors: options.cors, + port: options.port, + verbose: options.verbose, + }; } /** * Create a command dedicated to the given server module */ export const createServerSubcommand = ( - moduleMetadata: ModuleMetadata, - callback: ServerSubcommandCallback + moduleMetadata: ModuleMetadata, + callback: ServerSubcommandCallback, ): Command => { - const subcommand = new Command(moduleMetadata.id) + const subcommand = new Command(moduleMetadata.id); - subcommand - .description(`Starts the ${moduleMetadata.name} server`) - .addOption(createVerboseOption()) - .addOption(createPortOption()) - .addOption(createCorsOption()) - .action(async (options: ServerOptions) => { - try { - const unvalidatedInputs = prepareOptionsForValidation(options) - const { cors, port, verbose } = validateServerInput(unvalidatedInputs) + subcommand + .description(`Starts the ${moduleMetadata.name} server`) + .addOption(createVerboseOption()) + .addOption(createPortOption()) + .addOption(createCorsOption()) + .action(async (options: ServerOptions) => { + try { + const unvalidatedInputs = prepareOptionsForValidation(options); + const { cors, port, verbose } = validateServerInput(unvalidatedInputs); - await callback(verbose, port, cors) - } catch (error) { - if (error instanceof InputError) { - const e = new InvalidArgumentError(error.message) - return Promise.reject(e) - } else { - return Promise.reject(error) - } - } - }) + await callback(verbose, port, cors); + } catch (error) { + const e = + error instanceof InputError + ? new InvalidArgumentError(error.message) + : error; - return subcommand -} + return Promise.reject(e); + } + }); + + return subcommand; +}; /** * Callback function called once the CLI command has been executed (the user hit "enter"). @@ -72,31 +78,40 @@ export const createServerSubcommand = ( * @param listenerModulesMetadataMap Filtered map of listener modules metadata and their file path */ export function createServerSubcommandCallback( - packageJsonModule: PackageJsonModule, - modulePath: string, - analysisModulesMetadataMap: Map, - listenerModulesMetadataMap: Map + packageJsonModule: PackageJsonModule, + modulePath: string, + analysisModulesMetadataMap: Map, + listenerModulesMetadataMap: Map, ): ServerSubcommandCallback { - return async (verbose: boolean, port: number, cors: FastifyCorsOptions | undefined) => { - // load environment variables for the server module - // load environment variables for the analysis modules: - // do it once at startup instead at each route call - await checkEnv([modulePath, ...analysisModulesMetadataMap.keys()]) + return async ( + verbose: boolean, + port: number, + cors: FastifyCorsOptions | undefined, + ) => { + // load environment variables for the server module + // load environment variables for the analysis modules: + // do it once at startup instead at each route call + await checkEnv([modulePath, ...analysisModulesMetadataMap.keys()]); - // initialize the server, analysis and listeners modules - const analysisModules = await initializeModules>>( - analysisModulesMetadataMap, - verbose - ) - const listenerModules = await initializeModules( - listenerModulesMetadataMap, - verbose - ) - const serverModules = await initializeModules( - new Map([[modulePath, packageJsonModule]]), - verbose - ) + // initialize the server, analysis and listeners modules + const analysisModules = await initializeModules< + ModuleAnalysisInterface> + >(analysisModulesMetadataMap, verbose); + const listenerModules = await initializeModules( + listenerModulesMetadataMap, + verbose, + ); + const serverModules = await initializeModules( + new Map([[modulePath, packageJsonModule]]), + verbose, + ); - await startServer(serverModules[0], analysisModules, listenerModules, port, cors) - } + await startServer( + serverModules[0], + analysisModules, + listenerModules, + port, + cors, + ); + }; } diff --git a/modules/cli/src/command/server/ServerOption.ts b/modules/cli/src/command/server/ServerOption.ts index 788610c7..f13af599 100644 --- a/modules/cli/src/command/server/ServerOption.ts +++ b/modules/cli/src/command/server/ServerOption.ts @@ -1,42 +1,44 @@ -import { InvalidArgumentError, Option } from "commander" -import type { JsonValue } from "type-fest" -import type { CommonOptions } from "../CommonOption.js" +import { InvalidArgumentError, Option } from "commander"; +import type { JsonValue } from "type-fest"; +import type { CommonOptions } from "../CommonOption.js"; export interface ServerOptions extends CommonOptions { - port: number - cors?: JsonValue + port: number; + cors?: JsonValue; } // the keys are used to create the options names: // - options long names: keys names // - options short names: first letter of the keys names -const SERVER_OPTIONS: { [key in keyof Omit]-?: string } = { - port: "port", - cors: "cors", -} +const SERVER_OPTIONS: { + [key in keyof Omit]-?: string; +} = { + port: "port", + cors: "cors", +}; -const PORT_DEFAULT = 3000 +const PORT_DEFAULT = 3000; export function createPortOption(): Option { - return new Option( - `-${SERVER_OPTIONS.port[0]}, --${SERVER_OPTIONS.port} [${SERVER_OPTIONS.port}]`, - "Port that the server is listening to" - ) - .default(PORT_DEFAULT) - .argParser((value) => { - const port = Number(value) + return new Option( + `-${SERVER_OPTIONS.port[0]}, --${SERVER_OPTIONS.port} [${SERVER_OPTIONS.port}]`, + "Port that the server is listening to", + ) + .default(PORT_DEFAULT) + .argParser((value) => { + const port = Number(value); - if (isNaN(port)) { - throw new InvalidArgumentError(`Must be a number`) - } + if (Number.isNaN(port)) { + throw new InvalidArgumentError("Must be a number"); + } - return port - }) + return port; + }); } export function createCorsOption(): Option { - return new Option( - `-${SERVER_OPTIONS.cors[0]}, --${SERVER_OPTIONS.cors} [${SERVER_OPTIONS.cors}]`, - "CORS configuration, as defined in https://github.com/fastify/fastify-cors#options" - ).argParser((value) => JSON.parse(value) as JsonValue) + return new Option( + `-${SERVER_OPTIONS.cors[0]}, --${SERVER_OPTIONS.cors} [${SERVER_OPTIONS.cors}]`, + "CORS configuration, as defined in https://github.com/fastify/fastify-cors#options", + ).argParser((value) => JSON.parse(value) as JsonValue); } diff --git a/modules/cli/src/error/EnvironmentError.ts b/modules/cli/src/error/EnvironmentError.ts index 9a48aa66..91b359b4 100644 --- a/modules/cli/src/error/EnvironmentError.ts +++ b/modules/cli/src/error/EnvironmentError.ts @@ -1,13 +1,14 @@ -import type { ErrorObject } from "ajv" +import type { ErrorObject } from "ajv"; export class EnvironmentError extends Error { - constructor(errors: ErrorObject[]) { - super( - "Something is wrong with your environment variables:" + - errors.map((error) => "\n- " + (error.message ?? "")).join("") - ) + constructor(errors: ErrorObject[]) { + super( + `Something is wrong with your environment variables:${errors + .map((error) => `\n- ${error.message ?? ""}`) + .join("")}`, + ); - // @see {@link https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work} - Object.setPrototypeOf(this, EnvironmentError.prototype) - } + // @see {@link https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work} + Object.setPrototypeOf(this, EnvironmentError.prototype); + } } diff --git a/modules/cli/src/error/ErrnoException.ts b/modules/cli/src/error/ErrnoException.ts index 9aa47941..afbe359a 100644 --- a/modules/cli/src/error/ErrnoException.ts +++ b/modules/cli/src/error/ErrnoException.ts @@ -1,3 +1,5 @@ -export function isErrnoException(error: unknown): error is NodeJS.ErrnoException { - return (error as NodeJS.ErrnoException).code === "ENOENT" +export function isErrnoException( + error: unknown, +): error is NodeJS.ErrnoException { + return (error as NodeJS.ErrnoException).code === "ENOENT"; } diff --git a/modules/cli/src/filesystem/fs.ts b/modules/cli/src/filesystem/fs.ts index d673783e..616eeee1 100644 --- a/modules/cli/src/filesystem/fs.ts +++ b/modules/cli/src/filesystem/fs.ts @@ -1,9 +1,9 @@ -import { readFileSync } from "node:fs" -import { isAbsolute } from "node:path" -import { env } from "node:process" +import { readFileSync } from "node:fs"; +import { isAbsolute } from "node:path"; +import { env } from "node:process"; export function readFile(path: string): string { - const realPath = isAbsolute(path) ? path : `${env.PWD ?? ""}/${path}` + const realPath = isAbsolute(path) ? path : `${env.PWD ?? ""}/${path}`; - return readFileSync(realPath, "utf8") + return readFileSync(realPath, "utf8"); } diff --git a/modules/cli/src/index.ts b/modules/cli/src/index.ts index 01ef7d1e..b281cea3 100644 --- a/modules/cli/src/index.ts +++ b/modules/cli/src/index.ts @@ -1,25 +1,25 @@ -import { logger } from "@fabernovel/heart-common" -import dotenv from "dotenv" -import { cwd, exit } from "node:process" -import { start } from "./command/cli/CliCommand.js" +import { logger } from "@fabernovel/heart-common"; +import dotenv from "dotenv"; +import { cwd, exit } from "node:process"; +import { start } from "./command/cli/CliCommand.js"; // assume that the root path is the one from where the script has been called // /!\ this approach does not follow symlink -const CWD = cwd() +const CWD = cwd(); /** * Loads `.env` file contents into process.env. * Assume that the root path is the one from where the script has been called. * /!\ this approach does not follow symlink. */ -dotenv.config({ path: `${CWD}/.env` }) +dotenv.config({ path: `${CWD}/.env` }); void (async () => { - try { - await start(CWD) - } catch (error) { - logger.error(error) + try { + await start(CWD); + } catch (error) { + logger.error(error); - exit(1) - } -})() + exit(1); + } +})(); diff --git a/modules/cli/src/module/ModuleLoader.ts b/modules/cli/src/module/ModuleLoader.ts index 8c756809..641575c7 100644 --- a/modules/cli/src/module/ModuleLoader.ts +++ b/modules/cli/src/module/ModuleLoader.ts @@ -1,81 +1,91 @@ -import { logger, type Module, type ModuleIndex, type ModuleMetadata } from "@fabernovel/heart-common" -import Ajv, { type AnySchema, type ErrorObject } from "ajv" -import AjvErrors from "ajv-errors" -import addFormats from "ajv-formats" -import dotenv from "dotenv" -import { existsSync } from "node:fs" -import { readFile } from "node:fs/promises" -import { env } from "node:process" -import type { PackageJson } from "type-fest" -import { EnvironmentError } from "../error/EnvironmentError.js" -import type { PackageJsonModule } from "./PackageJson.js" +import { + logger, + type Module, + type ModuleIndex, + type ModuleMetadata, +} from "@fabernovel/heart-common"; +import Ajv, { type AnySchema, type ErrorObject } from "ajv"; +import AjvErrors from "ajv-errors"; +import addFormats from "ajv-formats"; +import dotenv from "dotenv"; +import { existsSync } from "node:fs"; +import { readFile } from "node:fs/promises"; +import { env } from "node:process"; +import type { PackageJson } from "type-fest"; +import { EnvironmentError } from "../error/EnvironmentError.js"; +import type { PackageJsonModule } from "./PackageJson.js"; type ModulesMetadata = [ - Map, - Map, - Map -] + Map, + Map, + Map, +]; -const errors = new Array() -const ajv = new Ajv.default({ allErrors: true }) -addFormats.default(ajv) -AjvErrors.default(ajv /*, {singleError: true} */) +const errors = new Array(); +const ajv = new Ajv.default({ allErrors: true }); +addFormats.default(ajv); +AjvErrors.default(ajv /*, {singleError: true} */); -const PACKAGE_PREFIX = "@fabernovel/heart-" -const DOTENV_DEFAULT_VALUES_NAME = ".env.default" -const ENV_VALIDATION_SCHEMA_NAME = ".env.schema.json" +const PACKAGE_PREFIX = "@fabernovel/heart-"; +const DOTENV_DEFAULT_VALUES_NAME = ".env.default"; +const ENV_VALIDATION_SCHEMA_NAME = ".env.schema.json"; /** * Load the installed modules metadata: * 1. get the absolute paths of the installed Heart modules * 2. loads the package.json file */ -export async function loadModulesMetadata(cwd: string): Promise { - try { - const modulesPaths = await getPaths(cwd) - - const modulesMetadata = (await loadFiles(modulesPaths, "package.json")).map( - (content) => JSON.parse(content) as PackageJsonModule - ) - - const analysisModulesMap = new Map() - const listenerModulesMap = new Map() - const serverModulesMap = new Map() - - // as modulesPaths and modules are ordered identically, - // we could use the index to construct the Map objects - modulesPaths.forEach((modulePath, index) => { - const moduleMetadata = modulesMetadata[index] - - if (moduleMetadata.heart.type === "analysis") { - analysisModulesMap.set(modulePath, moduleMetadata) - } else if ( - moduleMetadata.heart.type === "listener" || - moduleMetadata.heart.type === "listener:database" - ) { - listenerModulesMap.set(modulePath, moduleMetadata) - } else { - // moduleMetadata.heart.type === "server - serverModulesMap.set(modulePath, moduleMetadata) - } - }) - - return [analysisModulesMap, listenerModulesMap, serverModulesMap] - } catch (error) { - return Promise.reject(error) - } +export async function loadModulesMetadata( + cwd: string, +): Promise { + try { + const modulesPaths = await getPaths(cwd); + + const modulesMetadata = (await loadFiles(modulesPaths, "package.json")).map( + (content) => JSON.parse(content) as PackageJsonModule, + ); + + const analysisModulesMap = new Map(); + const listenerModulesMap = new Map(); + const serverModulesMap = new Map(); + + // as modulesPaths and modules are ordered identically, + // we could use the index to construct the Map objects + modulesPaths.forEach((modulePath, index) => { + const moduleMetadata = modulesMetadata[index]; + + if (moduleMetadata.heart.type === "analysis") { + analysisModulesMap.set(modulePath, moduleMetadata); + } else if ( + moduleMetadata.heart.type === "listener" || + moduleMetadata.heart.type === "listener:database" + ) { + listenerModulesMap.set(modulePath, moduleMetadata); + } else { + // moduleMetadata.heart.type === "server + serverModulesMap.set(modulePath, moduleMetadata); + } + }); + + return [analysisModulesMap, listenerModulesMap, serverModulesMap]; + } catch (error) { + return Promise.reject(error); + } } /** * Load a batch of files that share the same filename but are located at different path. * Unexisting path does not throw errors. */ -export async function loadFiles(paths: string[], filename: string): Promise { - const promises = paths - .filter((path) => existsSync(path + filename)) - .map((path) => readFile(path + filename, { encoding: "utf-8" })) - - return Promise.all(promises) +export async function loadFiles( + paths: string[], + filename: string, +): Promise { + const promises = paths + .filter((path) => existsSync(path + filename)) + .map((path) => readFile(path + filename, { encoding: "utf-8" })); + + return Promise.all(promises); } /** @@ -84,52 +94,70 @@ export async function loadFiles(paths: string[], filename: string): Promise { - modulesPaths.forEach((modulePath) => { - dotenv.config({ path: modulePath + DOTENV_DEFAULT_VALUES_NAME, override: false }) - }) - - const schemasContent = await loadFiles(modulesPaths, ENV_VALIDATION_SCHEMA_NAME) - const schemas = schemasContent.map((content) => JSON.parse(content) as AnySchema) - - schemas.forEach((schema) => { - const validate = ajv.compile(schema) - - if (!validate(env)) { - errors.push(...(validate.errors ?? [])) - } - }) - - if (errors.length > 0) { - throw new EnvironmentError(errors) - } + modulesPaths.forEach((modulePath, _index) => { + dotenv.config({ + path: modulePath + DOTENV_DEFAULT_VALUES_NAME, + override: false, + }); + }); + + const schemasContent = await loadFiles( + modulesPaths, + ENV_VALIDATION_SCHEMA_NAME, + ); + const schemas = schemasContent.map( + (content) => JSON.parse(content) as AnySchema, + ); + + schemas.forEach((schema, _index) => { + const validate = ajv.compile(schema); + + if (!validate(env)) { + errors.push(...(validate.errors ?? [])); + } + }); + + if (errors.length > 0) { + throw new EnvironmentError(errors); + } } export async function initializeModules( - listenerModulesMap: Map, - verbose: boolean + listenerModulesMap: Map, + verbose: boolean, ): Promise { - const paths = new Array() - const metadatas = new Array() - - listenerModulesMap.forEach((packageJsonModule, modulePath) => { - paths.push(modulePath + packageJsonModule.main) - metadatas.push(packageJsonModule.heart) - }) - - const promises = paths.map((path) => import(path) as Promise) - - if (verbose) { - logger.info(`Importing modules ${metadatas.map((metadata) => metadata.id).join(", ")}...`) - } - - const moduleIndexes = await Promise.all(promises) - - if (verbose) { - logger.info(`Modules ${metadatas.map((metadata) => metadata.id).join(", ")} imported.`) - } - - // as Promise.all() keeps the order, the arrays paths, metadatas, promises and modules have all the exact same indexation - return moduleIndexes.map((moduleIndex, i) => moduleIndex.initialize(metadatas[i], verbose) as M) + const paths = new Array(); + const metadatas = new Array(); + + listenerModulesMap.forEach((packageJsonModule, modulePath) => { + paths.push(modulePath + packageJsonModule.main); + metadatas.push(packageJsonModule.heart); + }); + + const promises = paths.map((path) => import(path) as Promise); + + if (verbose) { + logger.info( + `Importing modules ${metadatas + .map((metadata) => metadata.id) + .join(", ")}...`, + ); + } + + const moduleIndexes = await Promise.all(promises); + + if (verbose) { + logger.info( + `Modules ${metadatas + .map((metadata) => metadata.id) + .join(", ")} imported.`, + ); + } + + // as Promise.all() keeps the order, the arrays paths, metadatas, promises and modules have all the exact same indexation + return moduleIndexes.map( + (moduleIndex, i) => moduleIndex.initialize(metadatas[i], verbose) as M, + ); } /** @@ -138,36 +166,46 @@ export async function initializeModules( * paths are guessed according to the content of the package.json */ async function getPaths(cwd: string): Promise { - const pattern = new RegExp(`^${PACKAGE_PREFIX}(?!cli|common)`) - const packageJsonPath = `${cwd}/package.json` - const moduleIndex = (await import(packageJsonPath, { assert: { type: "json" } }).catch((error) => { - return Promise.reject(error) - })) as { default: PackageJson } - const packageJson = moduleIndex.default - - // list the modules according to the given pattern - // look into the 'dependencies' and 'devDependencies' keys - const modulesNames: string[] = [] - - if (undefined !== packageJson.dependencies) { - Object.keys(packageJson.dependencies) - // add the module name to the list if it is not already there and matches the pattern - .filter((moduleName) => -1 === modulesNames.indexOf(moduleName) && pattern.test(moduleName)) - .forEach((moduleName: string) => { - modulesNames.push(moduleName) - }) - } - if (undefined !== packageJson.devDependencies) { - Object.keys(packageJson.devDependencies) - // add the module name to the list if it is not already there and matches the pattern - .filter((moduleName) => -1 === modulesNames.indexOf(moduleName) && pattern.test(moduleName)) - .forEach((moduleName: string) => { - modulesNames.push(moduleName) - }) - } - - // list the absolute path of each modules - const paths = modulesNames.map((moduleName: string) => `${cwd}/node_modules/${moduleName}/`) - - return paths + const pattern = new RegExp(`^${PACKAGE_PREFIX}(?!cli|common)`); + const packageJsonPath = `${cwd}/package.json`; + const moduleIndex = (await import(packageJsonPath, { + assert: { type: "json" }, + }).catch((error) => { + return Promise.reject(error); + })) as { default: PackageJson }; + const packageJson = moduleIndex.default; + + // list the modules according to the given pattern + // look into the 'dependencies' and 'devDependencies' keys + const modulesNames: string[] = []; + + if (undefined !== packageJson.dependencies) { + Object.keys(packageJson.dependencies) + // add the module name to the list if it is not already there and matches the pattern + .filter( + (moduleName) => + -1 === modulesNames.indexOf(moduleName) && pattern.test(moduleName), + ) + .forEach((moduleName: string, _index) => { + modulesNames.push(moduleName); + }); + } + if (undefined !== packageJson.devDependencies) { + Object.keys(packageJson.devDependencies) + // add the module name to the list if it is not already there and matches the pattern + .filter( + (moduleName) => + -1 === modulesNames.indexOf(moduleName) && pattern.test(moduleName), + ) + .forEach((moduleName: string, _index) => { + modulesNames.push(moduleName); + }); + } + + // list the absolute path of each modules + const paths = modulesNames.map( + (moduleName: string) => `${cwd}/node_modules/${moduleName}/`, + ); + + return paths; } diff --git a/modules/cli/src/module/ModuleMigration.ts b/modules/cli/src/module/ModuleMigration.ts index 9febcea2..f347967c 100644 --- a/modules/cli/src/module/ModuleMigration.ts +++ b/modules/cli/src/module/ModuleMigration.ts @@ -1,42 +1,46 @@ -import { type ModuleListenerDatabaseInterface } from "@fabernovel/heart-common" -import ora from "ora" +import type { ModuleListenerDatabaseInterface } from "@fabernovel/heart-common"; +import ora from "ora"; /** * Migrate the database of every database listener module to their latest version. * Migrate only the databases that require migrations. */ export async function migrateListenerDatabase( - listenerDatabaseModules: ModuleListenerDatabaseInterface[] + listenerDatabaseModules: ModuleListenerDatabaseInterface[], ): Promise { - const hasPendingMigrations = await Promise.all(listenerDatabaseModules.map((m) => m.hasPendingMigrations())) + const hasPendingMigrations = await Promise.all( + listenerDatabaseModules.map((m) => m.hasPendingMigrations()), + ); - if (hasPendingMigrations.some((hasPendingMigration) => hasPendingMigration)) { - const spinner = ora({ spinner: "dots", interval: 200 }) + if (hasPendingMigrations.some((hasPendingMigration) => hasPendingMigration)) { + const spinner = ora({ spinner: "dots", interval: 200 }); - spinner.start(`Update the databases...`) + spinner.start("Update the databases..."); - try { - await Promise.all(listenerDatabaseModules.map((m) => m.runPendingMigrations())) + try { + await Promise.all( + listenerDatabaseModules.map((m) => m.runPendingMigrations()), + ); - spinner.succeed("Databases update completed.") + spinner.succeed("Databases update completed."); - return Promise.resolve() - } catch (error) { - let reason = "" + return Promise.resolve(); + } catch (error) { + let reason = ""; - if (typeof error === "string") { - reason = error - } else if (error instanceof Error) { - reason = error.message - } + if (typeof error === "string") { + reason = error; + } else if (error instanceof Error) { + reason = error.message; + } - if (reason.length > 0) { - reason = ` Reason: ${reason}.` - } + if (reason.length > 0) { + reason = ` Reason: ${reason}.`; + } - spinner.fail(`Databases update failed.${reason}`) + spinner.fail(`Databases update failed.${reason}`); - return Promise.reject(error) - } - } + return Promise.reject(error); + } + } } diff --git a/modules/cli/src/module/ModuleOrchestrator.ts b/modules/cli/src/module/ModuleOrchestrator.ts index aad2c211..f902d84a 100644 --- a/modules/cli/src/module/ModuleOrchestrator.ts +++ b/modules/cli/src/module/ModuleOrchestrator.ts @@ -1,85 +1,96 @@ -import { - type Config, - type GenericReport, - type ModuleAnalysisInterface, - type ModuleListenerInterface, - type ModuleServerInterface, - type Result, -} from "@fabernovel/heart-common" -import type { FastifyCorsOptions } from "@fastify/cors" -import ora from "ora" +import type { + Config, + GenericReport, + ModuleAnalysisInterface, + ModuleListenerInterface, + ModuleServerInterface, + Result, +} from "@fabernovel/heart-common"; +import type { FastifyCorsOptions } from "@fastify/cors"; +import ora from "ora"; export async function notifyListenerModules>( - listenerModules: ModuleListenerInterface[], - report: R + listenerModules: ModuleListenerInterface[], + report: R, ): Promise { - const promises = listenerModules.map((listenerModule) => listenerModule.notifyAnalysisDone(report)) + const promises = listenerModules.map((listenerModule) => + listenerModule.notifyAnalysisDone(report), + ); - return Promise.all(promises) + return Promise.all(promises); } -export async function startAnalysis>( - module: ModuleAnalysisInterface, - conf: C, - threshold?: number +export async function startAnalysis< + C extends Config, + R extends GenericReport, +>( + module: ModuleAnalysisInterface, + conf: C, + threshold?: number, ): Promise { - const spinner = ora({ spinner: "hearts", interval: 200 }) + const spinner = ora({ spinner: "hearts", interval: 200 }); - spinner.start("Analysis in progress...") + spinner.start("Analysis in progress..."); - try { - const report = await module.startAnalysis(conf, threshold) + try { + const report = await module.startAnalysis(conf, threshold); - const reportName = `[${report.service.name}] ` - const messageParts = [`${reportName}${report.analyzedUrl}: ${report.displayGrade()}`] + const reportName = `[${report.service.name}] `; + const messageParts = [ + `${reportName}${report.analyzedUrl}: ${report.displayGrade()}`, + ]; - if (report.resultUrl) { - messageParts.push(`View full report: ${report.resultUrl}`) - } + if (report.resultUrl) { + messageParts.push(`View full report: ${report.resultUrl}`); + } - if (report.isThresholdReached() === true) { - messageParts.push("Your threshold is reached") - } else if (report.isThresholdReached() === false) { - messageParts.push("Your threshold is not reached") - } + if (report.isThresholdReached() === true) { + messageParts.push("Your threshold is reached"); + } else if (report.isThresholdReached() === false) { + messageParts.push("Your threshold is not reached"); + } - spinner.succeed("Analysis completed.") - console.info(messageParts.join(". ") + ".") + spinner.succeed("Analysis completed."); + console.info(`${messageParts.join(". ")}.`); - return report - } catch (error) { - let reason = "" + return report; + } catch (error) { + let reason = ""; - if (typeof error === "string") { - reason = error - } else if (error instanceof Error) { - reason = error.message - } + if (typeof error === "string") { + reason = error; + } else if (error instanceof Error) { + reason = error.message; + } - if (reason.length > 0) { - reason = ` Reason: ${reason}.` - } + if (reason.length > 0) { + reason = ` Reason: ${reason}.`; + } - spinner.fail(`Analysis failed.${reason}`) + spinner.fail(`Analysis failed.${reason}`); - return Promise.reject() - } + return Promise.reject(); + } } export async function startServer( - serverModule: ModuleServerInterface, - analysisModules: ModuleAnalysisInterface>[], - listenerModules: ModuleListenerInterface[], - port: number, - cors?: FastifyCorsOptions + serverModule: ModuleServerInterface, + analysisModules: ModuleAnalysisInterface>[], + listenerModules: ModuleListenerInterface[], + port: number, + cors?: FastifyCorsOptions, ): Promise { - const fastifyInstance = await serverModule.createServer(analysisModules, listenerModules, cors) - - try { - await fastifyInstance.listen({ port: port }) - console.info(`Server listening on port ${port}`) - } catch (err) { - fastifyInstance.log.error(err) - throw err - } + const fastifyInstance = await serverModule.createServer( + analysisModules, + listenerModules, + cors, + ); + + try { + await fastifyInstance.listen({ port: port }); + console.info(`Server listening on port ${port}`); + } catch (err) { + fastifyInstance.log.error(err); + throw err; + } } diff --git a/modules/cli/src/module/PackageJson.ts b/modules/cli/src/module/PackageJson.ts index 594e7de2..f486e55b 100644 --- a/modules/cli/src/module/PackageJson.ts +++ b/modules/cli/src/module/PackageJson.ts @@ -1,8 +1,8 @@ -import type { ModuleMetadata } from "@fabernovel/heart-common" -import type { PackageJson } from "type-fest" +import type { ModuleMetadata } from "@fabernovel/heart-common"; +import type { PackageJson } from "type-fest"; export type PackageJsonModule = Omit & { - name: NonNullable - main: NonNullable - heart: ModuleMetadata -} + name: NonNullable; + main: NonNullable; + heart: ModuleMetadata; +}; diff --git a/modules/cli/src/text/case.ts b/modules/cli/src/text/case.ts index b2e4e11c..9d4b1c9f 100644 --- a/modules/cli/src/text/case.ts +++ b/modules/cli/src/text/case.ts @@ -4,5 +4,7 @@ * @see {@link https://stackoverflow.com/questions/40710628/how-to-convert-snake-case-to-camelcase-in-my-app#comment111891858_61375162} */ export function snakeCaseToCamelCase(s: string): string { - return s.toLowerCase().replace(/[-_][a-z]/g, (group) => group.slice(-1).toUpperCase()) + return s + .toLowerCase() + .replace(/[-_][a-z]/g, (group) => group.slice(-1).toUpperCase()); } diff --git a/modules/cli/tests/command/AnalysisCommand.test.ts b/modules/cli/tests/command/AnalysisCommand.test.ts index 119b7230..10f6d7f9 100644 --- a/modules/cli/tests/command/AnalysisCommand.test.ts +++ b/modules/cli/tests/command/AnalysisCommand.test.ts @@ -1,119 +1,142 @@ -import type { ModuleMetadata } from "@fabernovel/heart-common" -import { Command } from "commander" -import { createAnalysisSubcommand } from "../../src/command/analysis/AnalysisCommand.js" -import type { PackageJsonModule } from "../../src/module/PackageJson.js" +import type { ModuleMetadata } from "@fabernovel/heart-common"; +import { Command } from "commander"; +import { createAnalysisSubcommand } from "../../src/command/analysis/AnalysisCommand.js"; +import type { PackageJsonModule } from "../../src/module/PackageJson.js"; -const optionConfigInline = '{"url": "https://www.heart.fabernovel.com"}' -let program: Command +const optionConfigInline = '{"url": "https://www.heart.fabernovel.com"}'; +let program: Command; beforeEach(() => { - program = new Command() - const analysisModuleMetadata: ModuleMetadata = { - id: "analysis", - type: "analysis", - name: "Heart Test Analysis Tool", - service: { - name: "Test Analysis Tool", - }, - } - - const listenerModulesMetadataMap = new Map([ - [ - "path/to/listener1", - { - name: "", - main: "", - heart: { - id: "listener1", - name: "Listener 1", - type: "listener", - service: { name: "Listener 1 service" }, - }, - }, - ], - [ - "path/to/listener2", - { - name: "", - main: "", - heart: { - id: "listener2", - name: "Listener 2", - type: "listener", - service: { name: "Listener 2 service" }, - }, - }, - ], - ]) - - const analysisCommand = createAnalysisSubcommand(analysisModuleMetadata, listenerModulesMetadataMap, () => - Promise.resolve() - ) - - program.addCommand(analysisCommand) -}) + program = new Command(); + const analysisModuleMetadata: ModuleMetadata = { + id: "analysis", + type: "analysis", + name: "Heart Test Analysis Tool", + service: { + name: "Test Analysis Tool", + }, + }; + + const listenerModulesMetadataMap = new Map([ + [ + "path/to/listener1", + { + name: "", + main: "", + heart: { + id: "listener1", + name: "Listener 1", + type: "listener", + service: { name: "Listener 1 service" }, + }, + }, + ], + [ + "path/to/listener2", + { + name: "", + main: "", + heart: { + id: "listener2", + name: "Listener 2", + type: "listener", + service: { name: "Listener 2 service" }, + }, + }, + ], + ]); + + const analysisCommand = createAnalysisSubcommand( + analysisModuleMetadata, + listenerModulesMetadataMap, + () => Promise.resolve(), + ); + + program.addCommand(analysisCommand); +}); test("Create an analysis command", () => { - program.parse(["analysis", "--config", optionConfigInline], { from: "user" }) + program.parse(["analysis", "--config", optionConfigInline], { from: "user" }); - expect(program.commands).toHaveLength(1) + expect(program.commands).toHaveLength(1); - const command = program.commands[0] - const options = command.opts() + const command = program.commands[0]; + const options = command.opts(); - expect(command.name()).toBe("analysis") - expect(Object.keys(options)).toHaveLength(2) - expect(options).toHaveProperty("config", JSON.parse(optionConfigInline)) - expect(options).toHaveProperty("verbose", false) -}) + expect(command.name()).toBe("analysis"); + expect(Object.keys(options)).toHaveLength(2); + expect(options).toHaveProperty("config", JSON.parse(optionConfigInline)); + expect(options).toHaveProperty("verbose", false); +}); test("Create an analysis command with the listener option", () => { - program.parse(["analysis", "--config", optionConfigInline, "--threshold", "83"], { - from: "user", - }) + program.parse( + ["analysis", "--config", optionConfigInline, "--threshold", "83"], + { + from: "user", + }, + ); - expect(program.commands).toHaveLength(1) + expect(program.commands).toHaveLength(1); - const command = program.commands[0] - const options = command.opts() + const command = program.commands[0]; + const options = command.opts(); - expect(command.name()).toBe("analysis") - expect(Object.keys(options)).toHaveLength(3) - expect(options).toHaveProperty("config", JSON.parse(optionConfigInline)) - expect(options).toHaveProperty("verbose", false) - expect(options).toHaveProperty("threshold", 83) -}) + expect(command.name()).toBe("analysis"); + expect(Object.keys(options)).toHaveLength(3); + expect(options).toHaveProperty("config", JSON.parse(optionConfigInline)); + expect(options).toHaveProperty("verbose", false); + expect(options).toHaveProperty("threshold", 83); +}); test("Create an analysis command with only 1 listener modules using the --except-listeners option", () => { - program.parse(["analysis", "--config", optionConfigInline, "--except-listeners", "listener1"], { - from: "user", - }) - - expect(program.commands).toHaveLength(1) - - const command = program.commands[0] - const options = command.opts() - - expect(command.name()).toBe("analysis") - expect(Object.keys(options)).toHaveLength(3) - expect(options).toHaveProperty("config", JSON.parse(optionConfigInline)) - expect(options).toHaveProperty("verbose", false) - expect(options).toHaveProperty("exceptListeners", ["listener1"]) -}) + program.parse( + [ + "analysis", + "--config", + optionConfigInline, + "--except-listeners", + "listener1", + ], + { + from: "user", + }, + ); + + expect(program.commands).toHaveLength(1); + + const command = program.commands[0]; + const options = command.opts(); + + expect(command.name()).toBe("analysis"); + expect(Object.keys(options)).toHaveLength(3); + expect(options).toHaveProperty("config", JSON.parse(optionConfigInline)); + expect(options).toHaveProperty("verbose", false); + expect(options).toHaveProperty("exceptListeners", ["listener1"]); +}); test("Create an analysis command with only 1 listener modules using the --only-listeners option", () => { - program.parse(["analysis", "--config", optionConfigInline, "--only-listeners", "listener1"], { - from: "user", - }) - - expect(program.commands).toHaveLength(1) - - const command = program.commands[0] - const options = command.opts() - - expect(command.name()).toBe("analysis") - expect(Object.keys(options)).toHaveLength(3) - expect(options).toHaveProperty("config", JSON.parse(optionConfigInline)) - expect(options).toHaveProperty("verbose", false) - expect(options).toHaveProperty("onlyListeners", ["listener1"]) -}) + program.parse( + [ + "analysis", + "--config", + optionConfigInline, + "--only-listeners", + "listener1", + ], + { + from: "user", + }, + ); + + expect(program.commands).toHaveLength(1); + + const command = program.commands[0]; + const options = command.opts(); + + expect(command.name()).toBe("analysis"); + expect(Object.keys(options)).toHaveLength(3); + expect(options).toHaveProperty("config", JSON.parse(optionConfigInline)); + expect(options).toHaveProperty("verbose", false); + expect(options).toHaveProperty("onlyListeners", ["listener1"]); +}); diff --git a/modules/cli/tests/command/ServerCommand.test.ts b/modules/cli/tests/command/ServerCommand.test.ts index 98f16f49..3e7f8b8a 100644 --- a/modules/cli/tests/command/ServerCommand.test.ts +++ b/modules/cli/tests/command/ServerCommand.test.ts @@ -1,35 +1,40 @@ -import type { ModuleMetadata } from "@fabernovel/heart-common" -import { Command } from "commander" -import { createServerSubcommand } from "../../src/command/server/ServerCommand.js" +import type { ModuleMetadata } from "@fabernovel/heart-common"; +import { Command } from "commander"; +import { createServerSubcommand } from "../../src/command/server/ServerCommand.js"; test("Create a server command", () => { - const moduleMetadata: ModuleMetadata = { - id: "test-server", - type: "server", - name: "Heart Test Server", - service: { - name: "Test Server", - }, - } - - const optionCors = '{"origin":"http://127.0..0.1:8080/"}' - const optionPort = 3000 - - const program = new Command() - - const serverCommand = createServerSubcommand(moduleMetadata, () => Promise.resolve()) - - program.addCommand(serverCommand) - program.parse(["test-server", "--port", optionPort.toString(), "--cors", optionCors], { from: "user" }) - - expect(program.commands).toHaveLength(1) - - const command = program.commands[0] - const options = command.opts() - - expect(command.name()).toBe(moduleMetadata.id) - expect(Object.keys(options)).toHaveLength(3) - expect(options).toHaveProperty("cors", JSON.parse(optionCors)) - expect(options).toHaveProperty("port", optionPort) - expect(options).toHaveProperty("verbose", false) -}) + const moduleMetadata: ModuleMetadata = { + id: "test-server", + type: "server", + name: "Heart Test Server", + service: { + name: "Test Server", + }, + }; + + const optionCors = '{"origin":"http://127.0..0.1:8080/"}'; + const optionPort = 3000; + + const program = new Command(); + + const serverCommand = createServerSubcommand(moduleMetadata, () => + Promise.resolve(), + ); + + program.addCommand(serverCommand); + program.parse( + ["test-server", "--port", optionPort.toString(), "--cors", optionCors], + { from: "user" }, + ); + + expect(program.commands).toHaveLength(1); + + const command = program.commands[0]; + const options = command.opts(); + + expect(command.name()).toBe(moduleMetadata.id); + expect(Object.keys(options)).toHaveLength(3); + expect(options).toHaveProperty("cors", JSON.parse(optionCors)); + expect(options).toHaveProperty("port", optionPort); + expect(options).toHaveProperty("verbose", false); +}); diff --git a/modules/cli/tests/module/ModuleOrchestrator.test.ts b/modules/cli/tests/module/ModuleOrchestrator.test.ts index 55db1121..4a8e89c0 100644 --- a/modules/cli/tests/module/ModuleOrchestrator.test.ts +++ b/modules/cli/tests/module/ModuleOrchestrator.test.ts @@ -1,38 +1,42 @@ -import { type Config, type ModuleAnalysisInterface, GreenITReport } from "@fabernovel/heart-common" -import { jest } from "@jest/globals" -import { startAnalysis } from "../../src/module/ModuleOrchestrator.js" +import { + type Config, + type ModuleAnalysisInterface, + GreenITReport, +} from "@fabernovel/heart-common"; +import { jest } from "@jest/globals"; +import { startAnalysis } from "../../src/module/ModuleOrchestrator.js"; test("Displays the results of an analysis", async () => { - const report = new GreenITReport({ - analyzedUrl: "https://heart.fabernovel.com", - date: new Date(), - inputs: { - config: {}, - }, - result: { - grade: "B", - ecoIndex: 50, - } as unknown as GreenITReport["result"], - service: { - name: "Heart CLI", - }, - }) + const report = new GreenITReport({ + analyzedUrl: "https://heart.fabernovel.com", + date: new Date(), + inputs: { + config: {}, + }, + result: { + grade: "B", + ecoIndex: 50, + } as unknown as GreenITReport["result"], + service: { + name: "Heart CLI", + }, + }); - const module: ModuleAnalysisInterface = { - id: "test-analysis-tool", - name: "Heart Test Analysis Tool", - service: { - name: "Test Analysis Tool", - }, - startAnalysis: () => Promise.resolve(report), - verbose: false, - } + const module: ModuleAnalysisInterface = { + id: "test-analysis-tool", + name: "Heart Test Analysis Tool", + service: { + name: "Test Analysis Tool", + }, + startAnalysis: () => Promise.resolve(report), + verbose: false, + }; - const startAnalysisMock = jest.spyOn(module, "startAnalysis") + const startAnalysisMock = jest.spyOn(module, "startAnalysis"); - await startAnalysis(module, {}) + await startAnalysis(module, {}); - expect(startAnalysisMock).toHaveBeenCalled() + expect(startAnalysisMock).toHaveBeenCalled(); - startAnalysisMock.mockRestore() -}) + startAnalysisMock.mockRestore(); +}); diff --git a/modules/common/src/entities/ReportEntity.ts b/modules/common/src/entities/ReportEntity.ts index 6b7ea854..4beab122 100644 --- a/modules/common/src/entities/ReportEntity.ts +++ b/modules/common/src/entities/ReportEntity.ts @@ -1,40 +1,46 @@ -import { Cascade, Entity, ManyToOne, PrimaryKey, Property } from "@mikro-orm/core" -import type Report from "../report/Report.js" -import type { GenericReport } from "../report/Report.js" -import { ServiceEntity } from "./ServiceEntity.js" +import { + Cascade, + Entity, + ManyToOne, + PrimaryKey, + Property, +} from "@mikro-orm/core"; +import type Report from "../report/Report.js"; +import type { GenericReport } from "../report/Report.js"; +import type { ServiceEntity } from "./ServiceEntity.js"; @Entity({ tableName: "report" }) export class ReportEntity { - @PrimaryKey() - id!: number + @PrimaryKey() + id!: number; - @Property() - analyzedUrl!: Report["analyzedUrl"] + @Property() + analyzedUrl!: Report["analyzedUrl"]; - @Property() - date!: Report["date"] + @Property() + date!: Report["date"]; - @Property() - grade!: Report["grade"] + @Property() + grade!: Report["grade"]; - @Property() - normalizedGrade!: Report["normalizedGrade"] + @Property() + normalizedGrade!: Report["normalizedGrade"]; - @Property({ type: "json" }) - result!: Result + @Property({ type: "json" }) + result!: Result; - @Property() - resultUrl?: Report["resultUrl"] + @Property() + resultUrl?: Report["resultUrl"]; - @ManyToOne({ cascade: [Cascade.PERSIST] }) - service!: ServiceEntity + @ManyToOne({ cascade: [Cascade.PERSIST] }) + service!: ServiceEntity; - constructor(report: GenericReport) { - this.analyzedUrl = report.analyzedUrl - this.date = report.date - this.grade = report.grade - this.normalizedGrade = report.normalizedGrade - this.result = report.result - this.resultUrl = report.resultUrl - } + constructor(report: GenericReport) { + this.analyzedUrl = report.analyzedUrl; + this.date = report.date; + this.grade = report.grade; + this.normalizedGrade = report.normalizedGrade; + this.result = report.result; + this.resultUrl = report.resultUrl; + } } diff --git a/modules/common/src/entities/ServiceEntity.ts b/modules/common/src/entities/ServiceEntity.ts index 0e95cb7c..ea770441 100644 --- a/modules/common/src/entities/ServiceEntity.ts +++ b/modules/common/src/entities/ServiceEntity.ts @@ -1,16 +1,16 @@ -import { Entity, PrimaryKey, Property } from "@mikro-orm/core" -import type { Service } from "../service/Service.js" +import { Entity, PrimaryKey, Property } from "@mikro-orm/core"; +import type { Service } from "../service/Service.js"; @Entity({ tableName: "service" }) export class ServiceEntity { - @PrimaryKey() - name!: Service["name"] + @PrimaryKey() + name!: Service["name"]; - @Property() - logoUrl?: Service["logoUrl"] + @Property() + logoUrl?: Service["logoUrl"]; - constructor(service: Service) { - this.name = service.name - this.logoUrl = service.logoUrl - } + constructor(service: Service) { + this.name = service.name; + this.logoUrl = service.logoUrl; + } } diff --git a/modules/common/src/http/Request.ts b/modules/common/src/http/Request.ts index f6caf35e..620e99be 100644 --- a/modules/common/src/http/Request.ts +++ b/modules/common/src/http/Request.ts @@ -1,26 +1,29 @@ -import type { ParsedUrlQueryInput } from "querystring" +import type { ParsedUrlQueryInput } from "node:querystring"; const BASE_HEADER: Record<"Content-Type", string> = { - "Content-Type": "application/json", -} + "Content-Type": "application/json", +}; export async function get(url: string): Promise { - const response = await fetch(url, { - method: "GET", - headers: BASE_HEADER, - }) + const response = await fetch(url, { + method: "GET", + headers: BASE_HEADER, + }); - return response.json() as Promise + return response.json() as Promise; } -export async function post(url: string, body: ParsedUrlQueryInput = {}): Promise { - const stringifiedBody = JSON.stringify(body) +export async function post( + url: string, + body: ParsedUrlQueryInput = {}, +): Promise { + const stringifiedBody = JSON.stringify(body); - const response = await fetch(url, { - method: "POST", - body: stringifiedBody, - headers: BASE_HEADER, - }) + const response = await fetch(url, { + method: "POST", + body: stringifiedBody, + headers: BASE_HEADER, + }); - return response.json() as Promise + return response.json() as Promise; } diff --git a/modules/common/src/index.ts b/modules/common/src/index.ts index ccab37d6..cd9cf733 100644 --- a/modules/common/src/index.ts +++ b/modules/common/src/index.ts @@ -1,106 +1,110 @@ -import { ReportEntity } from "./entities/ReportEntity.js" -import { ServiceEntity } from "./entities/ServiceEntity.js" -import { InputError } from "./error/InputError.js" -import { get, post } from "./http/Request.js" -import type { ParsedAnalysisInput, ValidatedAnalysisInput } from "./input/AnalysisInput.js" -import type { ParsedServerInput } from "./input/ServerInput.js" -import { logger } from "./logger/logger.js" -import { Module } from "./module/Module.js" -import type { ModuleIndex } from "./module/ModuleIndex.js" -import type { ModuleMetadata } from "./module/ModuleMetadata.js" -import { isModuleAnalysis, type ModuleAnalysisInterface } from "./module/analysis/ModuleAnalysisInterface.js" -import type { Config } from "./module/config/Config.js" -import type { GreenITConfig } from "./module/config/greenit/GreeenITConfig.js" -import type { LighthouseConfig } from "./module/config/lighthouse/LighthouseConfig.js" -import type { ObservatoryConfig } from "./module/config/observatory/ObservatoryConfig.js" -import type { SsllabsServerConfig } from "./module/config/ssllabs-server/SsllabsServerConfig.js" -import { createDatabaseConfig } from "./module/listener/ModuleListenerDatabaseConfig.js" +import { ReportEntity } from "./entities/ReportEntity.js"; +import { ServiceEntity } from "./entities/ServiceEntity.js"; +import { InputError } from "./error/InputError.js"; +import { get, post } from "./http/Request.js"; +import type { + ParsedAnalysisInput, + ValidatedAnalysisInput, +} from "./input/AnalysisInput.js"; +import type { ParsedServerInput } from "./input/ServerInput.js"; +import { logger } from "./logger/logger.js"; +import { Module } from "./module/Module.js"; +import type { ModuleIndex } from "./module/ModuleIndex.js"; +import type { ModuleMetadata } from "./module/ModuleMetadata.js"; import { - isModuleListenerDatabase, - type ModuleListenerDatabaseInterface, -} from "./module/listener/ModuleListenerDatabaseInterface.js" -import { isModuleListener, type ModuleListenerInterface } from "./module/listener/ModuleListenerInterface.js" -import { isModuleServer, type ModuleServerInterface } from "./module/server/ModuleServerInterface.js" -import type { GenericReport } from "./report/Report.js" -import type { Result } from "./report/Result.js" -import { GreenITReport } from "./report/greenit/GreenITReport.js" -import { LighthouseReport } from "./report/lighthouse/LighthouseReport.js" -import { ObservatoryReport } from "./report/observatory/ObservatoryReport.js" -import { ObservatoryScanState } from "./report/observatory/enum/ObservatoryScanState.js" -import { SsllabsServerReport } from "./report/ssllabs-server/SsllabsServerReport.js" -import { SsllabsServerStatus } from "./report/ssllabs-server/enum/SsllabsServerStatus.js" -import { timeout } from "./time/timeout.js" + isModuleAnalysis, + type ModuleAnalysisInterface, +} from "./module/analysis/ModuleAnalysisInterface.js"; +import type { Config } from "./module/config/Config.js"; +import type { GreenITConfig } from "./module/config/greenit/GreeenITConfig.js"; +import type { LighthouseConfig } from "./module/config/lighthouse/LighthouseConfig.js"; +import type { ObservatoryConfig } from "./module/config/observatory/ObservatoryConfig.js"; +import type { SsllabsServerConfig } from "./module/config/ssllabs-server/SsllabsServerConfig.js"; +import { createDatabaseConfig } from "./module/listener/ModuleListenerDatabaseConfig.js"; import { - getAnalysisValidationSchema, - validateAnalysisInput, -} from "./validation/input/analysis/AnalysisInputValidation.js" -import { validateServerInput } from "./validation/input/server/ServerInputValidation.js" + isModuleListenerDatabase, + type ModuleListenerDatabaseInterface, +} from "./module/listener/ModuleListenerDatabaseInterface.js"; +import { + isModuleListener, + type ModuleListenerInterface, +} from "./module/listener/ModuleListenerInterface.js"; +import { + isModuleServer, + type ModuleServerInterface, +} from "./module/server/ModuleServerInterface.js"; +import type { GenericReport } from "./report/Report.js"; +import type { Result } from "./report/Result.js"; +import { GreenITReport } from "./report/greenit/GreenITReport.js"; +import { LighthouseReport } from "./report/lighthouse/LighthouseReport.js"; +import { ObservatoryReport } from "./report/observatory/ObservatoryReport.js"; +import { ObservatoryScanState } from "./report/observatory/enum/ObservatoryScanState.js"; +import { SsllabsServerReport } from "./report/ssllabs-server/SsllabsServerReport.js"; +import { SsllabsServerStatus } from "./report/ssllabs-server/enum/SsllabsServerStatus.js"; +import { timeout } from "./time/timeout.js"; +import { + getAnalysisValidationSchema, + validateAnalysisInput, +} from "./validation/input/analysis/AnalysisInputValidation.js"; +import { validateServerInput } from "./validation/input/server/ServerInputValidation.js"; const Helper = { - timeout, -} + timeout, +}; const Request = { - get: get, - post: post, -} + get: get, + post: post, +}; export type { - // Modules - ModuleAnalysisInterface, - ModuleIndex, - ModuleMetadata, - ModuleListenerInterface, - ModuleListenerDatabaseInterface, - ModuleServerInterface, - - // Reports - GenericReport, - Result, - - // Analysis module config - Config, - GreenITConfig, - LighthouseConfig, - ObservatoryConfig, - SsllabsServerConfig, - - // Input - ParsedAnalysisInput, - ParsedServerInput, - ValidatedAnalysisInput, -} + // Modules + ModuleAnalysisInterface, + ModuleIndex, + ModuleMetadata, + ModuleListenerInterface, + ModuleListenerDatabaseInterface, + ModuleServerInterface, + // Reports + GenericReport, + Result, + // Analysis module config + Config, + GreenITConfig, + LighthouseConfig, + ObservatoryConfig, + SsllabsServerConfig, + // Input + ParsedAnalysisInput, + ParsedServerInput, + ValidatedAnalysisInput, +}; export { - // Database - createDatabaseConfig, - ReportEntity, - ServiceEntity, - - // Errors - InputError, - - // Logger - logger, - - // Modules - Helper, - isModuleAnalysis, - isModuleListener, - isModuleListenerDatabase, - isModuleServer, - Module, - - // Reports - GreenITReport, - LighthouseReport, - ObservatoryReport, - ObservatoryScanState, - SsllabsServerReport, - Request, - SsllabsServerStatus, - - // Validation - getAnalysisValidationSchema, - validateAnalysisInput, - validateServerInput, -} + // Database + createDatabaseConfig, + ReportEntity, + ServiceEntity, + // Errors + InputError, + // Logger + logger, + // Modules + Helper, + isModuleAnalysis, + isModuleListener, + isModuleListenerDatabase, + isModuleServer, + Module, + // Reports + GreenITReport, + LighthouseReport, + ObservatoryReport, + ObservatoryScanState, + SsllabsServerReport, + Request, + SsllabsServerStatus, + // Validation + getAnalysisValidationSchema, + validateAnalysisInput, + validateServerInput, +}; diff --git a/modules/common/src/input/AnalysisInput.ts b/modules/common/src/input/AnalysisInput.ts index 76219a04..0e3f8ac9 100644 --- a/modules/common/src/input/AnalysisInput.ts +++ b/modules/common/src/input/AnalysisInput.ts @@ -1,16 +1,16 @@ -import type { JsonObject, JsonValue } from "type-fest" -import type { ParsedCommonInput, ValidatedCommonInput } from "./CommonInput.js" +import type { JsonObject, JsonValue } from "type-fest"; +import type { ParsedCommonInput, ValidatedCommonInput } from "./CommonInput.js"; export interface ParsedAnalysisInput extends ParsedCommonInput { - config: JsonValue - threshold?: number - except_listeners?: string[] - only_listeners?: string[] + config: JsonValue; + threshold?: number; + except_listeners?: string[]; + only_listeners?: string[]; } export interface ValidatedAnalysisInput extends ValidatedCommonInput { - config: JsonObject - threshold?: number - except_listeners?: string[] - only_listeners?: string[] + config: JsonObject; + threshold?: number; + except_listeners?: string[]; + only_listeners?: string[]; } diff --git a/modules/common/src/input/CommonInput.ts b/modules/common/src/input/CommonInput.ts index 56dd935b..11182b4f 100644 --- a/modules/common/src/input/CommonInput.ts +++ b/modules/common/src/input/CommonInput.ts @@ -1,7 +1,7 @@ export interface ParsedCommonInput { - verbose: boolean + verbose: boolean; } export interface ValidatedCommonInput { - verbose: boolean + verbose: boolean; } diff --git a/modules/common/src/input/ServerInput.ts b/modules/common/src/input/ServerInput.ts index 87ced66f..3dcd5661 100644 --- a/modules/common/src/input/ServerInput.ts +++ b/modules/common/src/input/ServerInput.ts @@ -1,15 +1,15 @@ -import type { FastifyCorsOptions } from "@fastify/cors" -import type { JsonValue } from "type-fest" -import type { ParsedCommonInput, ValidatedCommonInput } from "./CommonInput.js" +import type { FastifyCorsOptions } from "@fastify/cors"; +import type { JsonValue } from "type-fest"; +import type { ParsedCommonInput, ValidatedCommonInput } from "./CommonInput.js"; export interface ParsedServerInput extends ParsedCommonInput { - cors?: JsonValue - port: number - verbose: boolean + cors?: JsonValue; + port: number; + verbose: boolean; } export interface ValidatedServerInput extends ValidatedCommonInput { - cors?: FastifyCorsOptions - port: number - verbose: boolean + cors?: FastifyCorsOptions; + port: number; + verbose: boolean; } diff --git a/modules/common/src/logger/logger.ts b/modules/common/src/logger/logger.ts index b199474f..66106240 100644 --- a/modules/common/src/logger/logger.ts +++ b/modules/common/src/logger/logger.ts @@ -1,11 +1,11 @@ -import { pino } from "pino" +import { pino } from "pino"; export const logger = pino({ - level: "info", - transport: { - target: "pino-pretty", - options: { - colorize: true, - }, - }, -}) + level: "info", + transport: { + target: "pino-pretty", + options: { + colorize: true, + }, + }, +}); diff --git a/modules/common/src/module/Module.ts b/modules/common/src/module/Module.ts index db365678..8e30bbcf 100644 --- a/modules/common/src/module/Module.ts +++ b/modules/common/src/module/Module.ts @@ -1,15 +1,15 @@ -import type { ModuleMetadata } from "./ModuleMetadata.js" +import type { ModuleMetadata } from "./ModuleMetadata.js"; export abstract class Module { - readonly id: ModuleMetadata["id"] - readonly name: ModuleMetadata["name"] - readonly service: ModuleMetadata["service"] - readonly verbose: boolean + readonly id: ModuleMetadata["id"]; + readonly name: ModuleMetadata["name"]; + readonly service: ModuleMetadata["service"]; + readonly verbose: boolean; - constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { - this.id = moduleMetadata.id - this.name = moduleMetadata.name - this.service = moduleMetadata.service - this.verbose = verbose - } + constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { + this.id = moduleMetadata.id; + this.name = moduleMetadata.name; + this.service = moduleMetadata.service; + this.verbose = verbose; + } } diff --git a/modules/common/src/module/ModuleIndex.ts b/modules/common/src/module/ModuleIndex.ts index 05c2f340..df49aaa7 100644 --- a/modules/common/src/module/ModuleIndex.ts +++ b/modules/common/src/module/ModuleIndex.ts @@ -1,6 +1,6 @@ -import type { Module } from "./Module.js" -import type { ModuleMetadata } from "./ModuleMetadata.js" +import type { Module } from "./Module.js"; +import type { ModuleMetadata } from "./ModuleMetadata.js"; export interface ModuleIndex { - initialize: (moduleMetadata: ModuleMetadata, verbose: boolean) => Module + initialize: (moduleMetadata: ModuleMetadata, verbose: boolean) => Module; } diff --git a/modules/common/src/module/ModuleMetadata.ts b/modules/common/src/module/ModuleMetadata.ts index 5c8b8bd6..5ddce9cc 100644 --- a/modules/common/src/module/ModuleMetadata.ts +++ b/modules/common/src/module/ModuleMetadata.ts @@ -1,17 +1,17 @@ -import type { Service } from "../service/Service.js" +import type { Service } from "../service/Service.js"; export interface ModuleMetadata { - /** - * Example: observatory - */ - id: string + /** + * Example: observatory + */ + id: string; - /** - * Example: Heart Observatory - */ - name: string + /** + * Example: Heart Observatory + */ + name: string; - service: Service + service: Service; - type: "analysis" | "listener" | "listener:database" | "server" + type: "analysis" | "listener" | "listener:database" | "server"; } diff --git a/modules/common/src/module/analysis/ModuleAnalysisInterface.ts b/modules/common/src/module/analysis/ModuleAnalysisInterface.ts index bd1f903f..d35e9b9a 100644 --- a/modules/common/src/module/analysis/ModuleAnalysisInterface.ts +++ b/modules/common/src/module/analysis/ModuleAnalysisInterface.ts @@ -1,12 +1,15 @@ -import type { GenericReport, Module } from "../../index.js" -import type { Result } from "../../report/Result.js" -import type { Config } from "../config/Config.js" +import type { GenericReport, Module } from "../../index.js"; +import type { Result } from "../../report/Result.js"; +import type { Config } from "../config/Config.js"; /** * Define an Analysis module. */ -export interface ModuleAnalysisInterface> extends Module { - startAnalysis: (conf: C, thresholds?: number) => Promise +export interface ModuleAnalysisInterface< + C extends Config, + R extends GenericReport, +> extends Module { + startAnalysis: (conf: C, thresholds?: number) => Promise; } /** @@ -14,17 +17,18 @@ export interface ModuleAnalysisInterface -> = new () => ModuleAnalysisInterface + C extends Config, + R extends GenericReport, +> = new () => ModuleAnalysisInterface; /** * Checks if a module is an Analysis one. * @see {@link https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates | User-Defined Type Guards} */ -export function isModuleAnalysis>( - module: Module -): module is ModuleAnalysisInterface { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - return (module as ModuleAnalysisInterface).startAnalysis !== undefined +export function isModuleAnalysis< + C extends Config, + R extends GenericReport, +>(module: Module): module is ModuleAnalysisInterface { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return (module as ModuleAnalysisInterface).startAnalysis !== undefined; } diff --git a/modules/common/src/module/config/Config.ts b/modules/common/src/module/config/Config.ts index af0cc4c3..09b0571f 100644 --- a/modules/common/src/module/config/Config.ts +++ b/modules/common/src/module/config/Config.ts @@ -1,6 +1,6 @@ -import type { JsonObject } from "type-fest" +import type { JsonObject } from "type-fest"; /** * JSON object provided as configuration input for analysis modules */ -export type Config = JsonObject +export type Config = JsonObject; diff --git a/modules/common/src/module/config/greenit/GreeenITConfig.ts b/modules/common/src/module/config/greenit/GreeenITConfig.ts index e23c1181..03a93b46 100644 --- a/modules/common/src/module/config/greenit/GreeenITConfig.ts +++ b/modules/common/src/module/config/greenit/GreeenITConfig.ts @@ -1,16 +1,23 @@ -import type { Config } from "../Config.js" +import type { Config } from "../Config.js"; -type SizeNames = "desktop" | "galaxyS9" | "galaxyS20" | "iPhone8" | "iPhone8Plus" | "iPhoneX" | "iPad" +type SizeNames = + | "desktop" + | "galaxyS9" + | "galaxyS20" + | "iPhone8" + | "iPhone8Plus" + | "iPhoneX" + | "iPad"; interface Options { - timeout?: number - max_tab?: number - retry?: number - device?: SizeNames - ci?: boolean + timeout?: number; + max_tab?: number; + retry?: number; + device?: SizeNames; + ci?: boolean; } export type GreenITConfig = Config & - Options & { - url: string - } + Options & { + url: string; + }; diff --git a/modules/common/src/module/config/lighthouse/LighthouseConfig.ts b/modules/common/src/module/config/lighthouse/LighthouseConfig.ts index 63e82d91..23fa40bb 100644 --- a/modules/common/src/module/config/lighthouse/LighthouseConfig.ts +++ b/modules/common/src/module/config/lighthouse/LighthouseConfig.ts @@ -1,7 +1,7 @@ -import type { Config } from "lighthouse" -import type { Config as BaseConfig } from "../Config.js" +import type { Config } from "lighthouse"; +import type { Config as BaseConfig } from "../Config.js"; export type LighthouseConfig = BaseConfig & { - url: string - config?: Config -} + url: string; + config?: Config; +}; diff --git a/modules/common/src/module/config/observatory/ObservatoryConfig.ts b/modules/common/src/module/config/observatory/ObservatoryConfig.ts index 8fe9d6cf..58669087 100644 --- a/modules/common/src/module/config/observatory/ObservatoryConfig.ts +++ b/modules/common/src/module/config/observatory/ObservatoryConfig.ts @@ -1,10 +1,10 @@ -import type { Config } from "../Config.js" +import type { Config } from "../Config.js"; /** * @see {@link https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/api.md#invoke-assessment} */ export type ObservatoryConfig = Config & { - host: string - hidden?: boolean - rescan?: boolean -} + host: string; + hidden?: boolean; + rescan?: boolean; +}; diff --git a/modules/common/src/module/config/ssllabs-server/SsllabsServerConfig.ts b/modules/common/src/module/config/ssllabs-server/SsllabsServerConfig.ts index 652bbd67..facd00cd 100644 --- a/modules/common/src/module/config/ssllabs-server/SsllabsServerConfig.ts +++ b/modules/common/src/module/config/ssllabs-server/SsllabsServerConfig.ts @@ -1,49 +1,49 @@ -import type { Config } from "../Config.js" +import type { Config } from "../Config.js"; /** * @see {@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#invoke-assessment-and-check-progress} */ export type SsllabsServerConfig = Config & { - /** - * Hostname - */ - host: string + /** + * Hostname + */ + host: string; - /** - * Set to "on" if assessment results should be published on the public results boards optional, defaults to "off". - */ - publish?: string + /** + * Set to "on" if assessment results should be published on the public results boards optional, defaults to "off". + */ + publish?: string; - /** - * If set to "on" then cached assessment results are ignored and a new assessment is started. - * However, if there's already an assessment in progress, its status is delivered instead. - * This parameter should be used only once to initiate a new assessment - * further invocations should omit it to avoid causing an assessment loop. - */ - startNew?: string + /** + * If set to "on" then cached assessment results are ignored and a new assessment is started. + * However, if there's already an assessment in progress, its status is delivered instead. + * This parameter should be used only once to initiate a new assessment + * further invocations should omit it to avoid causing an assessment loop. + */ + startNew?: string; - /** - * Always deliver cached assessment reports if available optional, defaults to "off". - * This parameter is intended for API consumers that don't want to wait for assessment results. - * Can't be used at the same time as the startNew parameter. - */ - fromCache?: string + /** + * Always deliver cached assessment reports if available optional, defaults to "off". + * This parameter is intended for API consumers that don't want to wait for assessment results. + * Can't be used at the same time as the startNew parameter. + */ + fromCache?: string; - /** - * Maximum report age, in hours, if retrieving from cache (fromCache parameter set). - */ - maxAge?: number + /** + * Maximum report age, in hours, if retrieving from cache (fromCache parameter set). + */ + maxAge?: number; - /** - * By default this call results only summaries of individual endpoints. - * If this parameter is set to "on", full information will be returned. - * If set to "done", full information will be returned only if the assessment is complete (status is READY or ERROR). - */ - all?: string + /** + * By default this call results only summaries of individual endpoints. + * If this parameter is set to "on", full information will be returned. + * If set to "done", full information will be returned only if the assessment is complete (status is READY or ERROR). + */ + all?: string; - /** - * Set to "on" to proceed with assessments even when the server certificate doesn't match the assessment hostname. - * Set to off by default. Please note that this parameter is ignored if a cached report is returned. - */ - ignoreMismatch?: string -} + /** + * Set to "on" to proceed with assessments even when the server certificate doesn't match the assessment hostname. + * Set to off by default. Please note that this parameter is ignored if a cached report is returned. + */ + ignoreMismatch?: string; +}; diff --git a/modules/common/src/module/listener/ModuleListenerDatabaseConfig.ts b/modules/common/src/module/listener/ModuleListenerDatabaseConfig.ts index 9d2a14b0..7357b9d2 100644 --- a/modules/common/src/module/listener/ModuleListenerDatabaseConfig.ts +++ b/modules/common/src/module/listener/ModuleListenerDatabaseConfig.ts @@ -1,18 +1,20 @@ -import { type IDatabaseDriver, type Options } from "@mikro-orm/core" -import { TsMorphMetadataProvider } from "@mikro-orm/reflection" -import { ReportEntity } from "../../entities/ReportEntity.js" -import { ServiceEntity } from "../../entities/ServiceEntity.js" +import type { IDatabaseDriver, Options } from "@mikro-orm/core"; +import { TsMorphMetadataProvider } from "@mikro-orm/reflection"; +import { ReportEntity } from "../../entities/ReportEntity.js"; +import { ServiceEntity } from "../../entities/ServiceEntity.js"; -const DB_NAME = "heart" +const DB_NAME = "heart"; -export function createDatabaseConfig(options: Options): Options { - options.dbName = DB_NAME - options.entities = [ReportEntity, ServiceEntity] - options.metadataProvider = TsMorphMetadataProvider +export function createDatabaseConfig( + options: Options, +): Options { + options.dbName = DB_NAME; + options.entities = [ReportEntity, ServiceEntity]; + options.metadataProvider = TsMorphMetadataProvider; - if (options.migrations) { - options.migrations.snapshot = false - } + if (options.migrations) { + options.migrations.snapshot = false; + } - return options + return options; } diff --git a/modules/common/src/module/listener/ModuleListenerDatabaseInterface.ts b/modules/common/src/module/listener/ModuleListenerDatabaseInterface.ts index 0d56b613..324fca87 100644 --- a/modules/common/src/module/listener/ModuleListenerDatabaseInterface.ts +++ b/modules/common/src/module/listener/ModuleListenerDatabaseInterface.ts @@ -1,29 +1,34 @@ -import type { Module } from "../Module.js" -import type { ModuleListenerInterface } from "./ModuleListenerInterface.js" +import type { Module } from "../Module.js"; +import type { ModuleListenerInterface } from "./ModuleListenerInterface.js"; /** * Define a database Listener module. */ -export interface ModuleListenerDatabaseInterface extends ModuleListenerInterface { - hasPendingMigrations(): Promise - runPendingMigrations(): Promise +export interface ModuleListenerDatabaseInterface + extends ModuleListenerInterface { + hasPendingMigrations(): Promise; + runPendingMigrations(): Promise; } /** * Constructor interface signature * @see {@link https://www.typescriptlang.org/docs/handbook/interfaces.html#difference-between-the-static-and-instance-sides-of-classes} */ -export type ModuleListenerDatabase = new () => ModuleListenerDatabaseInterface +export type ModuleListenerDatabase = new () => ModuleListenerDatabaseInterface; /** * Checks if a module is a Listener one. * @see {@link https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates | User-Defined Type Guards} */ -export function isModuleListenerDatabase(module: Module): module is ModuleListenerDatabaseInterface { - return ( - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - (module as ModuleListenerDatabaseInterface).hasPendingMigrations !== undefined && - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - (module as ModuleListenerDatabaseInterface).runPendingMigrations !== undefined - ) +export function isModuleListenerDatabase( + module: Module, +): module is ModuleListenerDatabaseInterface { + return ( + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + (module as ModuleListenerDatabaseInterface).hasPendingMigrations !== + undefined && + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + (module as ModuleListenerDatabaseInterface).runPendingMigrations !== + undefined + ); } diff --git a/modules/common/src/module/listener/ModuleListenerInterface.ts b/modules/common/src/module/listener/ModuleListenerInterface.ts index 852e7e93..95ac2f92 100644 --- a/modules/common/src/module/listener/ModuleListenerInterface.ts +++ b/modules/common/src/module/listener/ModuleListenerInterface.ts @@ -1,25 +1,27 @@ -import type { GenericReport } from "../../report/Report.js" -import type { Result } from "../../report/Result.js" -import type { Module } from "../Module.js" +import type { GenericReport } from "../../report/Report.js"; +import type { Result } from "../../report/Result.js"; +import type { Module } from "../Module.js"; /** * Define an Listener module. */ export interface ModuleListenerInterface extends Module { - notifyAnalysisDone(report: GenericReport): Promise + notifyAnalysisDone(report: GenericReport): Promise; } /** * Constructor interface signature * @see {@link https://www.typescriptlang.org/docs/handbook/interfaces.html#difference-between-the-static-and-instance-sides-of-classes} */ -export type ModuleListener = new () => ModuleListenerInterface +export type ModuleListener = new () => ModuleListenerInterface; /** * Checks if a module is a Listener one. * @see {@link https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates | User-Defined Type Guards} */ -export function isModuleListener(module: Module): module is ModuleListenerInterface { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - return (module as ModuleListenerInterface).notifyAnalysisDone !== undefined +export function isModuleListener( + module: Module, +): module is ModuleListenerInterface { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return (module as ModuleListenerInterface).notifyAnalysisDone !== undefined; } diff --git a/modules/common/src/module/server/ModuleServerInterface.ts b/modules/common/src/module/server/ModuleServerInterface.ts index 55cf3f26..09accae6 100644 --- a/modules/common/src/module/server/ModuleServerInterface.ts +++ b/modules/common/src/module/server/ModuleServerInterface.ts @@ -1,30 +1,38 @@ -import type { FastifyCorsOptions } from "@fastify/cors" -import type { FastifyInstance } from "fastify" -import type { Config, GenericReport, Module, ModuleListenerInterface, Result } from "../../index.js" -import type { ModuleAnalysisInterface } from "../analysis/ModuleAnalysisInterface.js" +import type { FastifyCorsOptions } from "@fastify/cors"; +import type { FastifyInstance } from "fastify"; +import type { + Config, + GenericReport, + Module, + ModuleListenerInterface, + Result, +} from "../../index.js"; +import type { ModuleAnalysisInterface } from "../analysis/ModuleAnalysisInterface.js"; /** * Define a Server module. */ export interface ModuleServerInterface extends Module { - createServer: ( - analysisModules: ModuleAnalysisInterface>[], - listenerModules: ModuleListenerInterface[], - cors?: FastifyCorsOptions - ) => Promise + createServer: ( + analysisModules: ModuleAnalysisInterface>[], + listenerModules: ModuleListenerInterface[], + cors?: FastifyCorsOptions, + ) => Promise; } /** * Constructor interface signature * @see {@link https://www.typescriptlang.org/docs/handbook/interfaces.html#difference-between-the-static-and-instance-sides-of-classes} */ -export type ModuleServer = new () => ModuleServerInterface +export type ModuleServer = new () => ModuleServerInterface; /** * Checks if a module is a Server one. * @see {@link https://www.typescriptlang.org/docs/handbook/2/narrowing.html#using-type-predicates | User-Defined Type Guards} */ -export function isModuleServer(module: Module): module is ModuleServerInterface { - // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition - return (module as ModuleServerInterface).createServer !== undefined +export function isModuleServer( + module: Module, +): module is ModuleServerInterface { + // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition + return (module as ModuleServerInterface).createServer !== undefined; } diff --git a/modules/common/src/report/Report.ts b/modules/common/src/report/Report.ts index ecff52c2..2de9dc93 100644 --- a/modules/common/src/report/Report.ts +++ b/modules/common/src/report/Report.ts @@ -1,56 +1,56 @@ -import type { ValidatedAnalysisInput } from "../index.js" -import type { Service } from "../service/Service.js" +import type { ValidatedAnalysisInput } from "../index.js"; +import type { Service } from "../service/Service.js"; /** * Define an analysis report that is shared between every Heart module. */ interface ReportBase { - /** - * URL that is analyzed - */ - analyzedUrl: string + /** + * URL that is analyzed + */ + analyzedUrl: string; - /** - * Date of the analyze. - * Could be different from the moment when the analysis is done, because some services have a cache system. - */ - date: Date + /** + * Date of the analyze. + * Could be different from the moment when the analysis is done, because some services have a cache system. + */ + date: Date; - /** - * URL where the analysis results are accessible - */ - resultUrl?: string + /** + * URL where the analysis results are accessible + */ + resultUrl?: string; - /** - * Details about the service that process the analysis - * Optional because some Heart modules do not sollicitate a third-party service (Heart API for example) - */ - service: Service + /** + * Details about the service that process the analysis + * Optional because some Heart modules do not sollicitate a third-party service (Heart API for example) + */ + service: Service; - inputs: Pick + inputs: Pick; } interface ValueHolder { - /** - * Report value - */ - result: A + /** + * Report value + */ + result: A; } export default interface Report extends ReportBase { - /** - * Grade given by the service (often a letter) - */ - get grade(): string + /** + * Grade given by the service (often a letter) + */ + get grade(): string; - /** - * Normalized grade: a number equivalent to the grade - */ - get normalizedGrade(): number + /** + * Normalized grade: a number equivalent to the grade + */ + get normalizedGrade(): number; - displayGrade(): string + displayGrade(): string; - isThresholdReached(): boolean | undefined + isThresholdReached(): boolean | undefined; } export interface ReportArguments extends ReportBase, ValueHolder {} diff --git a/modules/common/src/report/Result.ts b/modules/common/src/report/Result.ts index ccc8b987..f462e034 100644 --- a/modules/common/src/report/Result.ts +++ b/modules/common/src/report/Result.ts @@ -2,4 +2,4 @@ * JSON object that contains the raw results of an analysis. * Therefore, its structure is different for each analysis module. */ -export type Result = Record +export type Result = Record; diff --git a/modules/common/src/report/greenit/GreenITReport.ts b/modules/common/src/report/greenit/GreenITReport.ts index eae37a6d..01085425 100644 --- a/modules/common/src/report/greenit/GreenITReport.ts +++ b/modules/common/src/report/greenit/GreenITReport.ts @@ -1,64 +1,73 @@ -import type { ValidatedAnalysisInput } from "../../index.js" -import type { Service } from "../../service/Service.js" -import type { GenericReport, ReportArguments } from "../Report.js" -import type { GreenITResult } from "./GreenITResult.js" +import type { ValidatedAnalysisInput } from "../../index.js"; +import type { Service } from "../../service/Service.js"; +import type { GenericReport, ReportArguments } from "../Report.js"; +import type { GreenITResult } from "./GreenITResult.js"; export class GreenITReport implements GenericReport { - #analyzedUrl: string - #date: Date - #result: GreenITResult - #resultUrl: string | undefined - #service: Service - #inputs: Pick + #analyzedUrl: string; + #date: Date; + #result: GreenITResult; + #resultUrl: string | undefined; + #service: Service; + #inputs: Pick; - constructor({ analyzedUrl, date, result, resultUrl, service, inputs }: ReportArguments) { - this.#analyzedUrl = analyzedUrl - this.#date = date - this.#result = result - this.#resultUrl = resultUrl - this.#service = service - this.#inputs = inputs - } + constructor({ + analyzedUrl, + date, + result, + resultUrl, + service, + inputs, + }: ReportArguments) { + this.#analyzedUrl = analyzedUrl; + this.#date = date; + this.#result = result; + this.#resultUrl = resultUrl; + this.#service = service; + this.#inputs = inputs; + } - get analyzedUrl(): string { - return this.#analyzedUrl - } + get analyzedUrl(): string { + return this.#analyzedUrl; + } - get date(): Date { - return this.#date - } + get date(): Date { + return this.#date; + } - get grade(): string { - return this.#result.grade - } + get grade(): string { + return this.#result.grade; + } - get normalizedGrade(): number { - return this.#result.ecoIndex - } + get normalizedGrade(): number { + return this.#result.ecoIndex; + } - get result(): GreenITResult { - return this.#result - } + get result(): GreenITResult { + return this.#result; + } - get resultUrl(): string | undefined { - return this.#resultUrl - } + get resultUrl(): string | undefined { + return this.#resultUrl; + } - get service(): Service { - return this.#service - } + get service(): Service { + return this.#service; + } - get inputs(): Pick { - return this.#inputs - } + get inputs(): Pick { + return this.#inputs; + } - displayGrade(): string { - return this.normalizedGrade.toString() === this.grade - ? `${this.grade}/100` - : `${this.grade} (${this.normalizedGrade}/100)` - } + displayGrade(): string { + return this.normalizedGrade.toString() === this.grade + ? `${this.grade}/100` + : `${this.grade} (${this.normalizedGrade}/100)`; + } - isThresholdReached(): boolean | undefined { - return this.inputs.threshold !== undefined ? this.normalizedGrade >= this.inputs.threshold : undefined - } + isThresholdReached(): boolean | undefined { + return this.inputs.threshold !== undefined + ? this.normalizedGrade >= this.inputs.threshold + : undefined; + } } diff --git a/modules/common/src/report/greenit/GreenITResult.ts b/modules/common/src/report/greenit/GreenITResult.ts index 3c470dc3..a5f177f4 100644 --- a/modules/common/src/report/greenit/GreenITResult.ts +++ b/modules/common/src/report/greenit/GreenITResult.ts @@ -1,108 +1,108 @@ -import type { Entry } from "har-format" -import type { Result } from "../Result.js" +import type { Entry } from "har-format"; +import type { Result } from "../Result.js"; /** * Short version of the generated JSON result file */ export type GreenITResult = Result & { - url: string - ecoIndex: number - domSize: number - nbRequest: number - responsesSize: number - responsesSizeUncompress: number - grade: string - waterConsumption: number - greenhouseGasesEmission: number - pluginsNumber: number - printStyleSheetsNumber: number - inlineStyleSheetsNumber: number - emptySrcTagNumber: number - inlineJsScriptsNumber: number - imagesResizedInBrowser: { - src: string - clientWidth: number - clientHeight: number - naturalWidth: number - naturalHeight: number - }[] - entries: Entry[] - dataEntries: Entry[] - bestPractices: { - AddExpiresOrCacheControlHeaders: { - detailComment: string - complianceLevel: string - comment: string - } - CompressHttp: { - detailComment: string - complianceLevel: string - comment: string - } - DomainsNumber: { - detailComment: string - comment: string - } - DontResizeImageInBrowser: { - imgAnalysed: object - detailComment: string - imagesResizedInBrowserNumber: number - complianceLevel: string - comment: string - } - EmptySrcTag: object - ExternalizeCss: { complianceLevel: string; comment: string } - ExternalizeJs: { complianceLevel: string; comment: string } - HttpError: { comment: string } - HttpRequests: { - detailComment: string - comment: string - } - ImageDownloadedNotDisplayed: { - imgAnalysed: object - comment: string - } - JsValidate: { - totalJsSize: number - detailComment: string - errors: number - complianceLevel: string - comment: string - } - MaxCookiesLength: object - MinifiedCss: object - MinifiedJs: { - totalJsSize: number - minifiedJsSize: number - complianceLevel: string - comment: string - } - NoCookieForStaticRessources: object - NoRedirect: { comment: string } - OptimizeBitmapImages: object - OptimizeSvg: object - Plugins: object - PrintStyleSheet: { complianceLevel: string; comment: string } - SocialNetworkButton: object - StyleSheets: { - detailComment: string - } - UseETags: { - complianceLevel: string - comment: string - } - UseStandardTypefaces: { - detailComment: string - complianceLevel: string - comment: string - } - } - success: boolean - nbBestPracticesToCorrect: number - // format: 30/11/2022 15:41:57 - date: string - pageInformations: { url: string } - tryNb: number - tabId: number - index: number -} + url: string; + ecoIndex: number; + domSize: number; + nbRequest: number; + responsesSize: number; + responsesSizeUncompress: number; + grade: string; + waterConsumption: number; + greenhouseGasesEmission: number; + pluginsNumber: number; + printStyleSheetsNumber: number; + inlineStyleSheetsNumber: number; + emptySrcTagNumber: number; + inlineJsScriptsNumber: number; + imagesResizedInBrowser: { + src: string; + clientWidth: number; + clientHeight: number; + naturalWidth: number; + naturalHeight: number; + }[]; + entries: Entry[]; + dataEntries: Entry[]; + bestPractices: { + AddExpiresOrCacheControlHeaders: { + detailComment: string; + complianceLevel: string; + comment: string; + }; + CompressHttp: { + detailComment: string; + complianceLevel: string; + comment: string; + }; + DomainsNumber: { + detailComment: string; + comment: string; + }; + DontResizeImageInBrowser: { + imgAnalysed: object; + detailComment: string; + imagesResizedInBrowserNumber: number; + complianceLevel: string; + comment: string; + }; + EmptySrcTag: object; + ExternalizeCss: { complianceLevel: string; comment: string }; + ExternalizeJs: { complianceLevel: string; comment: string }; + HttpError: { comment: string }; + HttpRequests: { + detailComment: string; + comment: string; + }; + ImageDownloadedNotDisplayed: { + imgAnalysed: object; + comment: string; + }; + JsValidate: { + totalJsSize: number; + detailComment: string; + errors: number; + complianceLevel: string; + comment: string; + }; + MaxCookiesLength: object; + MinifiedCss: object; + MinifiedJs: { + totalJsSize: number; + minifiedJsSize: number; + complianceLevel: string; + comment: string; + }; + NoCookieForStaticRessources: object; + NoRedirect: { comment: string }; + OptimizeBitmapImages: object; + OptimizeSvg: object; + Plugins: object; + PrintStyleSheet: { complianceLevel: string; comment: string }; + SocialNetworkButton: object; + StyleSheets: { + detailComment: string; + }; + UseETags: { + complianceLevel: string; + comment: string; + }; + UseStandardTypefaces: { + detailComment: string; + complianceLevel: string; + comment: string; + }; + }; + success: boolean; + nbBestPracticesToCorrect: number; + // format: 30/11/2022 15:41:57 + date: string; + pageInformations: { url: string }; + tryNb: number; + tabId: number; + index: number; +}; diff --git a/modules/common/src/report/lighthouse/LighthouseReport.ts b/modules/common/src/report/lighthouse/LighthouseReport.ts index 4c525335..ef7fdee1 100644 --- a/modules/common/src/report/lighthouse/LighthouseReport.ts +++ b/modules/common/src/report/lighthouse/LighthouseReport.ts @@ -1,14 +1,17 @@ -import type { Result } from "lighthouse" -import { logger, type ValidatedAnalysisInput } from "../../index.js" -import type { Service } from "../../service/Service.js" -import type { GenericReport, ReportArguments } from "../Report.js" -import type { LighthouseResult } from "./LighthouseResult.js" +import type { Result } from "lighthouse"; +import { logger, type ValidatedAnalysisInput } from "../../index.js"; +import type { Service } from "../../service/Service.js"; +import type { GenericReport, ReportArguments } from "../Report.js"; +import type { LighthouseResult } from "./LighthouseResult.js"; -const compute = (categories: Record, fractionDigits?: number): number => { - const avgScore = computeCategories(categories) +const compute = ( + categories: Record, + fractionDigits?: number, +): number => { + const avgScore = computeCategories(categories); - return normalize(avgScore, fractionDigits) -} + return normalize(avgScore, fractionDigits); +}; /** * Calculate the average score for every categories @@ -16,24 +19,26 @@ const compute = (categories: Record, fractionDigits?: n * * @returns Average score (between 0 and 1) accross all category */ -function computeCategories(categories: Record): number { - const categoriesName = Object.keys(categories) - const categoriesNameWithScore = categoriesName.filter( - (categoryName) => null !== categories[categoryName].score - ) - - if (categoriesName.length > categoriesNameWithScore.length) { - logger.warn( - `Some Lighthouse categories does not have a score. Consequently, they will not be taken into account for the computation of the average score.` - ) - } - - const sumScores = categoriesNameWithScore.reduce( - (acc, categoryName) => acc + (categories[categoryName].score ?? 0), - 0 - ) - - return sumScores / categoriesName.length +function computeCategories( + categories: Record, +): number { + const categoriesName = Object.keys(categories); + const categoriesNameWithScore = categoriesName.filter( + (categoryName) => null !== categories[categoryName].score, + ); + + if (categoriesName.length > categoriesNameWithScore.length) { + logger.warn( + "Some Lighthouse categories does not have a score. Consequently, they will not be taken into account for the computation of the average score.", + ); + } + + const sumScores = categoriesNameWithScore.reduce( + (acc, categoryName) => acc + (categories[categoryName].score ?? 0), + 0, + ); + + return sumScores / categoriesName.length; } /** @@ -41,70 +46,79 @@ function computeCategories(categories: Record): number * @param avgScore Score between 0 and 1 */ function normalize(avgScore: number, fractionDigits?: number): number { - return parseFloat((100 * avgScore).toFixed(fractionDigits)) + return Number.parseFloat((100 * avgScore).toFixed(fractionDigits)); } export class LighthouseReport implements GenericReport { - #analyzedUrl: string - #date: Date - #grade: string - #normalizedGrade: number - #result: LighthouseResult - #resultUrl: string | undefined - #service: Service - #inputs: Pick - - constructor({ analyzedUrl, date, result, resultUrl, service, inputs }: ReportArguments) { - this.#analyzedUrl = analyzedUrl - this.#date = date - this.#result = result - this.#resultUrl = resultUrl - this.#service = service - this.#inputs = inputs - - this.#normalizedGrade = compute(this.#result.categories) - this.#grade = this.#normalizedGrade.toString() - } - - get analyzedUrl(): string { - return this.#analyzedUrl - } - - get date(): Date { - return this.#date - } - - get grade(): string { - return this.#grade - } - - get normalizedGrade(): number { - return this.#normalizedGrade - } - - get result(): LighthouseResult { - return this.#result - } - - get resultUrl(): string | undefined { - return this.#resultUrl - } - - get service(): Service { - return this.#service - } - - get inputs(): Pick { - return this.#inputs - } - - displayGrade(): string { - return this.normalizedGrade.toString() === this.grade - ? `${this.grade}/100` - : `${this.grade} (${this.normalizedGrade}/100)` - } - - isThresholdReached(): boolean | undefined { - return this.inputs.threshold !== undefined ? this.normalizedGrade >= this.inputs.threshold : undefined - } + #analyzedUrl: string; + #date: Date; + #grade: string; + #normalizedGrade: number; + #result: LighthouseResult; + #resultUrl: string | undefined; + #service: Service; + #inputs: Pick; + + constructor({ + analyzedUrl, + date, + result, + resultUrl, + service, + inputs, + }: ReportArguments) { + this.#analyzedUrl = analyzedUrl; + this.#date = date; + this.#result = result; + this.#resultUrl = resultUrl; + this.#service = service; + this.#inputs = inputs; + + this.#normalizedGrade = compute(this.#result.categories); + this.#grade = this.#normalizedGrade.toString(); + } + + get analyzedUrl(): string { + return this.#analyzedUrl; + } + + get date(): Date { + return this.#date; + } + + get grade(): string { + return this.#grade; + } + + get normalizedGrade(): number { + return this.#normalizedGrade; + } + + get result(): LighthouseResult { + return this.#result; + } + + get resultUrl(): string | undefined { + return this.#resultUrl; + } + + get service(): Service { + return this.#service; + } + + get inputs(): Pick { + return this.#inputs; + } + + displayGrade(): string { + return this.normalizedGrade.toString() === this.grade + ? `${this.grade}/100` + : `${this.grade} (${this.normalizedGrade}/100)`; + } + + isThresholdReached(): boolean | undefined { + return this.inputs.threshold !== undefined + ? this.normalizedGrade >= this.inputs.threshold + : undefined; + } } diff --git a/modules/common/src/report/lighthouse/LighthouseResult.ts b/modules/common/src/report/lighthouse/LighthouseResult.ts index 73bc57ec..06ec77be 100644 --- a/modules/common/src/report/lighthouse/LighthouseResult.ts +++ b/modules/common/src/report/lighthouse/LighthouseResult.ts @@ -1,4 +1,4 @@ -import type { Result } from "lighthouse" -import type { Result as R } from "../Result.js" +import type { Result } from "lighthouse"; +import type { Result as R } from "../Result.js"; -export type LighthouseResult = R & Result +export type LighthouseResult = R & Result; diff --git a/modules/common/src/report/observatory/ObservatoryReport.ts b/modules/common/src/report/observatory/ObservatoryReport.ts index 62b83ce1..145b571e 100644 --- a/modules/common/src/report/observatory/ObservatoryReport.ts +++ b/modules/common/src/report/observatory/ObservatoryReport.ts @@ -1,64 +1,73 @@ -import type { ValidatedAnalysisInput } from "../../index.js" -import type { Service } from "../../service/Service.js" -import type { GenericReport, ReportArguments } from "../Report.js" -import type { ObservatoryResult } from "./ObservatoryResult.js" +import type { ValidatedAnalysisInput } from "../../index.js"; +import type { Service } from "../../service/Service.js"; +import type { GenericReport, ReportArguments } from "../Report.js"; +import type { ObservatoryResult } from "./ObservatoryResult.js"; export class ObservatoryReport implements GenericReport { - #analyzedUrl: string - #date: Date - #result: ObservatoryResult - #resultUrl: string | undefined - #service: Service - #inputs: Pick + #analyzedUrl: string; + #date: Date; + #result: ObservatoryResult; + #resultUrl: string | undefined; + #service: Service; + #inputs: Pick; - constructor({ analyzedUrl, date, result, resultUrl, service, inputs }: ReportArguments) { - this.#analyzedUrl = analyzedUrl - this.#date = date - this.#result = result - this.#resultUrl = resultUrl - this.#service = service - this.#inputs = inputs - } + constructor({ + analyzedUrl, + date, + result, + resultUrl, + service, + inputs, + }: ReportArguments) { + this.#analyzedUrl = analyzedUrl; + this.#date = date; + this.#result = result; + this.#resultUrl = resultUrl; + this.#service = service; + this.#inputs = inputs; + } - get analyzedUrl(): string { - return this.#analyzedUrl - } + get analyzedUrl(): string { + return this.#analyzedUrl; + } - get date(): Date { - return this.#date - } + get date(): Date { + return this.#date; + } - get grade(): string { - return this.#result.scan.grade - } + get grade(): string { + return this.#result.scan.grade; + } - get normalizedGrade(): number { - return this.#result.scan.score - } + get normalizedGrade(): number { + return this.#result.scan.score; + } - get result(): ObservatoryResult { - return this.#result - } + get result(): ObservatoryResult { + return this.#result; + } - get resultUrl(): string | undefined { - return this.#resultUrl - } + get resultUrl(): string | undefined { + return this.#resultUrl; + } - get service(): Service { - return this.#service - } + get service(): Service { + return this.#service; + } - get inputs(): Pick { - return this.#inputs - } + get inputs(): Pick { + return this.#inputs; + } - displayGrade(): string { - return this.normalizedGrade.toString() === this.grade - ? `${this.grade}/100` - : `${this.grade} (${this.normalizedGrade}/100)` - } + displayGrade(): string { + return this.normalizedGrade.toString() === this.grade + ? `${this.grade}/100` + : `${this.grade} (${this.normalizedGrade}/100)`; + } - isThresholdReached(): boolean | undefined { - return this.inputs.threshold !== undefined ? this.normalizedGrade >= this.inputs.threshold : undefined - } + isThresholdReached(): boolean | undefined { + return this.inputs.threshold !== undefined + ? this.normalizedGrade >= this.inputs.threshold + : undefined; + } } diff --git a/modules/common/src/report/observatory/ObservatoryResult.ts b/modules/common/src/report/observatory/ObservatoryResult.ts index 14d98765..b249b09c 100644 --- a/modules/common/src/report/observatory/ObservatoryResult.ts +++ b/modules/common/src/report/observatory/ObservatoryResult.ts @@ -1,8 +1,8 @@ -import type { Result } from "../Result.js" -import type { ObservatoryScan } from "./model/ObservatoryScan.js" -import type { ObservatoryTests } from "./model/ObservatoryTests.js" +import type { Result } from "../Result.js"; +import type { ObservatoryScan } from "./model/ObservatoryScan.js"; +import type { ObservatoryTests } from "./model/ObservatoryTests.js"; export type ObservatoryResult = Result & { - scan: ObservatoryScan - tests: ObservatoryTests -} + scan: ObservatoryScan; + tests: ObservatoryTests; +}; diff --git a/modules/common/src/report/observatory/enum/ObservatoryScanState.ts b/modules/common/src/report/observatory/enum/ObservatoryScanState.ts index 64cdd37a..9b6eb985 100644 --- a/modules/common/src/report/observatory/enum/ObservatoryScanState.ts +++ b/modules/common/src/report/observatory/enum/ObservatoryScanState.ts @@ -3,10 +3,10 @@ * @see {@link https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/api.md#scanner-state} */ export enum ObservatoryScanState { - ABORTED = "ABORTED", - FAILED = "FAILED", - FINISHED = "FINISHED", - PENDING = "PENDING", - STARTING = "STARTING", - RUNNING = "RUNNING", + ABORTED = "ABORTED", + FAILED = "FAILED", + FINISHED = "FINISHED", + PENDING = "PENDING", + STARTING = "STARTING", + RUNNING = "RUNNING", } diff --git a/modules/common/src/report/observatory/model/ObservatoryScan.ts b/modules/common/src/report/observatory/model/ObservatoryScan.ts index 83167fa9..142cd627 100644 --- a/modules/common/src/report/observatory/model/ObservatoryScan.ts +++ b/modules/common/src/report/observatory/model/ObservatoryScan.ts @@ -1,42 +1,42 @@ -import type { ObservatoryScanState } from "../enum/ObservatoryScanState.js" +import type { ObservatoryScanState } from "../enum/ObservatoryScanState.js"; /** * @see {@link https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/api.md#scan} */ export interface ObservatoryScan { - // timestamp for when the scan completed - end_time: string + // timestamp for when the scan completed + end_time: string; - // final grade assessed upon a completed scan - grade: string + // final grade assessed upon a completed scan + grade: string; - // whether the scan results are unlisted on the recent results page - hidden: boolean + // whether the scan results are unlisted on the recent results page + hidden: boolean; - // the entirety of the HTTP response headers - response_headers: object + // the entirety of the HTTP response headers + response_headers: object; - // unique ID number assigned to the scan - scan_id: number + // unique ID number assigned to the scan + scan_id: number; - // final score assessed upon a completed (FINISHED) scan - score: number + // final score assessed upon a completed (FINISHED) scan + score: number; - // Mozilla risk likelihod indicator that is the equivalent of the grade (https://wiki.mozilla.org/Security/Standard_Levels) - likelihood_indicator: string + // Mozilla risk likelihod indicator that is the equivalent of the grade (https://wiki.mozilla.org/Security/Standard_Levels) + likelihood_indicator: string; - // timestamp for when the scan was first requested - start_time: string + // timestamp for when the scan was first requested + start_time: string; - // the current state of the scan (https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/api.md#scanner-state) - state: ObservatoryScanState + // the current state of the scan (https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/api.md#scanner-state) + state: ObservatoryScanState; - // the number of subtests that were assigned a fail result - tests_failed: number + // the number of subtests that were assigned a fail result + tests_failed: number; - // the number of subtests that were assigned a passing result - tests_passed: number + // the number of subtests that were assigned a passing result + tests_passed: number; - // the total number of tests available and assessed at the time of the scan - tests_quantity: number + // the total number of tests available and assessed at the time of the scan + tests_quantity: number; } diff --git a/modules/common/src/report/observatory/model/ObservatoryTests.ts b/modules/common/src/report/observatory/model/ObservatoryTests.ts index 2de6bbe9..35f13a6c 100644 --- a/modules/common/src/report/observatory/model/ObservatoryTests.ts +++ b/modules/common/src/report/observatory/model/ObservatoryTests.ts @@ -2,33 +2,33 @@ * @see {@link https://github.com/mozilla/http-observatory/blob/master/httpobs/docs/api.md#tests} */ export type ObservatoryTests = Record< - string, - { - // the expectation for a test result going in - expectation: string + string, + { + // the expectation for a test result going in + expectation: string; - // the name of the test; this should be the same as the parent object's name - name: string + // the name of the test; this should be the same as the parent object's name + name: string; - // artifacts related to the test; these can vary widely between tests and are not guaranteed to be stable over time. - output: { - // generally as close to the raw output of the test as is possible. For example, in the strict-transport-security test, output -> data contains the raw Strict-Transport-Security header - data: Record + // artifacts related to the test; these can vary widely between tests and are not guaranteed to be stable over time. + output: { + // generally as close to the raw output of the test as is possible. For example, in the strict-transport-security test, output -> data contains the raw Strict-Transport-Security header + data: Record; - // ???? other values under output have keys that vary; for example, the strict-transport-security test has a includeSubDomains key that is either set to True or False. Similarly, the redirection test contains a route key that contains an array of the URLs that were redirected to. See example below for more available keys. - [key: string]: object - } + // ???? other values under output have keys that vary; for example, the strict-transport-security test has a includeSubDomains key that is either set to True or False. Similarly, the redirection test contains a route key that contains an array of the URLs that were redirected to. See example below for more available keys. + [key: string]: object; + }; - // whether the test passed or failed; a test that meets or exceeds the expectation will be marked as passed - pass: boolean + // whether the test passed or failed; a test that meets or exceeds the expectation will be marked as passed + pass: boolean; - // result of the test - result: string + // result of the test + result: string; - // short description describing what result means - score_description: string + // short description describing what result means + score_description: string; - // how much the result of the test affected the final score; should range between +5 and -50 - score_modifier: number - } -> + // how much the result of the test affected the final score; should range between +5 and -50 + score_modifier: number; + } +>; diff --git a/modules/common/src/report/ssllabs-server/SsllabsServerReport.ts b/modules/common/src/report/ssllabs-server/SsllabsServerReport.ts index fd6fcea2..e9f05372 100644 --- a/modules/common/src/report/ssllabs-server/SsllabsServerReport.ts +++ b/modules/common/src/report/ssllabs-server/SsllabsServerReport.ts @@ -1,118 +1,123 @@ -import type { ValidatedAnalysisInput } from "../../index.js" -import type { Service } from "../../service/Service.js" -import type { GenericReport, ReportArguments } from "../Report.js" -import type { SsllabsServerGrade } from "./enum/SsllabsServerGrade.js" -import type { SsllabsServerEndpoint } from "./model/SsllabsServerEndpoint.js" -import type { SsllabsServerResult } from "./model/SsllabsServerResult.js" +import type { ValidatedAnalysisInput } from "../../index.js"; +import type { Service } from "../../service/Service.js"; +import type { GenericReport, ReportArguments } from "../Report.js"; +import type { SsllabsServerGrade } from "./enum/SsllabsServerGrade.js"; +import type { SsllabsServerEndpoint } from "./model/SsllabsServerEndpoint.js"; +import type { SsllabsServerResult } from "./model/SsllabsServerResult.js"; /** * @see [Documentation ('grade' property)]{@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#endpoint} */ const TRANSFORM_TABLE: { [key in SsllabsServerGrade]: number } = { - "A+": 95, // equal repartition of the A grades (A+, A, A-) between 80 and 100 - A: 90, - "A-": 85, - B: 72.5, // average between 65 and 80 - C: 57.5, // average between 50 and 65 - D: 42.5, // average between 35 and 50 - E: 27.5, // average between 20 and 35 - F: 10, // average between 0 and 20 - T: 0, - M: 0, -} + "A+": 95, // equal repartition of the A grades (A+, A, A-) between 80 and 100 + A: 90, + "A-": 85, + B: 72.5, // average between 65 and 80 + C: 57.5, // average between 50 and 65 + D: 42.5, // average between 35 and 50 + E: 27.5, // average between 20 and 35 + F: 10, // average between 0 and 20 + T: 0, + M: 0, +}; /** * Transform a grade (A+, A, A-, B, C...) into a percentage (number between 0 and 100) * @see [Methodology]{@link https://github.com/ssllabs/research/wiki/SSL-Server-Rating-Guide#methodology-overview} */ -const transformGradeIntoPercentage = (grade: keyof typeof SsllabsServerGrade): number => { - return TRANSFORM_TABLE[grade] -} +const transformGradeIntoPercentage = ( + grade: keyof typeof SsllabsServerGrade, +): number => { + return TRANSFORM_TABLE[grade]; +}; const computeEndpoints = (endpoints: SsllabsServerEndpoint[]): number => { - const grades = endpoints.map((endpoint: SsllabsServerEndpoint) => - transformGradeIntoPercentage(endpoint.grade) - ) + const grades = endpoints.map((endpoint: SsllabsServerEndpoint) => + transformGradeIntoPercentage(endpoint.grade), + ); - if (0 === grades.length) { - return 0 - } + if (0 === grades.length) { + return 0; + } - const sumGrades = grades.reduce( - (previousValue: number, currentValue: number) => previousValue + currentValue - ) + const sumGrades = grades.reduce( + (previousValue: number, currentValue: number) => + previousValue + currentValue, + ); - return sumGrades / grades.length -} + return sumGrades / grades.length; +}; export class SsllabsServerReport implements GenericReport { - #analyzedUrl: string - #date: Date - #grade: string - #normalizedGrade: number - #result: SsllabsServerResult - #resultUrl: string | undefined - #service: Service - #inputs: Pick - - constructor({ - analyzedUrl, - date, - result, - resultUrl, - service, - inputs, - }: ReportArguments) { - this.#analyzedUrl = analyzedUrl - this.#date = date - this.#result = result - this.#resultUrl = resultUrl - this.#service = service - this.#inputs = inputs - - this.#normalizedGrade = computeEndpoints(this.#result.endpoints) - this.#grade = this.#normalizedGrade.toString() - } - - get analyzedUrl(): string { - return this.#analyzedUrl - } - - get date(): Date { - return this.#date - } - - get grade(): string { - return this.#grade - } - - get normalizedGrade(): number { - return this.#normalizedGrade - } - - get result(): SsllabsServerResult { - return this.#result - } - - get resultUrl(): string | undefined { - return this.#resultUrl - } - - get service(): Service { - return this.#service - } - - get inputs(): Pick { - return this.#inputs - } - - displayGrade(): string { - return this.normalizedGrade.toString() === this.grade - ? `${this.grade}/100` - : `${this.grade} (${this.normalizedGrade}/100)` - } - - isThresholdReached(): boolean | undefined { - return this.inputs.threshold !== undefined ? this.normalizedGrade >= this.inputs.threshold : undefined - } + #analyzedUrl: string; + #date: Date; + #grade: string; + #normalizedGrade: number; + #result: SsllabsServerResult; + #resultUrl: string | undefined; + #service: Service; + #inputs: Pick; + + constructor({ + analyzedUrl, + date, + result, + resultUrl, + service, + inputs, + }: ReportArguments) { + this.#analyzedUrl = analyzedUrl; + this.#date = date; + this.#result = result; + this.#resultUrl = resultUrl; + this.#service = service; + this.#inputs = inputs; + + this.#normalizedGrade = computeEndpoints(this.#result.endpoints); + this.#grade = this.#normalizedGrade.toString(); + } + + get analyzedUrl(): string { + return this.#analyzedUrl; + } + + get date(): Date { + return this.#date; + } + + get grade(): string { + return this.#grade; + } + + get normalizedGrade(): number { + return this.#normalizedGrade; + } + + get result(): SsllabsServerResult { + return this.#result; + } + + get resultUrl(): string | undefined { + return this.#resultUrl; + } + + get service(): Service { + return this.#service; + } + + get inputs(): Pick { + return this.#inputs; + } + + displayGrade(): string { + return this.normalizedGrade.toString() === this.grade + ? `${this.grade}/100` + : `${this.grade} (${this.normalizedGrade}/100)`; + } + + isThresholdReached(): boolean | undefined { + return this.inputs.threshold !== undefined + ? this.normalizedGrade >= this.inputs.threshold + : undefined; + } } diff --git a/modules/common/src/report/ssllabs-server/enum/SsllabsServerGrade.ts b/modules/common/src/report/ssllabs-server/enum/SsllabsServerGrade.ts index 880da72d..80b93f48 100644 --- a/modules/common/src/report/ssllabs-server/enum/SsllabsServerGrade.ts +++ b/modules/common/src/report/ssllabs-server/enum/SsllabsServerGrade.ts @@ -2,14 +2,14 @@ * @see [Documentation ('grade' property)]{@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#endpoint} */ export enum SsllabsServerGrade { - "A+" = "A+", - A = "A", - "A-" = "A-", - B = "B", - C = "C", - D = "D", - E = "E", - F = "F", - T = "T", - M = "M", + "A+" = "A+", + A = "A", + "A-" = "A-", + B = "B", + C = "C", + D = "D", + E = "E", + F = "F", + T = "T", + M = "M", } diff --git a/modules/common/src/report/ssllabs-server/enum/SsllabsServerStatus.ts b/modules/common/src/report/ssllabs-server/enum/SsllabsServerStatus.ts index 49a23473..7cded174 100644 --- a/modules/common/src/report/ssllabs-server/enum/SsllabsServerStatus.ts +++ b/modules/common/src/report/ssllabs-server/enum/SsllabsServerStatus.ts @@ -2,8 +2,8 @@ * @see [Documentation ('status' property)]{@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#host} */ export enum SsllabsServerStatus { - DNS = "DNS", - ERROR = "ERROR", - IN_PROGRESS = "IN_PROGRESS", - READY = "READY", + DNS = "DNS", + ERROR = "ERROR", + IN_PROGRESS = "IN_PROGRESS", + READY = "READY", } diff --git a/modules/common/src/report/ssllabs-server/model/SsllabsServerEndpoint.ts b/modules/common/src/report/ssllabs-server/model/SsllabsServerEndpoint.ts index 0da31191..94a56b32 100644 --- a/modules/common/src/report/ssllabs-server/model/SsllabsServerEndpoint.ts +++ b/modules/common/src/report/ssllabs-server/model/SsllabsServerEndpoint.ts @@ -1,27 +1,27 @@ -import type { SsllabsServerGrade } from "../enum/SsllabsServerGrade.js" +import type { SsllabsServerGrade } from "../enum/SsllabsServerGrade.js"; /** * @see [Documentation]{@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#endpoint} */ export interface SsllabsServerEndpoint { - ipAddress: string - serverName: string - statusMessage: string - statusDetails: string - statusDetailsMessage: string - grade: SsllabsServerGrade - gradeTrustIgnored?: SsllabsServerGrade - futureGrade: string | null - hasWarnings: string - isExceptional?: string - progress: number - duration: number - eta: number - delegation: number - /** - * this field contains an EndpointDetails object. - * It's not present by default, but can be enabled by using the "all" parameter to the analyze API call. - * @see [Documentation]{@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#endpointdetails } - */ - details?: unknown + ipAddress: string; + serverName: string; + statusMessage: string; + statusDetails: string; + statusDetailsMessage: string; + grade: SsllabsServerGrade; + gradeTrustIgnored?: SsllabsServerGrade; + futureGrade: string | null; + hasWarnings: string; + isExceptional?: string; + progress: number; + duration: number; + eta: number; + delegation: number; + /** + * this field contains an EndpointDetails object. + * It's not present by default, but can be enabled by using the "all" parameter to the analyze API call. + * @see [Documentation]{@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#endpointdetails } + */ + details?: unknown; } diff --git a/modules/common/src/report/ssllabs-server/model/SsllabsServerResult.ts b/modules/common/src/report/ssllabs-server/model/SsllabsServerResult.ts index 62ba763f..80daf116 100644 --- a/modules/common/src/report/ssllabs-server/model/SsllabsServerResult.ts +++ b/modules/common/src/report/ssllabs-server/model/SsllabsServerResult.ts @@ -1,20 +1,20 @@ -import type { Result } from "../../Result.js" -import type { SsllabsServerStatus } from "../enum/SsllabsServerStatus.js" -import type { SsllabsServerEndpoint } from "./SsllabsServerEndpoint.js" +import type { Result } from "../../Result.js"; +import type { SsllabsServerStatus } from "../enum/SsllabsServerStatus.js"; +import type { SsllabsServerEndpoint } from "./SsllabsServerEndpoint.js"; /** * @see [Documentation]{@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#host} */ export type SsllabsServerResult = Result & { - host: string - port: number - protocol: string - isPublic: boolean - status: SsllabsServerStatus - statusMessage: string - startTime: string - testTime: string - engineVersion: string - criteriaVersion: string - endpoints: SsllabsServerEndpoint[] -} + host: string; + port: number; + protocol: string; + isPublic: boolean; + status: SsllabsServerStatus; + statusMessage: string; + startTime: string; + testTime: string; + engineVersion: string; + criteriaVersion: string; + endpoints: SsllabsServerEndpoint[]; +}; diff --git a/modules/common/src/service/Service.ts b/modules/common/src/service/Service.ts index 95311074..fb0d53ad 100644 --- a/modules/common/src/service/Service.ts +++ b/modules/common/src/service/Service.ts @@ -3,13 +3,13 @@ * This data is common to the Report and Module models */ export interface Service { - /** - * Example: Mozilla Observatory - */ - readonly name: string + /** + * Example: Mozilla Observatory + */ + readonly name: string; - /** - * Public url to the logo - */ - readonly logoUrl?: string + /** + * Public url to the logo + */ + readonly logoUrl?: string; } diff --git a/modules/common/src/time/timeout.ts b/modules/common/src/time/timeout.ts index 6167b6cf..5d47d63c 100644 --- a/modules/common/src/time/timeout.ts +++ b/modules/common/src/time/timeout.ts @@ -2,5 +2,8 @@ * This is Promise wrapper of the setTimeout() function. */ export const timeout = (delay: number): Promise => - new Promise((resolve) => setTimeout(() => { - resolve() }, delay)) + new Promise((resolve) => + setTimeout(() => { + resolve(); + }, delay), + ); diff --git a/modules/common/src/validation/input/InputValidation.ts b/modules/common/src/validation/input/InputValidation.ts index 00d49085..34976875 100644 --- a/modules/common/src/validation/input/InputValidation.ts +++ b/modules/common/src/validation/input/InputValidation.ts @@ -1,6 +1,6 @@ -import Ajv, { type AnySchema } from "ajv" -import AjvErrors from "ajv-errors" -import { InputError } from "../../error/InputError.js" +import Ajv, { type AnySchema } from "ajv"; +import AjvErrors from "ajv-errors"; +import { InputError } from "../../error/InputError.js"; /** * Validate that the analysis options are correct. @@ -8,14 +8,17 @@ import { InputError } from "../../error/InputError.js" * * @throws {InputError} */ -export function validateInput(data: unknown, schema: AnySchema): ValidatedType { - const ajv = new Ajv.default({ allErrors: true }) - AjvErrors.default(ajv /*, {singleError: true} */) - const validate = ajv.compile(schema) +export function validateInput( + data: unknown, + schema: AnySchema, +): ValidatedType { + const ajv = new Ajv.default({ allErrors: true }); + AjvErrors.default(ajv /*, {singleError: true} */); + const validate = ajv.compile(schema); - if (!validate(data)) { - throw new InputError(validate.errors ?? []) - } + if (!validate(data)) { + throw new InputError(validate.errors ?? []); + } - return data as ValidatedType + return data as ValidatedType; } diff --git a/modules/common/src/validation/input/analysis/AnalysisInputValidation.ts b/modules/common/src/validation/input/analysis/AnalysisInputValidation.ts index 87af6d9a..d9bcdaa3 100644 --- a/modules/common/src/validation/input/analysis/AnalysisInputValidation.ts +++ b/modules/common/src/validation/input/analysis/AnalysisInputValidation.ts @@ -1,55 +1,58 @@ -import type { SchemaObject } from "ajv" -import type { ModuleMetadata, ValidatedAnalysisInput } from "../../../index.js" -import { validateInput } from "../InputValidation.js" -import configSchema from "./schema/config.json" with { type: "json" } -import thresholdSchema from "./schema/threshold.json" with { type: "json" } -import verboseSchema from "../schema/verbose.json" with { type: "json" } +import type { SchemaObject } from "ajv"; +import type { ModuleMetadata, ValidatedAnalysisInput } from "../../../index.js"; +import { validateInput } from "../InputValidation.js"; +import configSchema from "./schema/config.json" with { type: "json" }; +import thresholdSchema from "./schema/threshold.json" with { type: "json" }; +import verboseSchema from "../schema/verbose.json" with { type: "json" }; -export function getAnalysisValidationSchema(listenerModulesIds: ModuleMetadata["id"][]): SchemaObject { - const listenerSchema = { - type: "array", - items: { - type: "string", - pattern: "^" + listenerModulesIds.join("|") + "$", - }, - } +export function getAnalysisValidationSchema( + listenerModulesIds: ModuleMetadata["id"][], +): SchemaObject { + const listenerSchema = { + type: "array", + items: { + type: "string", + pattern: `^${listenerModulesIds.join("|")}$`, + }, + }; - return { - type: "object", - properties: { - config: configSchema, - threshold: thresholdSchema, - except_listeners: listenerSchema, - only_listeners: listenerSchema, - // @TODO do not expose this field in the API - verbose: verboseSchema, - }, - allOf: [ - // make the listener options mutually exclusive - { - not: { - type: "object", - required: ["except_listeners", "only_listeners"], - }, - errorMessage: "The except-listeners and only-listeners options cannot be used simultaneously", - }, - ], - required: ["config"], - additionalProperties: false, - // customize error messages with ajv-errors - errorMessage: { - properties: { - config: "config must be an object with at least 1 property", - except_listeners: `except-listeners must be a comma-separated list with at least one of the following values: ${listenerModulesIds.join( - "," - )}`, - only_listeners: `only-listeners must be a comma-separated list with at least one of the following values: ${listenerModulesIds.join( - "," - )}`, - threshold: "threshold should be a number between 0 and 100", - }, - }, - } + return { + type: "object", + properties: { + config: configSchema, + threshold: thresholdSchema, + except_listeners: listenerSchema, + only_listeners: listenerSchema, + // @TODO do not expose this field in the API + verbose: verboseSchema, + }, + allOf: [ + // make the listener options mutually exclusive + { + not: { + type: "object", + required: ["except_listeners", "only_listeners"], + }, + errorMessage: + "The except-listeners and only-listeners options cannot be used simultaneously", + }, + ], + required: ["config"], + additionalProperties: false, + // customize error messages with ajv-errors + errorMessage: { + properties: { + config: "config must be an object with at least 1 property", + except_listeners: `except-listeners must be a comma-separated list with at least one of the following values: ${listenerModulesIds.join( + ",", + )}`, + only_listeners: `only-listeners must be a comma-separated list with at least one of the following values: ${listenerModulesIds.join( + ",", + )}`, + threshold: "threshold should be a number between 0 and 100", + }, + }, + }; } /** @@ -59,10 +62,10 @@ export function getAnalysisValidationSchema(listenerModulesIds: ModuleMetadata[" * @throws {InputError} */ export function validateAnalysisInput( - data: unknown, - listenerModulesIds: ModuleMetadata["id"][] = [] + data: unknown, + listenerModulesIds: ModuleMetadata["id"][] = [], ): ValidatedAnalysisInput { - const schema = getAnalysisValidationSchema(listenerModulesIds) + const schema = getAnalysisValidationSchema(listenerModulesIds); - return validateInput(data, schema) + return validateInput(data, schema); } diff --git a/modules/common/src/validation/input/server/ServerInputValidation.ts b/modules/common/src/validation/input/server/ServerInputValidation.ts index 8205a80a..e08463f2 100644 --- a/modules/common/src/validation/input/server/ServerInputValidation.ts +++ b/modules/common/src/validation/input/server/ServerInputValidation.ts @@ -1,20 +1,20 @@ -import type { SchemaObject } from "ajv" -import type { ValidatedServerInput } from "../../../input/ServerInput.js" -import { validateInput } from "../InputValidation.js" -import corsSchema from "./schema/cors.json" with { type: "json" } -import portSchema from "./schema/port.json" with { type: "json" } -import verboseSchema from "../schema/verbose.json" with { type: "json" } +import type { SchemaObject } from "ajv"; +import type { ValidatedServerInput } from "../../../input/ServerInput.js"; +import { validateInput } from "../InputValidation.js"; +import corsSchema from "./schema/cors.json" with { type: "json" }; +import portSchema from "./schema/port.json" with { type: "json" }; +import verboseSchema from "../schema/verbose.json" with { type: "json" }; function getValidationSchema(): SchemaObject { - return { - type: "object", - properties: { - cors: corsSchema, - port: portSchema, - verbose: verboseSchema, - }, - additionalProperties: false, - } + return { + type: "object", + properties: { + cors: corsSchema, + port: portSchema, + verbose: verboseSchema, + }, + additionalProperties: false, + }; } /** @@ -24,7 +24,7 @@ function getValidationSchema(): SchemaObject { * @throws {InputError} */ export function validateServerInput(data: unknown): ValidatedServerInput { - const schema = getValidationSchema() + const schema = getValidationSchema(); - return validateInput(data, schema) + return validateInput(data, schema); } diff --git a/modules/common/tests/timeout.test.ts b/modules/common/tests/timeout.test.ts index e2d986ef..d520031f 100644 --- a/modules/common/tests/timeout.test.ts +++ b/modules/common/tests/timeout.test.ts @@ -1,12 +1,12 @@ -import { jest } from "@jest/globals" -import { timeout } from "../src/time/timeout.js" +import { jest } from "@jest/globals"; +import { timeout } from "../src/time/timeout.js"; -jest.useFakeTimers() -jest.spyOn(global, "setTimeout") +jest.useFakeTimers(); +jest.spyOn(global, "setTimeout"); it("should run a real timeout", () => { - void timeout(30) + void timeout(30); - expect(setTimeout).toHaveBeenCalledTimes(1) - expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 30) -}) + expect(setTimeout).toHaveBeenCalledTimes(1); + expect(setTimeout).toHaveBeenLastCalledWith(expect.any(Function), 30); +}); diff --git a/modules/common/tests/validation/input/analysis/AnalysisInputValidation.test.ts b/modules/common/tests/validation/input/analysis/AnalysisInputValidation.test.ts index 060dc029..1ef941e0 100644 --- a/modules/common/tests/validation/input/analysis/AnalysisInputValidation.test.ts +++ b/modules/common/tests/validation/input/analysis/AnalysisInputValidation.test.ts @@ -1,196 +1,196 @@ -import { InputError } from "../../../../src/error/InputError.js" -import type { ModuleMetadata } from "../../../../src/index.js" -import { validateAnalysisInput } from "../../../../src/validation/input/analysis/AnalysisInputValidation.js" +import { InputError } from "../../../../src/error/InputError.js"; +import type { ModuleMetadata } from "../../../../src/index.js"; +import { validateAnalysisInput } from "../../../../src/validation/input/analysis/AnalysisInputValidation.js"; describe("Invalid option combinations", () => { - test("Missing configuration", () => { - expect(() => { - validateAnalysisInput({}) - }).toThrow(InputError) - }) - - test("Both listener options", () => { - expect(() => { - validateAnalysisInput({ - config: { inline: "configuration" }, - except_listeners: [], - only_listeners: [], - }) - }).toThrow(InputError) - }) -}) + test("Missing configuration", () => { + expect(() => { + validateAnalysisInput({}); + }).toThrow(InputError); + }); + + test("Both listener options", () => { + expect(() => { + validateAnalysisInput({ + config: { inline: "configuration" }, + except_listeners: [], + only_listeners: [], + }); + }).toThrow(InputError); + }); +}); describe("Valid configuration value", () => { - test("JSON object with 1 property", () => { - const { config } = validateAnalysisInput({ config: { url: "" } }) - - expect(config).toStrictEqual({ url: "" }) - }) - - test("JSON object with several properties", () => { - const { config } = validateAnalysisInput({ - config: { - url: "https://heart.fabernovel.com/", - config: { - extends: "lighthouse:default", - settings: { - maxWaitForFcp: 15000, - maxWaitForLoad: 35000, - skipAudits: ["uses-http2", "bf-cache"], - }, - }, - }, - }) - - expect(config).toStrictEqual({ - url: "https://heart.fabernovel.com/", - config: { - extends: "lighthouse:default", - settings: { - maxWaitForFcp: 15000, - maxWaitForLoad: 35000, - skipAudits: ["uses-http2", "bf-cache"], - }, - }, - }) - }) -}) + test("JSON object with 1 property", () => { + const { config } = validateAnalysisInput({ config: { url: "" } }); + + expect(config).toStrictEqual({ url: "" }); + }); + + test("JSON object with several properties", () => { + const { config } = validateAnalysisInput({ + config: { + url: "https://heart.fabernovel.com/", + config: { + extends: "lighthouse:default", + settings: { + maxWaitForFcp: 15000, + maxWaitForLoad: 35000, + skipAudits: ["uses-http2", "bf-cache"], + }, + }, + }, + }); + + expect(config).toStrictEqual({ + url: "https://heart.fabernovel.com/", + config: { + extends: "lighthouse:default", + settings: { + maxWaitForFcp: 15000, + maxWaitForLoad: 35000, + skipAudits: ["uses-http2", "bf-cache"], + }, + }, + }); + }); +}); describe("Invalid configuration value", () => { - test("Array", () => { - expect(() => { - validateAnalysisInput({ config: [] }) - }).toThrow(InputError) - }) - - test("Empty JSON object", () => { - expect(() => { - validateAnalysisInput({ config: {} }) - }).toThrow(InputError) - }) - - test("Number", () => { - expect(() => { - validateAnalysisInput({ config: 2 }) - }).toThrow(InputError) - }) - - test("String", () => { - expect(() => { - validateAnalysisInput({ config: "" }) - }).toThrow(InputError) - }) -}) + test("Array", () => { + expect(() => { + validateAnalysisInput({ config: [] }); + }).toThrow(InputError); + }); + + test("Empty JSON object", () => { + expect(() => { + validateAnalysisInput({ config: {} }); + }).toThrow(InputError); + }); + + test("Number", () => { + expect(() => { + validateAnalysisInput({ config: 2 }); + }).toThrow(InputError); + }); + + test("String", () => { + expect(() => { + validateAnalysisInput({ config: "" }); + }).toThrow(InputError); + }); +}); describe("Invalid threshold value", () => { - test("Array", () => { - expect(() => { - validateAnalysisInput({ - config: { inline: "configuration" }, - threshold: [], - }) - }).toThrow(InputError) - }) - - test("JSON object", () => { - expect(() => { - validateAnalysisInput({ - config: { inline: "configuration" }, - threshold: {}, - }) - }).toThrow(InputError) - }) - - test("Number < 0", () => { - expect(() => { - validateAnalysisInput({ - config: { inline: "configuration" }, - threshold: -1, - }) - }).toThrow(InputError) - }) - - test("Number > 100", () => { - expect(() => { - validateAnalysisInput({ - config: { inline: "configuration" }, - threshold: 101, - }) - }).toThrow(InputError) - }) - - test("String", () => { - expect(() => { - validateAnalysisInput({ - config: { inline: "configuration" }, - threshold: "", - }) - }).toThrow(InputError) - }) -}) + test("Array", () => { + expect(() => { + validateAnalysisInput({ + config: { inline: "configuration" }, + threshold: [], + }); + }).toThrow(InputError); + }); + + test("JSON object", () => { + expect(() => { + validateAnalysisInput({ + config: { inline: "configuration" }, + threshold: {}, + }); + }).toThrow(InputError); + }); + + test("Number < 0", () => { + expect(() => { + validateAnalysisInput({ + config: { inline: "configuration" }, + threshold: -1, + }); + }).toThrow(InputError); + }); + + test("Number > 100", () => { + expect(() => { + validateAnalysisInput({ + config: { inline: "configuration" }, + threshold: 101, + }); + }).toThrow(InputError); + }); + + test("String", () => { + expect(() => { + validateAnalysisInput({ + config: { inline: "configuration" }, + threshold: "", + }); + }).toThrow(InputError); + }); +}); describe("Invalid listener options value", () => { - const modulesMetadata: ModuleMetadata[] = [ - { - id: "heart-test1", - type: "analysis", - name: "Heart Test1", - service: { name: "Test1" }, - }, - { - id: "heart-test2", - type: "analysis", - name: "Heart Test2", - service: { name: "Test2" }, - }, - ] - const modulesIds = modulesMetadata.map((moduleMetadata) => moduleMetadata.id) - - test("Exclude 1 module with an invalid id", () => { - expect(() => { - validateAnalysisInput( - { - config: { inline: "configuration" }, - except_listeners: ["invalid-module-id"], - }, - modulesIds - ) - }).toThrow(InputError) - }) - - test("Exclude 2 modules but set an invalid id for one of them", () => { - expect(() => { - validateAnalysisInput( - { - config: { inline: "configuration" }, - except_listeners: ["heart-test1", "invalid-module-id"], - }, - modulesIds - ) - }).toThrow(InputError) - }) - - test("Keep only 1 module with an invalid id", () => { - expect(() => { - validateAnalysisInput( - { - config: { inline: "configuration" }, - only_listeners: ["invalid-module-id"], - }, - modulesIds - ) - }).toThrow(InputError) - }) - - test("Keep 2 modules but set an invalid id for one of them", () => { - expect(() => { - validateAnalysisInput( - { - config: { inline: "configuration" }, - only_listeners: ["heart-test1", "invalid-module-id"], - }, - modulesIds - ) - }).toThrow(InputError) - }) -}) + const modulesMetadata: ModuleMetadata[] = [ + { + id: "heart-test1", + type: "analysis", + name: "Heart Test1", + service: { name: "Test1" }, + }, + { + id: "heart-test2", + type: "analysis", + name: "Heart Test2", + service: { name: "Test2" }, + }, + ]; + const modulesIds = modulesMetadata.map((moduleMetadata) => moduleMetadata.id); + + test("Exclude 1 module with an invalid id", () => { + expect(() => { + validateAnalysisInput( + { + config: { inline: "configuration" }, + except_listeners: ["invalid-module-id"], + }, + modulesIds, + ); + }).toThrow(InputError); + }); + + test("Exclude 2 modules but set an invalid id for one of them", () => { + expect(() => { + validateAnalysisInput( + { + config: { inline: "configuration" }, + except_listeners: ["heart-test1", "invalid-module-id"], + }, + modulesIds, + ); + }).toThrow(InputError); + }); + + test("Keep only 1 module with an invalid id", () => { + expect(() => { + validateAnalysisInput( + { + config: { inline: "configuration" }, + only_listeners: ["invalid-module-id"], + }, + modulesIds, + ); + }).toThrow(InputError); + }); + + test("Keep 2 modules but set an invalid id for one of them", () => { + expect(() => { + validateAnalysisInput( + { + config: { inline: "configuration" }, + only_listeners: ["heart-test1", "invalid-module-id"], + }, + modulesIds, + ); + }).toThrow(InputError); + }); +}); diff --git a/modules/common/tests/validation/input/server/ServerInputValidation.test.ts b/modules/common/tests/validation/input/server/ServerInputValidation.test.ts index 0276e9f4..c6015a0c 100644 --- a/modules/common/tests/validation/input/server/ServerInputValidation.test.ts +++ b/modules/common/tests/validation/input/server/ServerInputValidation.test.ts @@ -1,144 +1,152 @@ -import { InputError } from "../../../../src/error/InputError.js" -import { validateServerInput } from "../../../../src/validation/input/server/ServerInputValidation.js" +import { InputError } from "../../../../src/error/InputError.js"; +import { validateServerInput } from "../../../../src/validation/input/server/ServerInputValidation.js"; describe("Valid cors value", () => { - test("origin property with a string value", () => { - const options = { cors: { origin: "http://127.0..0.1:8080/" } } - const validatedData = validateServerInput(options) + test("origin property with a string value", () => { + const options = { cors: { origin: "http://127.0..0.1:8080/" } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("origin property with a boolean value", () => { - const options = { cors: { origin: true } } - const validatedData = validateServerInput(options) + test("origin property with a boolean value", () => { + const options = { cors: { origin: true } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("origin property with an string[] value", () => { - const options = { cors: { origin: ["http://127.0..0.1:8080/", "http://127.0..0.1:8888/"] } } - const validatedData = validateServerInput(options) + test("origin property with an string[] value", () => { + const options = { + cors: { origin: ["http://127.0..0.1:8080/", "http://127.0..0.1:8888/"] }, + }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("credentials property with a boolean value", () => { - const options = { cors: { credentials: true } } - const validatedData = validateServerInput(options) + test("credentials property with a boolean value", () => { + const options = { cors: { credentials: true } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("exposedHeaders property with a string value", () => { - const options = { cors: { exposedHeaders: "Content-Range,X-Content-Range" } } - const validatedData = validateServerInput(options) + test("exposedHeaders property with a string value", () => { + const options = { + cors: { exposedHeaders: "Content-Range,X-Content-Range" }, + }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("exposedHeaders property with an string[] value", () => { - const options = { cors: { exposedHeaders: ["Content-Range", "X-Content-Range"] } } - const validatedData = validateServerInput(options) + test("exposedHeaders property with an string[] value", () => { + const options = { + cors: { exposedHeaders: ["Content-Range", "X-Content-Range"] }, + }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("allowedHeaders property with a string value", () => { - const options = { cors: { allowedHeaders: "Content-Type,Authorization" } } - const validatedData = validateServerInput(options) + test("allowedHeaders property with a string value", () => { + const options = { cors: { allowedHeaders: "Content-Type,Authorization" } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("allowedHeaders property with an string[] value", () => { - const options = { cors: { allowedHeaders: ["Content-Type", "Authorization"] } } - const validatedData = validateServerInput(options) + test("allowedHeaders property with an string[] value", () => { + const options = { + cors: { allowedHeaders: ["Content-Type", "Authorization"] }, + }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("methods property with a string value", () => { - const options = { cors: { methods: "GET,PUT,POST" } } - const validatedData = validateServerInput(options) + test("methods property with a string value", () => { + const options = { cors: { methods: "GET,PUT,POST" } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("methods property with an string[] value", () => { - const options = { cors: { methods: ["GET", "PUT", "POST"] } } - const validatedData = validateServerInput(options) + test("methods property with an string[] value", () => { + const options = { cors: { methods: ["GET", "PUT", "POST"] } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("preflightContinue property with a boolean value", () => { - const options = { cors: { preflightContinue: true } } - const validatedData = validateServerInput(options) + test("preflightContinue property with a boolean value", () => { + const options = { cors: { preflightContinue: true } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("preflight property with a boolean value", () => { - const options = { cors: { preflight: true } } - const validatedData = validateServerInput(options) + test("preflight property with a boolean value", () => { + const options = { cors: { preflight: true } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("strictPreflight property with a boolean value", () => { - const options = { cors: { strictPreflight: true } } - const validatedData = validateServerInput(options) + test("strictPreflight property with a boolean value", () => { + const options = { cors: { strictPreflight: true } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) + expect(validatedData).toBe(options); + }); - test("hideOptionsRoute property with a boolean value", () => { - const options = { cors: { hideOptionsRoute: true } } - const validatedData = validateServerInput(options) + test("hideOptionsRoute property with a boolean value", () => { + const options = { cors: { hideOptionsRoute: true } }; + const validatedData = validateServerInput(options); - expect(validatedData).toBe(options) - }) -}) + expect(validatedData).toBe(options); + }); +}); describe("Invalid port value", () => { - test("Array", () => { - expect(() => { - validateServerInput({ - port: [], - }) - }).toThrow(InputError) - }) - - test("JSON object", () => { - expect(() => { - validateServerInput({ - port: {}, - }) - }).toThrow(InputError) - }) - - test("Number < 0", () => { - expect(() => { - validateServerInput({ - port: -1, - }) - }).toThrow(InputError) - }) - - test("Number > 65535", () => { - expect(() => { - validateServerInput({ - port: 65536, - }) - }).toThrow(InputError) - }) - - test("String", () => { - expect(() => { - validateServerInput({ - port: "", - }) - }).toThrow(InputError) - }) -}) + test("Array", () => { + expect(() => { + validateServerInput({ + port: [], + }); + }).toThrow(InputError); + }); + + test("JSON object", () => { + expect(() => { + validateServerInput({ + port: {}, + }); + }).toThrow(InputError); + }); + + test("Number < 0", () => { + expect(() => { + validateServerInput({ + port: -1, + }); + }).toThrow(InputError); + }); + + test("Number > 65535", () => { + expect(() => { + validateServerInput({ + port: 65536, + }); + }).toThrow(InputError); + }); + + test("String", () => { + expect(() => { + validateServerInput({ + port: "", + }); + }).toThrow(InputError); + }); +}); diff --git a/modules/greenit/src/@types/greenit-cli/cli-core/analysis.d.ts b/modules/greenit/src/@types/greenit-cli/cli-core/analysis.d.ts index 581e19f1..9b7d20ae 100644 --- a/modules/greenit/src/@types/greenit-cli/cli-core/analysis.d.ts +++ b/modules/greenit/src/@types/greenit-cli/cli-core/analysis.d.ts @@ -1,46 +1,46 @@ declare module "greenit-cli/cli-core/analysis.js" { - import { SizeNames } from "greenit-cli" - import { Browser } from "puppeteer" + import type { SizeNames } from "greenit-cli"; + import type { Browser } from "puppeteer"; - interface Action { - type: "click" | "text" | "select" | "scroll" - element: string - content: unknown - timeoutBefore: number - values: unknown - } + interface Action { + type: "click" | "text" | "select" | "scroll"; + element: string; + content: unknown; + timeoutBefore: number; + values: unknown; + } - interface PageInformation { - url: string - screenshot?: string - actions?: Action[] | { screenshot: string } - waitForSelector?: string - waitForXPath?: string - } + interface PageInformation { + url: string; + screenshot?: string; + actions?: Action[] | { screenshot: string }; + waitForSelector?: string; + waitForXPath?: string; + } - interface Options { - timeout?: number - max_tab?: number - retry?: number - device?: SizeNames - ci?: boolean - } + interface Options { + timeout?: number; + max_tab?: number; + retry?: number; + device?: SizeNames; + ci?: boolean; + } - interface Proxy { - user: string - password: string - } + interface Proxy { + user: string; + password: string; + } - interface Report { - name: string - path: string - } + interface Report { + name: string; + path: string; + } - export function createJsonReports( - browser: Browser, - pagesInformations: PageInformation[], - options: Options, - proxy?: Proxy, - headers?: Record - ): Promise + export function createJsonReports( + browser: Browser, + pagesInformations: PageInformation[], + options: Options, + proxy?: Proxy, + headers?: Record, + ): Promise; } diff --git a/modules/greenit/src/@types/greenit-cli/index.d.ts b/modules/greenit/src/@types/greenit-cli/index.d.ts index e9b0d084..8ee97ab0 100644 --- a/modules/greenit/src/@types/greenit-cli/index.d.ts +++ b/modules/greenit/src/@types/greenit-cli/index.d.ts @@ -1,11 +1,18 @@ declare module "greenit-cli" { - type SizeNames = "desktop" | "galaxyS9" | "galaxyS20" | "iPhone8" | "iPhone8Plus" | "iPhoneX" | "iPad" + type SizeNames = + | "desktop" + | "galaxyS9" + | "galaxyS20" + | "iPhone8" + | "iPhone8Plus" + | "iPhoneX" + | "iPad"; - export type sizes = { - [key in SizeNames]: { - width: number - height: number - isMobile: boolean - } - } + export type sizes = { + [key in SizeNames]: { + width: number; + height: number; + isMobile: boolean; + }; + }; } diff --git a/modules/greenit/src/GreenITModule.ts b/modules/greenit/src/GreenITModule.ts index 8a7c486b..469a348e 100644 --- a/modules/greenit/src/GreenITModule.ts +++ b/modules/greenit/src/GreenITModule.ts @@ -1,39 +1,57 @@ -import type { Config, GreenITConfig, ModuleMetadata } from "@fabernovel/heart-common" -import { GreenITReport, Module, logger, type ModuleAnalysisInterface } from "@fabernovel/heart-common" -import { requestResult } from "./api/Client.js" - -export class GreenITModule extends Module implements ModuleAnalysisInterface { - #threshold?: number - - constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { - super(moduleMetadata, verbose) - - if (verbose) { - logger.info(`${moduleMetadata.name} initialized.`) - } - } - - public async startAnalysis(config: GreenITConfig, threshold?: number): Promise { - this.#threshold = threshold - - const result = await requestResult(config) - - return this.#handleResult(config, result) - } - - #handleResult(config: Config, result: GreenITReport["result"]): GreenITReport { - const [date, time] = result.date.split(" ") - const [day, month, year] = date.split("/") - - return new GreenITReport({ - analyzedUrl: result.url, - date: new Date(`${year}-${month}-${day}T${time}`), - result: result, - service: this.service, - inputs: { - config: config, - threshold: this.#threshold, - }, - }) - } +import type { + Config, + GreenITConfig, + ModuleMetadata, +} from "@fabernovel/heart-common"; +import { + GreenITReport, + Module, + logger, + type ModuleAnalysisInterface, +} from "@fabernovel/heart-common"; +import { requestResult } from "./api/Client.js"; + +export class GreenITModule + extends Module + implements ModuleAnalysisInterface +{ + #threshold?: number; + + constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { + super(moduleMetadata, verbose); + + if (verbose) { + logger.info(`${moduleMetadata.name} initialized.`); + } + } + + public async startAnalysis( + config: GreenITConfig, + threshold?: number, + ): Promise { + this.#threshold = threshold; + + const result = await requestResult(config); + + return this.#handleResult(config, result); + } + + #handleResult( + config: Config, + result: GreenITReport["result"], + ): GreenITReport { + const [date, time] = result.date.split(" "); + const [day, month, year] = date.split("/"); + + return new GreenITReport({ + analyzedUrl: result.url, + date: new Date(`${year}-${month}-${day}T${time}`), + result: result, + service: this.service, + inputs: { + config: config, + threshold: this.#threshold, + }, + }); + } } diff --git a/modules/greenit/src/api/Client.ts b/modules/greenit/src/api/Client.ts index b036247d..17f24b75 100644 --- a/modules/greenit/src/api/Client.ts +++ b/modules/greenit/src/api/Client.ts @@ -1,68 +1,83 @@ -import type { GreenITConfig, GreenITReport } from "@fabernovel/heart-common" -import { createJsonReports, type Options, type Report } from "greenit-cli/cli-core/analysis.js" -import { readFileSync } from "node:fs" -import puppeteer from "puppeteer" +import type { GreenITConfig, GreenITReport } from "@fabernovel/heart-common"; +import { + createJsonReports, + type Options, + type Report, +} from "greenit-cli/cli-core/analysis.js"; +import { readFileSync } from "node:fs"; +import puppeteer from "puppeteer"; const DEFAULT_OPTIONS: Options = { - device: "desktop", - max_tab: 3, - retry: 2, - timeout: 3000, -} + device: "desktop", + max_tab: 3, + retry: 2, + timeout: 3000, +}; /** * @see {@link https://github.com/GoogleChrome/lighthouse/blob/main/docs/puppeteer.md#option-2-launch-chrome-with-lighthousechrome-launcher-and-handoff-to-puppeteer} */ -export async function requestResult(config: GreenITConfig): Promise { - const browser = await puppeteer.launch({ - // https://www.howtogeek.com/devops/how-to-run-puppeteer-and-headless-chrome-in-a-docker-container/#using-puppeteer-in-docker - args: ["--disable-gpu", "--disable-dev-shm-usage", "--disable-setuid-sandbox", "--no-sandbox"], - defaultViewport: null, - // https://developer.chrome.com/articles/new-headless/ - headless: "new", - }) +export async function requestResult( + config: GreenITConfig, +): Promise { + const browser = await puppeteer.launch({ + // https://www.howtogeek.com/devops/how-to-run-puppeteer-and-headless-chrome-in-a-docker-container/#using-puppeteer-in-docker + args: [ + "--disable-gpu", + "--disable-dev-shm-usage", + "--disable-setuid-sandbox", + "--no-sandbox", + ], + defaultViewport: null, + // https://developer.chrome.com/articles/new-headless/ + headless: "new", + }); + + const options: Options = { + ci: true, + device: config.device ?? DEFAULT_OPTIONS.device, + max_tab: DEFAULT_OPTIONS.max_tab, + retry: config.retry ?? DEFAULT_OPTIONS.retry, + timeout: config.timeout ?? DEFAULT_OPTIONS.timeout, + }; - const options: Options = { - ci: true, - device: config.device ?? DEFAULT_OPTIONS.device, - max_tab: DEFAULT_OPTIONS.max_tab, - retry: config.retry ?? DEFAULT_OPTIONS.retry, - timeout: config.timeout ?? DEFAULT_OPTIONS.timeout, - } + const reports = new Array(); - const reports = new Array() + // As the createJsonReports use console.* functions to display progress info and errors and do not send back these information, + // so we need to disable the console.* functions during this operation to handle the output ourselves. + const consoleLog = console.log; + const consoleError = console.error; - // As the createJsonReports use console.* functions to display progress info and errors and do not send back these information, - // so we need to disable the console.* functions during this operation to handle the output ourselves. - const consoleLog = console.log - const consoleError = console.error + try { + // eslint-disable-next-line @typescript-eslint/no-empty-function + console.log = () => {}; + // eslint-disable-next-line @typescript-eslint/no-empty-function + console.error = () => {}; - try { - // eslint-disable-next-line @typescript-eslint/no-empty-function - console.log = () => {} - // eslint-disable-next-line @typescript-eslint/no-empty-function - console.error = () => {} + const r = await createJsonReports(browser, [{ url: config.url }], options); - const r = await createJsonReports(browser, [{ url: config.url }], options) + reports.push(...r); + } catch (error) { + return Promise.reject(error); + } finally { + console.log = consoleLog; + console.error = consoleError; + const pages = await browser.pages(); + await Promise.all(pages.map((_) => _.close())); + await browser.close(); + } - reports.push(...r) - } catch (error) { - return Promise.reject(error) - } finally { - console.log = consoleLog - console.error = consoleError - const pages = await browser.pages() - await Promise.all(pages.map((_) => _.close())) - await browser.close() - } + if (0 === reports.length) { + return Promise.reject("No report has been generated"); + } - if (0 === reports.length) { - return Promise.reject("No report has been generated") - } else { - const result = JSON.parse(readFileSync(reports[0].path, { encoding: "utf-8" })) as GreenITReport["result"] + const result = JSON.parse( + readFileSync(reports[0].path, { encoding: "utf-8" }), + ) as GreenITReport["result"]; - return result.success - ? result - : Promise.reject("Error during GreenIT analysis. Increasing the timeout can be a solution") - } + return result.success + ? result + : Promise.reject( + "Error during GreenIT analysis. Increasing the timeout can be a solution", + ); } diff --git a/modules/greenit/src/index.ts b/modules/greenit/src/index.ts index 6fe3c9ec..70fc58f8 100644 --- a/modules/greenit/src/index.ts +++ b/modules/greenit/src/index.ts @@ -1,6 +1,9 @@ -import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" -import { GreenITModule } from "./GreenITModule.js" +import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common"; +import { GreenITModule } from "./GreenITModule.js"; -export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { - return new GreenITModule(moduleMetadata, verbose) -} +export const initialize: ModuleIndex["initialize"] = ( + moduleMetadata: ModuleMetadata, + verbose: boolean, +) => { + return new GreenITModule(moduleMetadata, verbose); +}; diff --git a/modules/greenit/tests/GreenITModule.test.ts b/modules/greenit/tests/GreenITModule.test.ts index a387cbc8..a220a75a 100644 --- a/modules/greenit/tests/GreenITModule.test.ts +++ b/modules/greenit/tests/GreenITModule.test.ts @@ -1,137 +1,156 @@ -import type { ModuleMetadata } from "@fabernovel/heart-common" -import { jest } from "@jest/globals" -import { Conf } from "./data/Conf.js" -import SuccessResult from "./data/SuccessResult.json" with { type: "json" } +import type { ModuleMetadata } from "@fabernovel/heart-common"; +import { jest } from "@jest/globals"; +import { Conf } from "./data/Conf.js"; +import SuccessResult from "./data/SuccessResult.json" with { type: "json" }; jest.unstable_mockModule("greenit-cli/cli-core/analysis.js", () => ({ - createJsonReports: jest.fn(), -})) -const { createJsonReports } = await import("greenit-cli/cli-core/analysis.js") -const mockedCreateJsonReports = jest.mocked(createJsonReports) + createJsonReports: jest.fn(), +})); +const { createJsonReports } = await import("greenit-cli/cli-core/analysis.js"); +const mockedCreateJsonReports = jest.mocked(createJsonReports); -const { GreenITModule } = await import("../src/GreenITModule.js") +const { GreenITModule } = await import("../src/GreenITModule.js"); describe("Run GreenIT analysis", () => { - it("should be able to launch a successful analysis without thresholds", async () => { - mockedCreateJsonReports.mockResolvedValue([ - { - path: new URL("./data/SuccessResult.json", import.meta.url).pathname, - name: "1.json", - }, - ]) - - const moduleConfig: ModuleMetadata = { - id: "1234", - type: "analysis", - name: "Green IT", - service: { - name: "Green IT", - logoUrl: "some-logo", - }, - } - - const module = new GreenITModule(moduleConfig, false) - const analysisReport = await module.startAnalysis(Conf) - - const [date, time] = SuccessResult.date.split(" ") - const [day, month, year] = date.split("/") - - expect(analysisReport).toHaveProperty("analyzedUrl", SuccessResult.url) - expect(analysisReport).toHaveProperty("date", new Date(`${year}-${month}-${day}T${time}`)) - expect(analysisReport).toHaveProperty("grade", SuccessResult.grade) - expect(analysisReport).toHaveProperty("normalizedGrade", SuccessResult.ecoIndex) - expect(analysisReport).toHaveProperty("service", moduleConfig.service) - expect(analysisReport).toHaveProperty("inputs", { config: Conf }) - }) - - it("should be able to handle a failed analysis", async () => { - mockedCreateJsonReports.mockResolvedValue([ - { - path: new URL("./data/ErrorResult.json", import.meta.url).pathname, - name: "1.json", - }, - ]) - - const moduleConfig: ModuleMetadata = { - id: "1234", - type: "analysis", - name: "Green IT", - service: { - name: "Green IT", - logoUrl: "some-logo", - }, - } - - const errorMessage = "Error during GreenIT analysis. Increasing the timeout can be a solution" - const module = new GreenITModule(moduleConfig, false) - - try { - await module.startAnalysis(Conf) - } catch (error) { - expect(error).toBe(errorMessage) - } - }) - - it("should be able to launch a successful analysis with thresholds", async () => { - mockedCreateJsonReports.mockResolvedValue([ - { - path: new URL("./data/SuccessResult.json", import.meta.url).pathname, - name: "1.json", - }, - ]) - - const moduleConfig: ModuleMetadata = { - id: "1234", - type: "analysis", - name: "Green IT", - service: { - name: "Green IT", - logoUrl: "some-logo", - }, - } - - const THRESHOLD = 30 - - const module = new GreenITModule(moduleConfig, false) - const analysisReport = await module.startAnalysis(Conf, THRESHOLD) - - expect(analysisReport).toHaveProperty("analyzedUrl", SuccessResult.url) - expect(analysisReport).toHaveProperty("date") - expect(analysisReport).toHaveProperty("grade", SuccessResult.grade) - expect(analysisReport).toHaveProperty("normalizedGrade", SuccessResult.ecoIndex) - expect(analysisReport).toHaveProperty("service", moduleConfig.service) - expect(analysisReport).toHaveProperty("inputs", { config: Conf, threshold: THRESHOLD }) - }) - - it("Should return false when results do not match thresholds objectives", async () => { - mockedCreateJsonReports.mockResolvedValue([ - { - path: new URL("./data/SuccessResult.json", import.meta.url).pathname, - name: "1.json", - }, - ]) - - const moduleConfig: ModuleMetadata = { - id: "1234", - type: "analysis", - name: "Green IT", - service: { - name: "Green IT", - logoUrl: "some-logo", - }, - } - - const THRESHOLD = 30 - - const module = new GreenITModule(moduleConfig, false) - const analysisReport = await module.startAnalysis(Conf, THRESHOLD) - - expect(analysisReport).toHaveProperty("analyzedUrl", SuccessResult.url) - expect(analysisReport).toHaveProperty("date") - expect(analysisReport).toHaveProperty("grade", SuccessResult.grade) - expect(analysisReport).toHaveProperty("normalizedGrade", SuccessResult.ecoIndex) - expect(analysisReport).toHaveProperty("service", moduleConfig.service) - expect(analysisReport).toHaveProperty("inputs", { config: Conf, threshold: THRESHOLD }) - expect(analysisReport.isThresholdReached()).toStrictEqual(false) - }) -}) + it("should be able to launch a successful analysis without thresholds", async () => { + mockedCreateJsonReports.mockResolvedValue([ + { + path: new URL("./data/SuccessResult.json", import.meta.url).pathname, + name: "1.json", + }, + ]); + + const moduleConfig: ModuleMetadata = { + id: "1234", + type: "analysis", + name: "Green IT", + service: { + name: "Green IT", + logoUrl: "some-logo", + }, + }; + + const module = new GreenITModule(moduleConfig, false); + const analysisReport = await module.startAnalysis(Conf); + + const [date, time] = SuccessResult.date.split(" "); + const [day, month, year] = date.split("/"); + + expect(analysisReport).toHaveProperty("analyzedUrl", SuccessResult.url); + expect(analysisReport).toHaveProperty( + "date", + new Date(`${year}-${month}-${day}T${time}`), + ); + expect(analysisReport).toHaveProperty("grade", SuccessResult.grade); + expect(analysisReport).toHaveProperty( + "normalizedGrade", + SuccessResult.ecoIndex, + ); + expect(analysisReport).toHaveProperty("service", moduleConfig.service); + expect(analysisReport).toHaveProperty("inputs", { config: Conf }); + }); + + it("should be able to handle a failed analysis", async () => { + mockedCreateJsonReports.mockResolvedValue([ + { + path: new URL("./data/ErrorResult.json", import.meta.url).pathname, + name: "1.json", + }, + ]); + + const moduleConfig: ModuleMetadata = { + id: "1234", + type: "analysis", + name: "Green IT", + service: { + name: "Green IT", + logoUrl: "some-logo", + }, + }; + + const errorMessage = + "Error during GreenIT analysis. Increasing the timeout can be a solution"; + const module = new GreenITModule(moduleConfig, false); + + try { + await module.startAnalysis(Conf); + } catch (error) { + expect(error).toBe(errorMessage); + } + }); + + it("should be able to launch a successful analysis with thresholds", async () => { + mockedCreateJsonReports.mockResolvedValue([ + { + path: new URL("./data/SuccessResult.json", import.meta.url).pathname, + name: "1.json", + }, + ]); + + const moduleConfig: ModuleMetadata = { + id: "1234", + type: "analysis", + name: "Green IT", + service: { + name: "Green IT", + logoUrl: "some-logo", + }, + }; + + const THRESHOLD = 30; + + const module = new GreenITModule(moduleConfig, false); + const analysisReport = await module.startAnalysis(Conf, THRESHOLD); + + expect(analysisReport).toHaveProperty("analyzedUrl", SuccessResult.url); + expect(analysisReport).toHaveProperty("date"); + expect(analysisReport).toHaveProperty("grade", SuccessResult.grade); + expect(analysisReport).toHaveProperty( + "normalizedGrade", + SuccessResult.ecoIndex, + ); + expect(analysisReport).toHaveProperty("service", moduleConfig.service); + expect(analysisReport).toHaveProperty("inputs", { + config: Conf, + threshold: THRESHOLD, + }); + }); + + it("Should return false when results do not match thresholds objectives", async () => { + mockedCreateJsonReports.mockResolvedValue([ + { + path: new URL("./data/SuccessResult.json", import.meta.url).pathname, + name: "1.json", + }, + ]); + + const moduleConfig: ModuleMetadata = { + id: "1234", + type: "analysis", + name: "Green IT", + service: { + name: "Green IT", + logoUrl: "some-logo", + }, + }; + + const THRESHOLD = 30; + + const module = new GreenITModule(moduleConfig, false); + const analysisReport = await module.startAnalysis(Conf, THRESHOLD); + + expect(analysisReport).toHaveProperty("analyzedUrl", SuccessResult.url); + expect(analysisReport).toHaveProperty("date"); + expect(analysisReport).toHaveProperty("grade", SuccessResult.grade); + expect(analysisReport).toHaveProperty( + "normalizedGrade", + SuccessResult.ecoIndex, + ); + expect(analysisReport).toHaveProperty("service", moduleConfig.service); + expect(analysisReport).toHaveProperty("inputs", { + config: Conf, + threshold: THRESHOLD, + }); + expect(analysisReport.isThresholdReached()).toStrictEqual(false); + }); +}); diff --git a/modules/greenit/tests/data/Conf.ts b/modules/greenit/tests/data/Conf.ts index 2e5967d2..98cf8c9f 100644 --- a/modules/greenit/tests/data/Conf.ts +++ b/modules/greenit/tests/data/Conf.ts @@ -1,7 +1,7 @@ -import type { GreenITConfig } from "@fabernovel/heart-common" +import type { GreenITConfig } from "@fabernovel/heart-common"; export const Conf: GreenITConfig = { - url: "https://fabernovel.com", - device: "iPhoneX", - timeout: 5000, -} + url: "https://fabernovel.com", + device: "iPhoneX", + timeout: 5000, +}; diff --git a/modules/lighthouse/src/LighthouseModule.ts b/modules/lighthouse/src/LighthouseModule.ts index 1e86a54e..c3322061 100644 --- a/modules/lighthouse/src/LighthouseModule.ts +++ b/modules/lighthouse/src/LighthouseModule.ts @@ -1,46 +1,52 @@ import { - LighthouseReport, - Module, - logger, - type Config, - type LighthouseConfig, - type ModuleAnalysisInterface, - type ModuleMetadata, -} from "@fabernovel/heart-common" -import { requestResult } from "./api/Client.js" + LighthouseReport, + Module, + logger, + type Config, + type LighthouseConfig, + type ModuleAnalysisInterface, + type ModuleMetadata, +} from "@fabernovel/heart-common"; +import { requestResult } from "./api/Client.js"; export class LighthouseModule - extends Module - implements ModuleAnalysisInterface + extends Module + implements ModuleAnalysisInterface { - #threshold?: number + #threshold?: number; - constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { - super(moduleMetadata, verbose) + constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { + super(moduleMetadata, verbose); - if (verbose) { - logger.info(`${moduleMetadata.name} initialized.`) - } - } + if (verbose) { + logger.info(`${moduleMetadata.name} initialized.`); + } + } - public async startAnalysis(config: LighthouseConfig, threshold?: number): Promise { - this.#threshold = threshold + public async startAnalysis( + config: LighthouseConfig, + threshold?: number, + ): Promise { + this.#threshold = threshold; - const result = await requestResult(config, this.verbose) + const result = await requestResult(config, this.verbose); - return this.#handleResult(config, result) - } + return this.#handleResult(config, result); + } - #handleResult(config: Config, result: LighthouseReport["result"]): LighthouseReport { - return new LighthouseReport({ - analyzedUrl: result.requestedUrl ?? "", - date: new Date(result.fetchTime), - result: result, - service: this.service, - inputs: { - config: config, - threshold: this.#threshold, - }, - }) - } + #handleResult( + config: Config, + result: LighthouseReport["result"], + ): LighthouseReport { + return new LighthouseReport({ + analyzedUrl: result.requestedUrl ?? "", + date: new Date(result.fetchTime), + result: result, + service: this.service, + inputs: { + config: config, + threshold: this.#threshold, + }, + }); + } } diff --git a/modules/lighthouse/src/api/Client.ts b/modules/lighthouse/src/api/Client.ts index 8f121bcd..42b9f5a1 100644 --- a/modules/lighthouse/src/api/Client.ts +++ b/modules/lighthouse/src/api/Client.ts @@ -1,36 +1,44 @@ -import type { LighthouseConfig, LighthouseReport } from "@fabernovel/heart-common" -import lighthouse from "lighthouse" -import puppeteer from "puppeteer" +import type { + LighthouseConfig, + LighthouseReport, +} from "@fabernovel/heart-common"; +import lighthouse from "lighthouse"; +import puppeteer from "puppeteer"; /** * @see {@link https://github.com/GoogleChrome/lighthouse/blob/main/docs/puppeteer.md#option-2-launch-chrome-with-lighthousechrome-launcher-and-handoff-to-puppeteer} */ export async function requestResult( - conf: LighthouseConfig, - verbose: boolean + conf: LighthouseConfig, + verbose: boolean, ): Promise { - const browser = await puppeteer.launch({ - // https://www.howtogeek.com/devops/how-to-run-puppeteer-and-headless-chrome-in-a-docker-container/#using-puppeteer-in-docker - args: ["--disable-gpu", "--disable-dev-shm-usage", "--disable-setuid-sandbox", "--no-sandbox"], - defaultViewport: null, - // https://developer.chrome.com/articles/new-headless/ - headless: "new", - }) - const page = await browser.newPage() + const browser = await puppeteer.launch({ + // https://www.howtogeek.com/devops/how-to-run-puppeteer-and-headless-chrome-in-a-docker-container/#using-puppeteer-in-docker + args: [ + "--disable-gpu", + "--disable-dev-shm-usage", + "--disable-setuid-sandbox", + "--no-sandbox", + ], + defaultViewport: null, + // https://developer.chrome.com/articles/new-headless/ + headless: "new", + }); + const page = await browser.newPage(); - const runnerResult = await lighthouse( - conf.url, - { output: "json", logLevel: verbose ? "info" : undefined }, - conf.config, - page - ) - if (undefined === runnerResult) { - return Promise.reject( - "The analysis run, but Lighthouse did not return any result. Try to start your analysis again." - ) - } + const runnerResult = await lighthouse( + conf.url, + { output: "json", logLevel: verbose ? "info" : undefined }, + conf.config, + page, + ); + if (undefined === runnerResult) { + return Promise.reject( + "The analysis run, but Lighthouse did not return any result. Try to start your analysis again.", + ); + } - await browser.close() + await browser.close(); - return { ...runnerResult.lhr } // hacky thing to fix weird typing error + return { ...runnerResult.lhr }; // hacky thing to fix weird typing error } diff --git a/modules/lighthouse/src/index.ts b/modules/lighthouse/src/index.ts index 3616b3a0..41f0338d 100644 --- a/modules/lighthouse/src/index.ts +++ b/modules/lighthouse/src/index.ts @@ -1,6 +1,9 @@ -import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" -import { LighthouseModule } from "./LighthouseModule.js" +import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common"; +import { LighthouseModule } from "./LighthouseModule.js"; -export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { - return new LighthouseModule(moduleMetadata, verbose) -} +export const initialize: ModuleIndex["initialize"] = ( + moduleMetadata: ModuleMetadata, + verbose: boolean, +) => { + return new LighthouseModule(moduleMetadata, verbose); +}; diff --git a/modules/lighthouse/tests/LighthouseModule.test.ts b/modules/lighthouse/tests/LighthouseModule.test.ts index ef95d830..9141450a 100644 --- a/modules/lighthouse/tests/LighthouseModule.test.ts +++ b/modules/lighthouse/tests/LighthouseModule.test.ts @@ -1,69 +1,71 @@ -import type { LighthouseReport } from "@fabernovel/heart-common" -import { jest } from "@jest/globals" -import { Conf } from "./data/Conf.js" +import type { LighthouseReport } from "@fabernovel/heart-common"; +import { jest } from "@jest/globals"; +import { Conf } from "./data/Conf.js"; const RESULT = { - categories: { - category1: { score: 0.95 }, - category2: { score: 0.9 }, - category3: { score: 0.95 }, - category4: { score: 0.9 }, - category5: { score: 0.8 }, - }, - requestedUrl: Conf.url, - fetchTime: 1584540399, -} as unknown as LighthouseReport["result"] // avoid the declaration of a huuuuuge object + categories: { + category1: { score: 0.95 }, + category2: { score: 0.9 }, + category3: { score: 0.95 }, + category4: { score: 0.9 }, + category5: { score: 0.8 }, + }, + requestedUrl: Conf.url, + fetchTime: 1584540399, +} as unknown as LighthouseReport["result"]; // avoid the declaration of a huuuuuge object jest.unstable_mockModule("../src/api/Client.js", () => ({ - requestResult: jest.fn<() => Promise>().mockResolvedValue(RESULT), -})) -const { requestResult } = await import("../src/api/Client.js") -const mockedRequestResult = jest.mocked(requestResult) + requestResult: jest + .fn<() => Promise>() + .mockResolvedValue(RESULT), +})); +const { requestResult } = await import("../src/api/Client.js"); +const mockedRequestResult = jest.mocked(requestResult); -const { LighthouseModule } = await import("../src/LighthouseModule.js") +const { LighthouseModule } = await import("../src/LighthouseModule.js"); describe("Starts an analysis", () => { - const module = new LighthouseModule( - { - id: "lighthouse-test", - type: "analysis", - name: "Heart Lighthouse Test", - service: { - name: "Lighthouse Test", - }, - }, - false - ) + const module = new LighthouseModule( + { + id: "lighthouse-test", + type: "analysis", + name: "Heart Lighthouse Test", + service: { + name: "Lighthouse Test", + }, + }, + false, + ); - it("should starts an analysis with a valid configuration", async () => { - // mock the analysis stuff - mockedRequestResult.mockResolvedValue(RESULT) + it("should starts an analysis with a valid configuration", async () => { + // mock the analysis stuff + mockedRequestResult.mockResolvedValue(RESULT); - const report = await module.startAnalysis(Conf) + const report = await module.startAnalysis(Conf); - expect(report.analyzedUrl).toStrictEqual(Conf.url) - expect(report).toHaveProperty("date") - expect(report).toHaveProperty("grade") - expect(report).toHaveProperty("normalizedGrade") - }) + expect(report.analyzedUrl).toStrictEqual(Conf.url); + expect(report).toHaveProperty("date"); + expect(report).toHaveProperty("grade"); + expect(report).toHaveProperty("normalizedGrade"); + }); - it("should starts an analysis with an invalid configuration", async () => { - Conf.url = "" - try { - await module.startAnalysis(Conf) - } catch (e) { - expect(e).toHaveProperty("error") - } - }) + it("should starts an analysis with an invalid configuration", async () => { + Conf.url = ""; + try { + await module.startAnalysis(Conf); + } catch (e) { + expect(e).toHaveProperty("error"); + } + }); - it("Should return true status when results match thresholds objectives", async () => { - const THRESHOLD = 80 + it("Should return true status when results match thresholds objectives", async () => { + const THRESHOLD = 80; - //mock the analysis stuff - mockedRequestResult.mockResolvedValue(RESULT) + //mock the analysis stuff + mockedRequestResult.mockResolvedValue(RESULT); - const report = await module.startAnalysis(Conf, THRESHOLD) + const report = await module.startAnalysis(Conf, THRESHOLD); - expect(report.isThresholdReached()).toStrictEqual(true) - }) -}) + expect(report.isThresholdReached()).toStrictEqual(true); + }); +}); diff --git a/modules/lighthouse/tests/api/Client.test.ts b/modules/lighthouse/tests/api/Client.test.ts index 4694930f..67ac27c8 100644 --- a/modules/lighthouse/tests/api/Client.test.ts +++ b/modules/lighthouse/tests/api/Client.test.ts @@ -1,29 +1,31 @@ -import { jest } from "@jest/globals" -import type { RunnerResult } from "lighthouse" -import { Conf } from "../data/Conf.js" +import { jest } from "@jest/globals"; +import type { RunnerResult } from "lighthouse"; +import { Conf } from "../data/Conf.js"; const RUNNER_RESULT = { - lhr: { - categories: { - category1: { score: 67 }, - category2: { score: 74 }, - category3: { score: 95 }, - category4: { score: 88 }, - category5: { score: 53 }, - }, - }, -} as unknown as RunnerResult // avoid the declaration of a huuuuuge object + lhr: { + categories: { + category1: { score: 67 }, + category2: { score: 74 }, + category3: { score: 95 }, + category4: { score: 88 }, + category5: { score: 53 }, + }, + }, +} as unknown as RunnerResult; // avoid the declaration of a huuuuuge object jest.unstable_mockModule("lighthouse", () => ({ - default: jest.fn().mockImplementationOnce(() => Promise.resolve(RUNNER_RESULT)), -})) -await import("lighthouse") + default: jest + .fn() + .mockImplementationOnce(() => Promise.resolve(RUNNER_RESULT)), +})); +await import("lighthouse"); -const { requestResult } = await import("../../src/api/Client.js") +const { requestResult } = await import("../../src/api/Client.js"); describe("Run an analysis", () => { - it("should runs an analysis with a valid configuration", async () => { - const results = await requestResult(Conf, false) - expect(results).toStrictEqual(RUNNER_RESULT.lhr) - }) -}) + it("should runs an analysis with a valid configuration", async () => { + const results = await requestResult(Conf, false); + expect(results).toStrictEqual(RUNNER_RESULT.lhr); + }); +}); diff --git a/modules/lighthouse/tests/data/Conf.ts b/modules/lighthouse/tests/data/Conf.ts index 3921a469..d8c6f3c5 100644 --- a/modules/lighthouse/tests/data/Conf.ts +++ b/modules/lighthouse/tests/data/Conf.ts @@ -1,11 +1,16 @@ -import type { LighthouseConfig } from "@fabernovel/heart-common" +import type { LighthouseConfig } from "@fabernovel/heart-common"; export const Conf: LighthouseConfig = { - url: "https://heart.fabernovel.com", - config: { - extends: "lighthouse:default", - settings: { - onlyAudits: ["first-meaningful-paint", "speed-index", "first-cpu-idle", "interactive"], - }, - }, -} + url: "https://heart.fabernovel.com", + config: { + extends: "lighthouse:default", + settings: { + onlyAudits: [ + "first-meaningful-paint", + "speed-index", + "first-cpu-idle", + "interactive", + ], + }, + }, +}; diff --git a/modules/mysql/src/MySQLModule.ts b/modules/mysql/src/MySQLModule.ts index 4cb73a2d..69b47928 100644 --- a/modules/mysql/src/MySQLModule.ts +++ b/modules/mysql/src/MySQLModule.ts @@ -1,46 +1,51 @@ import { - Module, - type GenericReport, - type ModuleListenerDatabaseInterface, - type Result, - type ModuleMetadata, - logger, -} from "@fabernovel/heart-common" -import { MySQLClient } from "./client/Client.js" - -export class MySQLModule extends Module implements ModuleListenerDatabaseInterface { - #client: MySQLClient - - constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { - super(moduleMetadata, verbose) - - this.#client = new MySQLClient(verbose) - - if (verbose) { - logger.info(`${moduleMetadata.name} initialized.`) - } - } - - public async hasPendingMigrations(): Promise { - const migrator = await this.#client.getMigrator() - - const migrations = await migrator.getPendingMigrations() - - return migrations.length > 0 - } - - public async runPendingMigrations(): Promise { - const migrator = await this.#client.getMigrator() - - await migrator.up() - } - - public async notifyAnalysisDone(report: GenericReport): Promise { - try { - await this.#client.save(report) - } catch (error) { - logger.error(error) - return Promise.reject(error) - } - } + Module, + type GenericReport, + type ModuleListenerDatabaseInterface, + type Result, + type ModuleMetadata, + logger, +} from "@fabernovel/heart-common"; +import { MySQLClient } from "./client/Client.js"; + +export class MySQLModule + extends Module + implements ModuleListenerDatabaseInterface +{ + #client: MySQLClient; + + constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { + super(moduleMetadata, verbose); + + this.#client = new MySQLClient(verbose); + + if (verbose) { + logger.info(`${moduleMetadata.name} initialized.`); + } + } + + public async hasPendingMigrations(): Promise { + const migrator = await this.#client.getMigrator(); + + const migrations = await migrator.getPendingMigrations(); + + return migrations.length > 0; + } + + public async runPendingMigrations(): Promise { + const migrator = await this.#client.getMigrator(); + + await migrator.up(); + } + + public async notifyAnalysisDone( + report: GenericReport, + ): Promise { + try { + await this.#client.save(report); + } catch (error) { + logger.error(error); + return Promise.reject(error); + } + } } diff --git a/modules/mysql/src/client/Client.ts b/modules/mysql/src/client/Client.ts index d147d5d4..5a876804 100644 --- a/modules/mysql/src/client/Client.ts +++ b/modules/mysql/src/client/Client.ts @@ -1,77 +1,91 @@ -import { ReportEntity, type GenericReport, type Result, ServiceEntity } from "@fabernovel/heart-common" -import { MikroORM, type IMigrator } from "@mikro-orm/core" -import { SqlEntityManager, type MySqlDriver } from "@mikro-orm/mysql" -import databaseConfig from "../config/mikro-orm.config.js" +import { + ReportEntity, + type GenericReport, + type Result, + ServiceEntity, +} from "@fabernovel/heart-common"; +import { MikroORM, type IMigrator } from "@mikro-orm/core"; +import type { SqlEntityManager, MySqlDriver } from "@mikro-orm/mysql"; +import databaseConfig from "../config/mikro-orm.config.js"; export class MySQLClient { - #em: SqlEntityManager | undefined - #orm: MikroORM | undefined - #verbose: boolean - - constructor(verbose: boolean) { - this.#verbose = verbose - } - - public async getMigrator(): Promise { - const orm = await this.getOrCreateOrm() - - return orm.getMigrator() - } - - /** - * Save the given report into the database. - */ - public async save(report: GenericReport): Promise { - const reportEntity = await this.createReportEntity(report) - - const em = await this.getOrCreateEntityManager() - const orm = await this.getOrCreateOrm() - - await em.persistAndFlush(reportEntity) - - return orm.close() - } - - private async createReportEntity(report: GenericReport): Promise> { - const reportEntity = new ReportEntity(report) - const serviceEntity = await this.getOrCreateServiceEntity(report.service) - - reportEntity.service = serviceEntity - - return reportEntity - } - - /** - * Get or create the ORM: avoid the opening of several DB connection at the same or in a very short interval of time. - * As Heart is a CLI tool, having the DB connection opened during a single analysis that longs a couple of minutes is acceptable. - */ - private async getOrCreateOrm(): Promise> { - if (this.#orm === undefined) { - this.#orm = await MikroORM.init({ verbose: this.#verbose, ...databaseConfig }) - } - - return this.#orm - } - - /** - * Get or create the entity manager - * @link https://mikro-orm.io/docs/identity-map - */ - private async getOrCreateEntityManager(): Promise { - const orm = await this.getOrCreateOrm() - - if (this.#em === undefined) { - this.#em = orm.em.fork() - } - - return this.#em - } - - private async getOrCreateServiceEntity(service: GenericReport["service"]): Promise { - const em = await this.getOrCreateEntityManager() - - const serviceEntity = await em.findOne(ServiceEntity, { name: service.name }) - - return serviceEntity ?? new ServiceEntity(service) - } + #em: SqlEntityManager | undefined; + #orm: MikroORM | undefined; + #verbose: boolean; + + constructor(verbose: boolean) { + this.#verbose = verbose; + } + + public async getMigrator(): Promise { + const orm = await this.getOrCreateOrm(); + + return orm.getMigrator(); + } + + /** + * Save the given report into the database. + */ + public async save(report: GenericReport): Promise { + const reportEntity = await this.createReportEntity(report); + + const em = await this.getOrCreateEntityManager(); + const orm = await this.getOrCreateOrm(); + + await em.persistAndFlush(reportEntity); + + return orm.close(); + } + + private async createReportEntity( + report: GenericReport, + ): Promise> { + const reportEntity = new ReportEntity(report); + const serviceEntity = await this.getOrCreateServiceEntity(report.service); + + reportEntity.service = serviceEntity; + + return reportEntity; + } + + /** + * Get or create the ORM: avoid the opening of several DB connection at the same or in a very short interval of time. + * As Heart is a CLI tool, having the DB connection opened during a single analysis that longs a couple of minutes is acceptable. + */ + private async getOrCreateOrm(): Promise> { + if (this.#orm === undefined) { + this.#orm = await MikroORM.init({ + verbose: this.#verbose, + ...databaseConfig, + }); + } + + return this.#orm; + } + + /** + * Get or create the entity manager + * @link https://mikro-orm.io/docs/identity-map + */ + private async getOrCreateEntityManager(): Promise { + const orm = await this.getOrCreateOrm(); + + if (this.#em === undefined) { + this.#em = orm.em.fork(); + } + + return this.#em; + } + + private async getOrCreateServiceEntity( + service: GenericReport["service"], + ): Promise { + const em = await this.getOrCreateEntityManager(); + + const serviceEntity = await em.findOne(ServiceEntity, { + name: service.name, + }); + + return serviceEntity ?? new ServiceEntity(service); + } } diff --git a/modules/mysql/src/config/mikro-orm.config.ts b/modules/mysql/src/config/mikro-orm.config.ts index 5141e608..d915ec76 100644 --- a/modules/mysql/src/config/mikro-orm.config.ts +++ b/modules/mysql/src/config/mikro-orm.config.ts @@ -1,20 +1,20 @@ -import { createDatabaseConfig } from "@fabernovel/heart-common" -import { MySqlDriver, defineConfig } from "@mikro-orm/mysql" -import { env } from "node:process" -import { Migration20230702150637 } from "../migrations/Migration20230702150637.js" +import { createDatabaseConfig } from "@fabernovel/heart-common"; +import { type MySqlDriver, defineConfig } from "@mikro-orm/mysql"; +import { env } from "node:process"; +import { Migration20230702150637 } from "../migrations/Migration20230702150637.js"; export default defineConfig( - createDatabaseConfig({ - clientUrl: env.HEART_MYSQL_DATABASE_URL ?? "", - migrations: { - migrationsList: [ - { - name: "Migration20230702150637", - class: Migration20230702150637, - }, - ], - }, - charset: "utf8mb4", - collate: "utf8mb4_general_ci", - }) -) + createDatabaseConfig({ + clientUrl: env.HEART_MYSQL_DATABASE_URL ?? "", + migrations: { + migrationsList: [ + { + name: "Migration20230702150637", + class: Migration20230702150637, + }, + ], + }, + charset: "utf8mb4", + collate: "utf8mb4_general_ci", + }), +); diff --git a/modules/mysql/src/index.ts b/modules/mysql/src/index.ts index 7ec50582..84f96413 100644 --- a/modules/mysql/src/index.ts +++ b/modules/mysql/src/index.ts @@ -1,6 +1,9 @@ -import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" -import { MySQLModule } from "./MySQLModule.js" +import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common"; +import { MySQLModule } from "./MySQLModule.js"; -export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { - return new MySQLModule(moduleMetadata, verbose) -} +export const initialize: ModuleIndex["initialize"] = ( + moduleMetadata: ModuleMetadata, + verbose: boolean, +) => { + return new MySQLModule(moduleMetadata, verbose); +}; diff --git a/modules/mysql/src/migrations/Migration20230702150637.ts b/modules/mysql/src/migrations/Migration20230702150637.ts index cbdbdced..7b95e503 100644 --- a/modules/mysql/src/migrations/Migration20230702150637.ts +++ b/modules/mysql/src/migrations/Migration20230702150637.ts @@ -1,19 +1,21 @@ -import { Migration } from "@mikro-orm/migrations" +import { Migration } from "@mikro-orm/migrations"; export class Migration20230702150637 extends Migration { - // eslint-disable-next-line @typescript-eslint/require-await - async up(): Promise { - this.addSql( - "create table `service` (`name` varchar(255) not null, `logoUrl` varchar(255) null, primary key (`name`)) default character set utf8mb4 collate utf8mb4_general_ci engine = InnoDB;" - ) + // eslint-disable-next-line @typescript-eslint/require-await + async up(): Promise { + this.addSql( + "create table `service` (`name` varchar(255) not null, `logoUrl` varchar(255) null, primary key (`name`)) default character set utf8mb4 collate utf8mb4_general_ci engine = InnoDB;", + ); - this.addSql( - "create table `report` (`id` int unsigned not null auto_increment primary key, `analyzed_url` varchar(255) not null, `date` datetime not null, `grade` varchar(255) not null, `normalized_grade` int not null, `result` json not null, `result_url` varchar(255) null, `service_name` varchar(255) not null) default character set utf8mb4 collate utf8mb4_general_ci engine = InnoDB;" - ) - this.addSql("alter table `report` add index `report_service_name_index`(`service_name`);") + this.addSql( + "create table `report` (`id` int unsigned not null auto_increment primary key, `analyzed_url` varchar(255) not null, `date` datetime not null, `grade` varchar(255) not null, `normalized_grade` int not null, `result` json not null, `result_url` varchar(255) null, `service_name` varchar(255) not null) default character set utf8mb4 collate utf8mb4_general_ci engine = InnoDB;", + ); + this.addSql( + "alter table `report` add index `report_service_name_index`(`service_name`);", + ); - this.addSql( - "alter table `report` add constraint `report_service_name_foreign` foreign key (`service_name`) references `service` (`name`) on update cascade;" - ) - } + this.addSql( + "alter table `report` add constraint `report_service_name_foreign` foreign key (`service_name`) references `service` (`name`) on update cascade;", + ); + } } diff --git a/modules/observatory/src/ObservatoryModule.ts b/modules/observatory/src/ObservatoryModule.ts index 610ceac3..c745db86 100644 --- a/modules/observatory/src/ObservatoryModule.ts +++ b/modules/observatory/src/ObservatoryModule.ts @@ -1,82 +1,89 @@ import { - Helper, - Module, - ObservatoryReport, - ObservatoryScanState, - logger, - type ModuleAnalysisInterface, - type ModuleMetadata, - type ObservatoryConfig, -} from "@fabernovel/heart-common" -import { Client } from "./api/Client.js" -import { ObservatoryError } from "./error/ObservatoryError.js" + Helper, + Module, + ObservatoryReport, + ObservatoryScanState, + logger, + type ModuleAnalysisInterface, + type ModuleMetadata, + type ObservatoryConfig, +} from "@fabernovel/heart-common"; +import { Client } from "./api/Client.js"; +import { ObservatoryError } from "./error/ObservatoryError.js"; -const TIME_BETWEEN_TRIES = 10000 +const TIME_BETWEEN_TRIES = 10000; export class ObservatoryModule - extends Module - implements ModuleAnalysisInterface + extends Module + implements ModuleAnalysisInterface { - #client: Client + #client: Client; - constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { - super(moduleMetadata, verbose) + constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { + super(moduleMetadata, verbose); - this.#client = new Client() + this.#client = new Client(); - if (verbose) { - logger.info(`${moduleMetadata.name} initialized.`) - } - } + if (verbose) { + logger.info(`${moduleMetadata.name} initialized.`); + } + } - public async startAnalysis(config: ObservatoryConfig, threshold?: number): Promise { - const scan = await this.#client.triggerAnalysis(config) + public async startAnalysis( + config: ObservatoryConfig, + threshold?: number, + ): Promise { + const scan = await this.#client.triggerAnalysis(config); - const finishedScan = await this.#requestFinishedScan(scan) + const finishedScan = await this.#requestFinishedScan(scan); - const tests = await this.#client.requestTests(finishedScan) + const tests = await this.#client.requestTests(finishedScan); - return new ObservatoryReport({ - analyzedUrl: config.host, - date: new Date(finishedScan.end_time), - result: { - scan: finishedScan, - tests: tests, - }, - resultUrl: this.#client.getAnalyzeUrl(), - service: this.service, - inputs: { - config: config, - threshold: threshold, - }, - }) - } + return new ObservatoryReport({ + analyzedUrl: config.host, + date: new Date(finishedScan.end_time), + result: { + scan: finishedScan, + tests: tests, + }, + resultUrl: this.#client.getAnalyzeUrl(), + service: this.service, + inputs: { + config: config, + threshold: threshold, + }, + }); + } - /** - * Request the Scan until its state goes to "FINISHED" - */ - async #requestFinishedScan( - scan: ObservatoryReport["result"]["scan"] - ): Promise { - switch (scan.state) { - case ObservatoryScanState.PENDING: - case ObservatoryScanState.STARTING: - case ObservatoryScanState.RUNNING: { - // wait a bit before a new request (the scanning operation takes several seconds) - await Helper.timeout(TIME_BETWEEN_TRIES) - const newScan = await this.#client.requestScan() + /** + * Request the Scan until its state goes to "FINISHED" + */ + async #requestFinishedScan( + scan: ObservatoryReport["result"]["scan"], + ): Promise { + switch (scan.state) { + case ObservatoryScanState.PENDING: + case ObservatoryScanState.STARTING: + case ObservatoryScanState.RUNNING: { + // wait a bit before a new request (the scanning operation takes several seconds) + await Helper.timeout(TIME_BETWEEN_TRIES); + const newScan = await this.#client.requestScan(); - return this.#requestFinishedScan(newScan) - } + return this.#requestFinishedScan(newScan); + } - case ObservatoryScanState.FINISHED: - return scan + case ObservatoryScanState.FINISHED: + return scan; - case ObservatoryScanState.FAILED: - default: { - const e = new ObservatoryError(scan.state) - return Promise.reject(e) - } - } - } + case ObservatoryScanState.FAILED: { + const e = new ObservatoryError(scan.state); + return Promise.reject(e); + } + + default: { + const e = new ObservatoryError(scan.state); + return Promise.reject(e); + } + } + } } diff --git a/modules/observatory/src/api/Client.ts b/modules/observatory/src/api/Client.ts index cc0e5e99..7c0e3b76 100644 --- a/modules/observatory/src/api/Client.ts +++ b/modules/observatory/src/api/Client.ts @@ -1,57 +1,62 @@ -import { type ObservatoryConfig, ObservatoryReport, Request } from "@fabernovel/heart-common" -import { env } from "node:process" -import { type ScanError, isScanError } from "./error/Error.js" +import { + type ObservatoryConfig, + type ObservatoryReport, + Request, +} from "@fabernovel/heart-common"; +import { env } from "node:process"; +import { type ScanError, isScanError } from "./error/Error.js"; export class Client { - #analyzeUrl: string - #apiUrl: string - #host = "" - - constructor() { - this.#analyzeUrl = env.HEART_OBSERVATORY_ANALYZE_URL ?? "" - this.#apiUrl = env.HEART_OBSERVATORY_API_URL ?? "" - } - - public getAnalyzeUrl(): string { - return this.#analyzeUrl + this.#host - } - - /** - * Get the summary of the analysis - */ - public async requestScan(): Promise { - return Request.get(`${this.#apiUrl}analyze?host=${this.#host}`) - } - - /** - * Get detailed results about the tests run - */ - public async requestTests( - scan: ObservatoryReport["result"]["scan"] - ): Promise { - return Request.get(`${this.#apiUrl}getScanResults?scan=${scan.scan_id}`) - } - - public async triggerAnalysis(conf: ObservatoryConfig): Promise { - this.#host = conf.host - - const scan = await Request.post( - `${this.#apiUrl}analyze?host=${this.#host}`, - { - host: conf.host, - hidden: conf.hidden, - rescan: conf.rescan, - } - ) - - // Observatory API is unconventional, and does not take advantage of http verbs :/ - if (isScanError(scan)) { - return Promise.reject({ - error: scan.error, - message: scan.text, - }) - } - - return scan - } + #analyzeUrl: string; + #apiUrl: string; + #host = ""; + + constructor() { + this.#analyzeUrl = env.HEART_OBSERVATORY_ANALYZE_URL ?? ""; + this.#apiUrl = env.HEART_OBSERVATORY_API_URL ?? ""; + } + + public getAnalyzeUrl(): string { + return this.#analyzeUrl + this.#host; + } + + /** + * Get the summary of the analysis + */ + public async requestScan(): Promise { + return Request.get(`${this.#apiUrl}analyze?host=${this.#host}`); + } + + /** + * Get detailed results about the tests run + */ + public async requestTests( + scan: ObservatoryReport["result"]["scan"], + ): Promise { + return Request.get(`${this.#apiUrl}getScanResults?scan=${scan.scan_id}`); + } + + public async triggerAnalysis( + conf: ObservatoryConfig, + ): Promise { + this.#host = conf.host; + + const scan = await Request.post< + ObservatoryReport["result"]["scan"] | ScanError + >(`${this.#apiUrl}analyze?host=${this.#host}`, { + host: conf.host, + hidden: conf.hidden, + rescan: conf.rescan, + }); + + // Observatory API is unconventional, and does not take advantage of http verbs :/ + if (isScanError(scan)) { + return Promise.reject({ + error: scan.error, + message: scan.text, + }); + } + + return scan; + } } diff --git a/modules/observatory/src/api/error/Error.ts b/modules/observatory/src/api/error/Error.ts index a4868e55..685b6d7a 100644 --- a/modules/observatory/src/api/error/Error.ts +++ b/modules/observatory/src/api/error/Error.ts @@ -1,6 +1,7 @@ export interface ScanError { - error: unknown - text: string + error: unknown; + text: string; } -export const isScanError = (object: unknown): object is ScanError => (object as ScanError).error !== undefined +export const isScanError = (object: unknown): object is ScanError => + (object as ScanError).error !== undefined; diff --git a/modules/observatory/src/error/ObservatoryError.ts b/modules/observatory/src/error/ObservatoryError.ts index 6f718d8b..1cafcbdf 100644 --- a/modules/observatory/src/error/ObservatoryError.ts +++ b/modules/observatory/src/error/ObservatoryError.ts @@ -1,10 +1,10 @@ -import type { ObservatoryScanState } from "@fabernovel/heart-common" +import type { ObservatoryScanState } from "@fabernovel/heart-common"; export class ObservatoryError extends Error { - constructor(state: ObservatoryScanState) { - super(state) + constructor(state: ObservatoryScanState) { + super(state); - // @see {@link https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work} - Object.setPrototypeOf(this, ObservatoryError.prototype) - } + // @see {@link https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work} + Object.setPrototypeOf(this, ObservatoryError.prototype); + } } diff --git a/modules/observatory/src/index.ts b/modules/observatory/src/index.ts index 15c29d48..311127fb 100644 --- a/modules/observatory/src/index.ts +++ b/modules/observatory/src/index.ts @@ -1,6 +1,9 @@ -import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" -import { ObservatoryModule } from "./ObservatoryModule.js" +import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common"; +import { ObservatoryModule } from "./ObservatoryModule.js"; -export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { - return new ObservatoryModule(moduleMetadata, verbose) -} +export const initialize: ModuleIndex["initialize"] = ( + moduleMetadata: ModuleMetadata, + verbose: boolean, +) => { + return new ObservatoryModule(moduleMetadata, verbose); +}; diff --git a/modules/observatory/tests/ObservatoryModule.test.ts b/modules/observatory/tests/ObservatoryModule.test.ts index 6d57cf1d..854a236f 100644 --- a/modules/observatory/tests/ObservatoryModule.test.ts +++ b/modules/observatory/tests/ObservatoryModule.test.ts @@ -1,104 +1,107 @@ -import { type ObservatoryConfig, ObservatoryReport } from "@fabernovel/heart-common" -import { jest } from "@jest/globals" -import { RESULT } from "./data/Result.js" +import { + type ObservatoryConfig, + ObservatoryReport, +} from "@fabernovel/heart-common"; +import { jest } from "@jest/globals"; +import { RESULT } from "./data/Result.js"; -const ANALYZE_URL = "www.observatory.mozilla-test/results/" -const CONF: ObservatoryConfig = { host: "heart.fabernovel.com" } +const ANALYZE_URL = "www.observatory.mozilla-test/results/"; +const CONF: ObservatoryConfig = { host: "heart.fabernovel.com" }; jest.unstable_mockModule("../src/api/Client.js", () => { - return { - Client: jest.fn().mockImplementation(() => { - return { - getAnalyzeUrl: () => ANALYZE_URL + CONF.host, - requestScan: () => Promise.resolve(RESULT.scan), - requestTests: () => Promise.resolve(RESULT.tests), - triggerAnalysis: () => Promise.resolve(RESULT.scan), - } - }), - } -}) -await import("../src/api/Client.js") -const { ObservatoryModule } = await import("../src/ObservatoryModule.js") + return { + Client: jest.fn().mockImplementation(() => { + return { + getAnalyzeUrl: () => ANALYZE_URL + CONF.host, + requestScan: () => Promise.resolve(RESULT.scan), + requestTests: () => Promise.resolve(RESULT.tests), + triggerAnalysis: () => Promise.resolve(RESULT.scan), + }; + }), + }; +}); +await import("../src/api/Client.js"); +const { ObservatoryModule } = await import("../src/ObservatoryModule.js"); describe("Starts an analysis", () => { - const module = new ObservatoryModule( - { - id: "observatory-test", - type: "analysis", - name: "Heart Observatory Test", - service: { - name: "Observatory Test", - }, - }, - false - ) + const module = new ObservatoryModule( + { + id: "observatory-test", + type: "analysis", + name: "Heart Observatory Test", + service: { + name: "Observatory Test", + }, + }, + false, + ); - it("Should start an analysis with a valid configuration without a threshold", async () => { - const report = await module.startAnalysis(CONF) + it("Should start an analysis with a valid configuration without a threshold", async () => { + const report = await module.startAnalysis(CONF); - const expectedReport = new ObservatoryReport({ - analyzedUrl: "heart.fabernovel.com", - date: report.date, - inputs: { - config: CONF, - }, - result: RESULT, - resultUrl: ANALYZE_URL + "heart.fabernovel.com", - service: { - name: "Observatory Test", - }, - }) + const expectedReport = new ObservatoryReport({ + analyzedUrl: "heart.fabernovel.com", + date: report.date, + inputs: { + config: CONF, + }, + result: RESULT, + resultUrl: `${ANALYZE_URL}heart.fabernovel.com`, + service: { + name: "Observatory Test", + }, + }); - expect(report).toEqual(expectedReport) - }) + expect(report).toEqual(expectedReport); + }); - it("Should throw an error with an invalid configuration", async () => { - try { - await module.startAnalysis({} as ObservatoryConfig) - } catch (e) { - expect(e).toHaveProperty("error") - } - }) + it("Should throw an error with an invalid configuration", async () => { + try { + await module.startAnalysis({} as ObservatoryConfig); + } catch (e) { + expect(e).toHaveProperty("error"); + } + }); - it("Should start an analysis with an empty threshold", async () => { - const report = await module.startAnalysis(CONF) + it("Should start an analysis with an empty threshold", async () => { + const report = await module.startAnalysis(CONF); - const expectedReport = new ObservatoryReport({ - analyzedUrl: "heart.fabernovel.com", - date: report.date, - inputs: { - config: CONF, - }, - result: RESULT, - resultUrl: ANALYZE_URL + "heart.fabernovel.com", - service: { - name: "Observatory Test", - }, - }) + const expectedReport = new ObservatoryReport({ + analyzedUrl: "heart.fabernovel.com", + date: report.date, + inputs: { + config: CONF, + }, + result: RESULT, + resultUrl: `${ANALYZE_URL}heart.fabernovel.com`, + service: { + name: "Observatory Test", + }, + }); - expect(report).toStrictEqual(expectedReport) - expect(report).toHaveProperty("inputs", { config: CONF }) - }) + expect(report).toStrictEqual(expectedReport); + expect(report).toHaveProperty("inputs", { config: CONF }); + }); - it("Should return false status when results do not match threshold objective", async () => { - const THRESHOLD = 98 - const report = await module.startAnalysis(CONF, THRESHOLD) + it("Should return false status when results do not match threshold objective", async () => { + const THRESHOLD = 98; + const report = await module.startAnalysis(CONF, THRESHOLD); - const expectedReport = new ObservatoryReport({ - analyzedUrl: "heart.fabernovel.com", - date: report.date, - inputs: { - config: CONF, - threshold: THRESHOLD, - }, - result: RESULT, - resultUrl: ANALYZE_URL + "heart.fabernovel.com", - service: { - name: "Observatory Test", - }, - }) + const expectedReport = new ObservatoryReport({ + analyzedUrl: "heart.fabernovel.com", + date: report.date, + inputs: { + config: CONF, + threshold: THRESHOLD, + }, + result: RESULT, + resultUrl: `${ANALYZE_URL}heart.fabernovel.com`, + service: { + name: "Observatory Test", + }, + }); - expect(report).toStrictEqual(expectedReport) - expect(report.isThresholdReached()).toEqual(false) - }) -}) + expect(report).toStrictEqual(expectedReport); + expect(report.isThresholdReached()).toEqual(false); + }); +}); diff --git a/modules/observatory/tests/api/Client.test.ts b/modules/observatory/tests/api/Client.test.ts index 6c1f1816..7d266306 100644 --- a/modules/observatory/tests/api/Client.test.ts +++ b/modules/observatory/tests/api/Client.test.ts @@ -1,44 +1,44 @@ -import type { ObservatoryConfig } from "@fabernovel/heart-common" -import { jest } from "@jest/globals" -import { RESULT } from "../data/Result.js" +import type { ObservatoryConfig } from "@fabernovel/heart-common"; +import { jest } from "@jest/globals"; +import { RESULT } from "../data/Result.js"; -const ANALYZE_URL = "www.observatory.mozilla/results" -const API_URL = "www.observatory.mozilla/api" +const ANALYZE_URL = "www.observatory.mozilla/results"; +const API_URL = "www.observatory.mozilla/api"; jest.unstable_mockModule("@fabernovel/heart-common", () => ({ - ObservatoryReport: {}, - Request: { - get: jest.fn(() => Promise.resolve(RESULT)), - post: jest.fn(() => Promise.resolve(RESULT)), - }, -})) -await import("@fabernovel/heart-common") -const { Client } = await import("../../src/api/Client.js") + ObservatoryReport: {}, + Request: { + get: jest.fn(() => Promise.resolve(RESULT)), + post: jest.fn(() => Promise.resolve(RESULT)), + }, +})); +await import("@fabernovel/heart-common"); +const { Client } = await import("../../src/api/Client.js"); describe("Client", () => { - process.env.HEART_OBSERVATORY_ANALYZE_URL = ANALYZE_URL - process.env.HEART_OBSERVATORY_API_URL = API_URL + process.env.HEART_OBSERVATORY_ANALYZE_URL = ANALYZE_URL; + process.env.HEART_OBSERVATORY_API_URL = API_URL; - test("Analyze with valid configuration", async () => { - const CONF = { host: "www.website.test" } + test("Analyze with valid configuration", async () => { + const CONF = { host: "www.website.test" }; - const client = new Client() + const client = new Client(); - const scan = await client.triggerAnalysis(CONF) + const scan = await client.triggerAnalysis(CONF); - expect(scan).toStrictEqual(RESULT) - expect(client.getAnalyzeUrl()).toBe(ANALYZE_URL + CONF.host) - }) + expect(scan).toStrictEqual(RESULT); + expect(client.getAnalyzeUrl()).toBe(ANALYZE_URL + CONF.host); + }); - test("Analyze with invalid configuration", async () => { - const CONF = {} as ObservatoryConfig + test("Analyze with invalid configuration", async () => { + const CONF = {} as ObservatoryConfig; - const client = new Client() + const client = new Client(); - try { - await client.triggerAnalysis(CONF) - } catch (e) { - expect(e).toHaveProperty("error") - } - }) -}) + try { + await client.triggerAnalysis(CONF); + } catch (e) { + expect(e).toHaveProperty("error"); + } + }); +}); diff --git a/modules/observatory/tests/data/Result.ts b/modules/observatory/tests/data/Result.ts index 07343c10..f6e7afce 100644 --- a/modules/observatory/tests/data/Result.ts +++ b/modules/observatory/tests/data/Result.ts @@ -1,32 +1,35 @@ -import { ObservatoryScanState, type ObservatoryReport } from "@fabernovel/heart-common" +import { + ObservatoryScanState, + type ObservatoryReport, +} from "@fabernovel/heart-common"; export const RESULT: ObservatoryReport["result"] = { - scan: { - end_time: "May 13, 2022 5:58 PM", - grade: "B", - hidden: true, - response_headers: {}, - scan_id: 1, - score: 95, - likelihood_indicator: "", - start_time: "", - state: ObservatoryScanState.FINISHED, - tests_failed: 3, - tests_passed: 4, - tests_quantity: 12, - }, - tests: { - "content-security-policy": { - expectation: "csp-implemented-with-no-unsafe", - name: "content-security-policy", - output: { - data: {}, - }, - pass: false, - result: "csp-implemented-with-unsafe-inline-in-style-src-only", - score_description: - "Content Security Policy (CSP) implemented with unsafe-inline inside style-src directive", - score_modifier: -5, - }, - }, -} + scan: { + end_time: "May 13, 2022 5:58 PM", + grade: "B", + hidden: true, + response_headers: {}, + scan_id: 1, + score: 95, + likelihood_indicator: "", + start_time: "", + state: ObservatoryScanState.FINISHED, + tests_failed: 3, + tests_passed: 4, + tests_quantity: 12, + }, + tests: { + "content-security-policy": { + expectation: "csp-implemented-with-no-unsafe", + name: "content-security-policy", + output: { + data: {}, + }, + pass: false, + result: "csp-implemented-with-unsafe-inline-in-style-src-only", + score_description: + "Content Security Policy (CSP) implemented with unsafe-inline inside style-src directive", + score_modifier: -5, + }, + }, +}; diff --git a/modules/slack/src/SlackModule.ts b/modules/slack/src/SlackModule.ts index ce83e035..c76ecc1e 100644 --- a/modules/slack/src/SlackModule.ts +++ b/modules/slack/src/SlackModule.ts @@ -1,34 +1,36 @@ import { - Module, - logger, - type GenericReport, - type ModuleListenerInterface, - type ModuleMetadata, - type Result, -} from "@fabernovel/heart-common" -import { Client } from "./api/Client.js" -import { formatBlocks } from "./formatter/BlocksFormatter.js" -import { formatText } from "./formatter/TextFormatter.js" + Module, + logger, + type GenericReport, + type ModuleListenerInterface, + type ModuleMetadata, + type Result, +} from "@fabernovel/heart-common"; +import { Client } from "./api/Client.js"; +import { formatBlocks } from "./formatter/BlocksFormatter.js"; +import { formatText } from "./formatter/TextFormatter.js"; export class SlackModule extends Module implements ModuleListenerInterface { - #slackClient: Client + #slackClient: Client; - constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { - super(moduleMetadata, verbose) + constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { + super(moduleMetadata, verbose); - this.#slackClient = new Client(verbose) + this.#slackClient = new Client(verbose); - if (verbose) { - logger.info(`${moduleMetadata.name} initialized.`) - } - } + if (verbose) { + logger.info(`${moduleMetadata.name} initialized.`); + } + } - public async notifyAnalysisDone(report: GenericReport): Promise { - return this.#slackClient.postMessage({ - blocks: formatBlocks(report), - text: formatText(report), - icon_url: report.service.logoUrl, - username: report.service.name, - }) - } + public async notifyAnalysisDone( + report: GenericReport, + ): Promise { + return this.#slackClient.postMessage({ + blocks: formatBlocks(report), + text: formatText(report), + icon_url: report.service.logoUrl, + username: report.service.name, + }); + } } diff --git a/modules/slack/src/api/Client.ts b/modules/slack/src/api/Client.ts index 8800ea55..b5e0b473 100644 --- a/modules/slack/src/api/Client.ts +++ b/modules/slack/src/api/Client.ts @@ -1,6 +1,6 @@ -import type { Block, KnownBlock, WebAPICallResult } from "@slack/web-api" -import { LogLevel, WebClient } from "@slack/web-api" -import { env } from "node:process" +import type { Block, KnownBlock, WebAPICallResult } from "@slack/web-api"; +import { LogLevel, WebClient } from "@slack/web-api"; +import { env } from "node:process"; /** * Simple Slack client: @@ -9,25 +9,25 @@ import { env } from "node:process" * - the HEART_SLACK_CHANNEL_ID process.env property */ export class Client { - #channel: string - #client: WebClient + #channel: string; + #client: WebClient; - constructor(verbose: boolean) { - this.#channel = env.HEART_SLACK_CHANNEL_ID ?? "" - this.#client = new WebClient(env.HEART_SLACK_ACCESS_TOKEN, { - logLevel: verbose ? LogLevel.INFO : undefined, - }) - } + constructor(verbose: boolean) { + this.#channel = env.HEART_SLACK_CHANNEL_ID ?? ""; + this.#client = new WebClient(env.HEART_SLACK_ACCESS_TOKEN, { + logLevel: verbose ? LogLevel.INFO : undefined, + }); + } - public async postMessage(options: { - blocks: (KnownBlock | Block)[] - text: string - icon_url?: string - username?: string - }): Promise { - return this.#client.chat.postMessage({ - channel: this.#channel, - ...options, - }) - } + public async postMessage(options: { + blocks: (KnownBlock | Block)[]; + text: string; + icon_url?: string; + username?: string; + }): Promise { + return this.#client.chat.postMessage({ + channel: this.#channel, + ...options, + }); + } } diff --git a/modules/slack/src/formatter/BlocksFormatter.ts b/modules/slack/src/formatter/BlocksFormatter.ts index 6d809bb2..6e33336d 100644 --- a/modules/slack/src/formatter/BlocksFormatter.ts +++ b/modules/slack/src/formatter/BlocksFormatter.ts @@ -1,115 +1,128 @@ import { - type GenericReport, - GreenITReport, - LighthouseReport, - ObservatoryReport, - type Result, -} from "@fabernovel/heart-common" + type GenericReport, + GreenITReport, + LighthouseReport, + ObservatoryReport, + type Result, +} from "@fabernovel/heart-common"; import type { - Block, - DividerBlock, - HeaderBlock, - ImageElement, - KnownBlock, - MrkdwnElement, - PlainTextElement, - SectionBlock, -} from "@slack/web-api" -import { formatGreenITBlocks } from "./GreenITStatisticsFormatter.js" -import { formatLighthouseBlocks } from "./LighthouseStatisticsFormatter.js" -import { formatObservatoryBlocks } from "./ObservatoryStatisticsFormatter.js" + Block, + DividerBlock, + HeaderBlock, + ImageElement, + KnownBlock, + MrkdwnElement, + PlainTextElement, + SectionBlock, +} from "@slack/web-api"; +import { formatGreenITBlocks } from "./GreenITStatisticsFormatter.js"; +import { formatLighthouseBlocks } from "./LighthouseStatisticsFormatter.js"; +import { formatObservatoryBlocks } from "./ObservatoryStatisticsFormatter.js"; // maximum number of characters in a text block -export const MAX_TEXT_BLOCK_LENGTH = 3000 +export const MAX_TEXT_BLOCK_LENGTH = 3000; const createBlocks = ( - report: GenericReport, - metricsBlocks: MrkdwnElement[] = [], - advicesBlocks: (DividerBlock | HeaderBlock | SectionBlock)[] = [] + report: GenericReport, + metricsBlocks: MrkdwnElement[] = [], + advicesBlocks: (DividerBlock | HeaderBlock | SectionBlock)[] = [], ) => { - metricsBlocks.unshift({ - type: "mrkdwn", - text: "*Overall*: " + report.displayGrade(), - }) + metricsBlocks.unshift({ + type: "mrkdwn", + text: `*Overall*: ${report.displayGrade()}`, + }); - const blocks: (KnownBlock | Block)[] = [ - { - type: "header", - text: { - type: "plain_text", - text: `Results for ${report.analyzedUrl}`, - }, - }, - { - type: "divider", - }, - { - type: "section", - accessory: { - type: "image", - image_url: report.service.logoUrl ?? "", - alt_text: report.service.name, - }, - fields: metricsBlocks, - }, - ] + const blocks: (KnownBlock | Block)[] = [ + { + type: "header", + text: { + type: "plain_text", + text: `Results for ${report.analyzedUrl}`, + }, + }, + { + type: "divider", + }, + { + type: "section", + accessory: { + type: "image", + image_url: report.service.logoUrl ?? "", + alt_text: report.service.name, + }, + fields: metricsBlocks, + }, + ]; - if (report.resultUrl !== undefined || report.isThresholdReached() !== undefined) { - const elements = new Array() + if ( + report.resultUrl !== undefined || + report.isThresholdReached() !== undefined + ) { + const elements = new Array< + ImageElement | PlainTextElement | MrkdwnElement + >(); - if (report.isThresholdReached() !== undefined) { - elements.push({ - type: "mrkdwn", - text: report.isThresholdReached() - ? `:white_check_mark: Threshold (${report.inputs.threshold ?? 0}) reached` - : `:warning: Threshold (${report.inputs.threshold ?? 0}) not reached`, - }) - } + if (report.isThresholdReached() !== undefined) { + elements.push({ + type: "mrkdwn", + text: report.isThresholdReached() + ? `:white_check_mark: Threshold (${ + report.inputs.threshold ?? 0 + }) reached` + : `:warning: Threshold (${report.inputs.threshold ?? 0}) not reached`, + }); + } - if (report.resultUrl !== undefined) { - elements.push({ - type: "mrkdwn", - text: `<${report.resultUrl}|View full report>`, - }) - } + if (report.resultUrl !== undefined) { + elements.push({ + type: "mrkdwn", + text: `<${report.resultUrl}|View full report>`, + }); + } - blocks.push({ - type: "context", - elements: elements, - }) - } + blocks.push({ + type: "context", + elements: elements, + }); + } - if (advicesBlocks.length > 0) { - advicesBlocks.unshift( - { - type: "header", - text: { - type: "plain_text", - text: "Advices", - }, - }, - { - type: "divider", - } - ) + if (advicesBlocks.length > 0) { + advicesBlocks.unshift( + { + type: "header", + text: { + type: "plain_text", + text: "Advices", + }, + }, + { + type: "divider", + }, + ); - blocks.push(...advicesBlocks) - } + blocks.push(...advicesBlocks); + } - return blocks -} + return blocks; +}; -export const formatBlocks = (report: GenericReport): (KnownBlock | Block)[] => { - if (report instanceof LighthouseReport) { - const [metricsBlocks, advicesBlocks] = formatLighthouseBlocks(report) - return createBlocks(report, metricsBlocks, advicesBlocks) - } else if (report instanceof GreenITReport) { - const [metricsBlocks, advicesBlocks] = formatGreenITBlocks(report) - return createBlocks(report, metricsBlocks, advicesBlocks) - } else if (report instanceof ObservatoryReport) { - const [metricsBlocks, advicesBlocks] = formatObservatoryBlocks(report) - return createBlocks(report, metricsBlocks, advicesBlocks) - } else { - return createBlocks(report) - } -} +export const formatBlocks = ( + report: GenericReport, +): (KnownBlock | Block)[] => { + if (report instanceof LighthouseReport) { + const [metricsBlocks, advicesBlocks] = formatLighthouseBlocks(report); + return createBlocks(report, metricsBlocks, advicesBlocks); + } + + if (report instanceof GreenITReport) { + const [metricsBlocks, advicesBlocks] = formatGreenITBlocks(report); + return createBlocks(report, metricsBlocks, advicesBlocks); + } + + if (report instanceof ObservatoryReport) { + const [metricsBlocks, advicesBlocks] = formatObservatoryBlocks(report); + return createBlocks(report, metricsBlocks, advicesBlocks); + } + + return createBlocks(report); +}; diff --git a/modules/slack/src/formatter/GreenITStatisticsFormatter.ts b/modules/slack/src/formatter/GreenITStatisticsFormatter.ts index c203d24f..f0491fea 100644 --- a/modules/slack/src/formatter/GreenITStatisticsFormatter.ts +++ b/modules/slack/src/formatter/GreenITStatisticsFormatter.ts @@ -1,82 +1,91 @@ -import type { GreenITReport } from "@fabernovel/heart-common" -import type { MrkdwnElement, SectionBlock } from "@slack/web-api" -import { MAX_TEXT_BLOCK_LENGTH } from "./BlocksFormatter.js" +import type { GreenITReport } from "@fabernovel/heart-common"; +import type { MrkdwnElement, SectionBlock } from "@slack/web-api"; +import { MAX_TEXT_BLOCK_LENGTH } from "./BlocksFormatter.js"; interface Practice { - comment: string - detailComment: string + comment: string; + detailComment: string; } /** * Formatting layout is inspired by https://www.ecoindex.fr/ * @returns An array with the metrics and advices blocks (in that order) */ -export const formatGreenITBlocks = (report: GreenITReport): [MrkdwnElement[], SectionBlock[]] => { - const metricsBlocks: MrkdwnElement[] = [ - { - type: "mrkdwn", - text: `*Page weight*: ${(report.result.responsesSize / 1000000).toFixed(2)} Mo`, - }, - { - type: "mrkdwn", - text: `*DOM elements*: ${report.result.domSize}`, - }, - { - type: "mrkdwn", - text: `*Network requests*: ${report.result.nbRequest}`, - }, - ] +export const formatGreenITBlocks = ( + report: GreenITReport, +): [MrkdwnElement[], SectionBlock[]] => { + const metricsBlocks: MrkdwnElement[] = [ + { + type: "mrkdwn", + text: `*Page weight*: ${(report.result.responsesSize / 1000000).toFixed( + 2, + )} Mo`, + }, + { + type: "mrkdwn", + text: `*DOM elements*: ${report.result.domSize}`, + }, + { + type: "mrkdwn", + text: `*Network requests*: ${report.result.nbRequest}`, + }, + ]; - // only keep bestPractices that have comment and detailComment set (it seems that these are the ones that need improvement) - const advicesBlocks: SectionBlock[][] = Object.values(report.result.bestPractices) - .filter( - (practice): practice is Practice => - Object.hasOwn(practice, "comment") && Object.hasOwn(practice, "detailComment") - ) - .map((practice) => { - // as the practice.detailComment could be more than MAX_TEXT_BLOCK_LENGTH characters long, - // we need to create several sections. - const lines = practice.detailComment.split("
").filter((line) => line.length > 0) + // only keep bestPractices that have comment and detailComment set (it seems that these are the ones that need improvement) + const advicesBlocks: SectionBlock[][] = Object.values( + report.result.bestPractices, + ) + .filter( + (practice): practice is Practice => + Object.hasOwn(practice, "comment") && + Object.hasOwn(practice, "detailComment"), + ) + .map((practice) => { + // as the practice.detailComment could be more than MAX_TEXT_BLOCK_LENGTH characters long, + // we need to create several sections. + const lines = practice.detailComment + .split("
") + .filter((line) => line.length > 0); - const sections = new Array() + const sections = new Array(); - let lineAcc = "" - lines.forEach((line) => { - const newLine = "\n- " + line - if (lineAcc.length + newLine.length <= MAX_TEXT_BLOCK_LENGTH) { - lineAcc += newLine - } else { - sections.push({ - type: "section", - text: { - type: "mrkdwn", - text: lineAcc, - }, - }) - lineAcc = newLine - } - }) - if (lineAcc.length > 0) { - sections.push({ - type: "section", - text: { - type: "mrkdwn", - text: lineAcc, - }, - }) - } + let lineAcc = ""; + lines.forEach((line, _index) => { + const newLine = `\n- ${line}`; + if (lineAcc.length + newLine.length <= MAX_TEXT_BLOCK_LENGTH) { + lineAcc += newLine; + } else { + sections.push({ + type: "section", + text: { + type: "mrkdwn", + text: lineAcc, + }, + }); + lineAcc = newLine; + } + }); + if (lineAcc.length > 0) { + sections.push({ + type: "section", + text: { + type: "mrkdwn", + text: lineAcc, + }, + }); + } - return [ - { - type: "section", - text: { - type: "mrkdwn", - text: `*${practice.comment}*`, - }, - }, - ...sections, - ] - }) + return [ + { + type: "section", + text: { + type: "mrkdwn", + text: `*${practice.comment}*`, + }, + }, + ...sections, + ]; + }); - return [metricsBlocks, advicesBlocks.flat()] -} + return [metricsBlocks, advicesBlocks.flat()]; +}; diff --git a/modules/slack/src/formatter/LighthouseStatisticsFormatter.ts b/modules/slack/src/formatter/LighthouseStatisticsFormatter.ts index 42652f5a..9cfe398a 100644 --- a/modules/slack/src/formatter/LighthouseStatisticsFormatter.ts +++ b/modules/slack/src/formatter/LighthouseStatisticsFormatter.ts @@ -1,57 +1,70 @@ -import type { LighthouseReport } from "@fabernovel/heart-common" -import type { MrkdwnElement, SectionBlock } from "@slack/web-api" - -export const formatLighthouseBlocks = (report: LighthouseReport): [MrkdwnElement[], SectionBlock[]] => { - const metricsBlocks: MrkdwnElement[] = [ - "first-contentful-paint", - "speed-index", - "largest-contentful-paint", - "interactive", - "total-blocking-time", - "cumulative-layout-shift", - ].map((auditKey) => ({ - type: "mrkdwn", - text: `*${report.result.audits[auditKey].title}*: ${report.result.audits[auditKey].displayValue ?? ""}`, - })) - - const audits = Object.values(report.result.audits) - - const advicesBlocks: SectionBlock[][] = Object.values(report.result.categories) - .sort((a, b) => (a.title < b.title ? -1 : 0)) // alphabetical sort - .map((category) => { - const auditsIds = category.auditRefs - .filter((auditRef) => !["metrics", "hidden"].includes(auditRef.group ?? "")) - .map((auditRef) => auditRef.id) - - const advices = audits.filter( - (audit) => auditsIds.includes(audit.id) && audit.score !== null && audit.score < 1 - ) - - const sections: SectionBlock[] = [] - - // display the category only if it contains advices - if (advices.length > 0) { - sections.push({ - type: "section", - text: { - type: "mrkdwn", - text: `*${category.title} (${ - category.score === null ? "" : `${Math.round(category.score * 100)}/100)` - }*`, - }, - }) - - sections.push({ - type: "section", - text: { - type: "mrkdwn", - text: "- " + advices.map((advice) => advice.title).join("\n- "), - }, - }) - } - - return sections - }) - - return [metricsBlocks, advicesBlocks.flat()] -} +import type { LighthouseReport } from "@fabernovel/heart-common"; +import type { MrkdwnElement, SectionBlock } from "@slack/web-api"; + +export const formatLighthouseBlocks = ( + report: LighthouseReport, +): [MrkdwnElement[], SectionBlock[]] => { + const metricsBlocks: MrkdwnElement[] = [ + "first-contentful-paint", + "speed-index", + "largest-contentful-paint", + "interactive", + "total-blocking-time", + "cumulative-layout-shift", + ].map((auditKey) => ({ + type: "mrkdwn", + text: `*${report.result.audits[auditKey].title}*: ${ + report.result.audits[auditKey].displayValue ?? "" + }`, + })); + + const audits = Object.values(report.result.audits); + + const advicesBlocks: SectionBlock[][] = Object.values( + report.result.categories, + ) + .sort((a, b) => (a.title < b.title ? -1 : 0)) // alphabetical sort + .map((category) => { + const auditsIds = category.auditRefs + .filter( + (auditRef) => !["metrics", "hidden"].includes(auditRef.group ?? ""), + ) + .map((auditRef) => auditRef.id); + + const advices = audits.filter( + (audit) => + auditsIds.includes(audit.id) && + audit.score !== null && + audit.score < 1, + ); + + const sections: SectionBlock[] = []; + + // display the category only if it contains advices + if (advices.length > 0) { + sections.push({ + type: "section", + text: { + type: "mrkdwn", + text: `*${category.title} (${ + category.score === null + ? "" + : `${Math.round(category.score * 100)}/100)` + }*`, + }, + }); + + sections.push({ + type: "section", + text: { + type: "mrkdwn", + text: `- ${advices.map((advice) => advice.title).join("\n- ")}`, + }, + }); + } + + return sections; + }); + + return [metricsBlocks, advicesBlocks.flat()]; +}; diff --git a/modules/slack/src/formatter/ObservatoryStatisticsFormatter.ts b/modules/slack/src/formatter/ObservatoryStatisticsFormatter.ts index 8cd9c2df..6abeca5e 100644 --- a/modules/slack/src/formatter/ObservatoryStatisticsFormatter.ts +++ b/modules/slack/src/formatter/ObservatoryStatisticsFormatter.ts @@ -1,14 +1,20 @@ -import type { ObservatoryReport } from "@fabernovel/heart-common" -import type { MrkdwnElement, SectionBlock } from "@slack/web-api" +import type { ObservatoryReport } from "@fabernovel/heart-common"; +import type { MrkdwnElement, SectionBlock } from "@slack/web-api"; -export const formatObservatoryBlocks = (report: ObservatoryReport): [MrkdwnElement[], SectionBlock[]] => { - const advicesBlocks: SectionBlock[] = Object.values(report.result.tests).map((category) => ({ - type: "section", - text: { - type: "plain_text", - text: (category.pass ? ":white_check_mark:" : ":x:") + " " + category.score_description, - }, - })) +export const formatObservatoryBlocks = ( + report: ObservatoryReport, +): [MrkdwnElement[], SectionBlock[]] => { + const advicesBlocks: SectionBlock[] = Object.values(report.result.tests).map( + (category) => ({ + type: "section", + text: { + type: "plain_text", + text: `${category.pass ? ":white_check_mark:" : ":x:"} ${ + category.score_description + }`, + }, + }), + ); - return [[], advicesBlocks] -} + return [[], advicesBlocks]; +}; diff --git a/modules/slack/src/formatter/TextFormatter.ts b/modules/slack/src/formatter/TextFormatter.ts index d662200f..101c9232 100644 --- a/modules/slack/src/formatter/TextFormatter.ts +++ b/modules/slack/src/formatter/TextFormatter.ts @@ -1,17 +1,17 @@ -import type { GenericReport, Result } from "@fabernovel/heart-common" +import type { GenericReport, Result } from "@fabernovel/heart-common"; export const formatText = (report: GenericReport): string => { - let text = `${report.analyzedUrl}: ${report.displayGrade()}` + let text = `${report.analyzedUrl}: ${report.displayGrade()}`; - if (report.resultUrl) { - text += `. <${report.resultUrl}|view full report>` - } + if (report.resultUrl) { + text += `. <${report.resultUrl}|view full report>`; + } - if (report.isThresholdReached() === true) { - text += "\n:white_check_mark: Your threshold is reached." - } else if (report.isThresholdReached() === false) { - text += "\n:warning: Your threshold is not reached." - } + if (report.isThresholdReached() === true) { + text += "\n:white_check_mark: Your threshold is reached."; + } else if (report.isThresholdReached() === false) { + text += "\n:warning: Your threshold is not reached."; + } - return text -} + return text; +}; diff --git a/modules/slack/src/index.ts b/modules/slack/src/index.ts index 2d1b713e..98287387 100644 --- a/modules/slack/src/index.ts +++ b/modules/slack/src/index.ts @@ -1,6 +1,9 @@ -import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" -import { SlackModule } from "./SlackModule.js" +import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common"; +import { SlackModule } from "./SlackModule.js"; -export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { - return new SlackModule(moduleMetadata, verbose) -} +export const initialize: ModuleIndex["initialize"] = ( + moduleMetadata: ModuleMetadata, + verbose: boolean, +) => { + return new SlackModule(moduleMetadata, verbose); +}; diff --git a/modules/ssllabs-server/src/SsllabsServerModule.ts b/modules/ssllabs-server/src/SsllabsServerModule.ts index 75ff2be1..ae1e6202 100644 --- a/modules/ssllabs-server/src/SsllabsServerModule.ts +++ b/modules/ssllabs-server/src/SsllabsServerModule.ts @@ -1,91 +1,99 @@ import { - Helper, - Module, - SsllabsServerReport, - SsllabsServerStatus, - logger, - type Config, - type ModuleAnalysisInterface, - type ModuleMetadata, - type SsllabsServerConfig, -} from "@fabernovel/heart-common" -import { Client } from "./api/Client.js" -import { SsllabsServerError } from "./error/SsllabsServerError.js" + Helper, + Module, + SsllabsServerReport, + SsllabsServerStatus, + logger, + type Config, + type ModuleAnalysisInterface, + type ModuleMetadata, + type SsllabsServerConfig, +} from "@fabernovel/heart-common"; +import { Client } from "./api/Client.js"; +import { SsllabsServerError } from "./error/SsllabsServerError.js"; -const MAX_TRIES = 100 -const TIME_BETWEEN_TRIES = 10000 // 10 seconds +const MAX_TRIES = 100; +const TIME_BETWEEN_TRIES = 10000; // 10 seconds export class SsllabsServerModule - extends Module - implements ModuleAnalysisInterface + extends Module + implements ModuleAnalysisInterface { - #apiClient: Client - #threshold?: number + #apiClient: Client; + #threshold?: number; - constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { - super(moduleMetadata, verbose) + constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { + super(moduleMetadata, verbose); - this.#apiClient = new Client() + this.#apiClient = new Client(); - if (verbose) { - logger.info(`${moduleMetadata.name} initialized.`) - } - } + if (verbose) { + logger.info(`${moduleMetadata.name} initialized.`); + } + } - public async startAnalysis(config: SsllabsServerConfig, threshold?: number): Promise { - this.#threshold = threshold + public async startAnalysis( + config: SsllabsServerConfig, + threshold?: number, + ): Promise { + this.#threshold = threshold; - await this.#apiClient.launchAnalysis(config) + await this.#apiClient.launchAnalysis(config); - return this.#requestResult(config) - } + return this.#requestResult(config); + } - async #handleResult( - config: Config, - result: SsllabsServerReport["result"], - triesQty: number - ): Promise { - switch (result.status) { - case SsllabsServerStatus.ERROR: { - const e = new SsllabsServerError(`${result.status}: ${result.statusMessage}`) - return Promise.reject(e) - } + async #handleResult( + config: Config, + result: SsllabsServerReport["result"], + triesQty: number, + ): Promise { + switch (result.status) { + case SsllabsServerStatus.ERROR: { + const e = new SsllabsServerError( + `${result.status}: ${result.statusMessage}`, + ); + return Promise.reject(e); + } - case SsllabsServerStatus.DNS: - case SsllabsServerStatus.IN_PROGRESS: - await Helper.timeout(TIME_BETWEEN_TRIES) - return this.#requestResult(config, ++triesQty) + case SsllabsServerStatus.DNS: + case SsllabsServerStatus.IN_PROGRESS: + await Helper.timeout(TIME_BETWEEN_TRIES); + return this.#requestResult(config, triesQty + 1); - case SsllabsServerStatus.READY: - return new SsllabsServerReport({ - analyzedUrl: this.#apiClient.getProjectUrl(), - date: new Date(result.startTime), - result: result, - resultUrl: this.#apiClient.getAnalyzeUrl(), - service: this.service, - inputs: { - config: config, - threshold: this.#threshold, - }, - }) + case SsllabsServerStatus.READY: + return new SsllabsServerReport({ + analyzedUrl: this.#apiClient.getProjectUrl(), + date: new Date(result.startTime), + result: result, + resultUrl: this.#apiClient.getAnalyzeUrl(), + service: this.service, + inputs: { + config: config, + threshold: this.#threshold, + }, + }); - default: { - const e = new SsllabsServerError(result.statusMessage) - return Promise.reject(e) - } - } - } + default: { + const e = new SsllabsServerError(result.statusMessage); + return Promise.reject(e); + } + } + } - async #requestResult(config: Config, triesQty = 1): Promise { - if (triesQty > MAX_TRIES) { - const e = new SsllabsServerError( - `The maximum number of tries (${MAX_TRIES}) to retrieve the report has been reached.` - ) - return Promise.reject(e) - } + async #requestResult( + config: Config, + triesQty = 1, + ): Promise { + if (triesQty > MAX_TRIES) { + const e = new SsllabsServerError( + `The maximum number of tries (${MAX_TRIES}) to retrieve the report has been reached.`, + ); + return Promise.reject(e); + } - const result = await this.#apiClient.getResult() + const result = await this.#apiClient.getResult(); - return this.#handleResult(config, result, triesQty) - } + return this.#handleResult(config, result, triesQty); + } } diff --git a/modules/ssllabs-server/src/api/Client.ts b/modules/ssllabs-server/src/api/Client.ts index 24657030..4ae521e6 100644 --- a/modules/ssllabs-server/src/api/Client.ts +++ b/modules/ssllabs-server/src/api/Client.ts @@ -1,73 +1,75 @@ import { - Request, - type SsllabsServerConfig, - SsllabsServerReport, - SsllabsServerStatus, -} from "@fabernovel/heart-common" -import { stringify } from "querystring" -import { isSsllabsServerError, type SsllabsServerError } from "./Error.js" + Request, + type SsllabsServerConfig, + type SsllabsServerReport, + SsllabsServerStatus, +} from "@fabernovel/heart-common"; +import { stringify } from "node:querystring"; +import { isSsllabsServerError, type SsllabsServerError } from "./Error.js"; -const API_URL = "https://api.ssllabs.com/api/v3" -const SERVICE_URL = "https://www.ssllabs.com/ssltest/analyze.html?d=" +const API_URL = "https://api.ssllabs.com/api/v3"; +const SERVICE_URL = "https://www.ssllabs.com/ssltest/analyze.html?d="; export class Client { - #conf: SsllabsServerConfig = { host: "" } + #conf: SsllabsServerConfig = { host: "" }; - public async launchAnalysis(conf: SsllabsServerConfig): Promise { - this.#conf = conf + public async launchAnalysis( + conf: SsllabsServerConfig, + ): Promise { + this.#conf = conf; - return this.#requestApi() - } + return this.#requestApi(); + } - public getProjectUrl(): string { - return this.#conf.host - } + public getProjectUrl(): string { + return this.#conf.host; + } - public getAnalyzeUrl(): string { - return SERVICE_URL + this.getProjectUrl() - } + public getAnalyzeUrl(): string { + return SERVICE_URL + this.getProjectUrl(); + } - public async getResult(): Promise { - // avoid starting a new analysis instead of requesting the results - if ("string" === typeof this.#conf.startNew) { - delete this.#conf.startNew - } + public async getResult(): Promise { + // avoid starting a new analysis instead of requesting the results + if ("string" === typeof this.#conf.startNew) { + delete this.#conf.startNew; + } - return this.#requestApi() - } + return this.#requestApi(); + } - #generateApiUrl(path: string): string { - const query = stringify({ - host: this.#conf.host, - publish: this.#conf.publish, - startNew: this.#conf.startNew, - fromCache: this.#conf.fromCache, - maxAge: this.#conf.maxAge, - all: this.#conf.all, - ignoreMismatch: this.#conf.ignoreMismatch, - }) + #generateApiUrl(path: string): string { + const query = stringify({ + host: this.#conf.host, + publish: this.#conf.publish, + startNew: this.#conf.startNew, + fromCache: this.#conf.fromCache, + maxAge: this.#conf.maxAge, + all: this.#conf.all, + ignoreMismatch: this.#conf.ignoreMismatch, + }); - return `${API_URL}${path}?${query}` - } + return `${API_URL}${path}?${query}`; + } - async #requestApi(): Promise { - const host = await Request.get( - this.#generateApiUrl("/analyze") - ) + async #requestApi(): Promise { + const host = await Request.get< + SsllabsServerReport["result"] | SsllabsServerError + >(this.#generateApiUrl("/analyze")); - if (isSsllabsServerError(host)) { - return Promise.reject({ - error: host.errors, - }) - } + if (isSsllabsServerError(host)) { + return Promise.reject({ + error: host.errors, + }); + } - if (host.status === SsllabsServerStatus.ERROR) { - return Promise.reject({ - error: "error", - message: host.statusMessage, - }) - } + if (host.status === SsllabsServerStatus.ERROR) { + return Promise.reject({ + error: "error", + message: host.statusMessage, + }); + } - return host - } + return host; + } } diff --git a/modules/ssllabs-server/src/api/Error.ts b/modules/ssllabs-server/src/api/Error.ts index b0da0a17..e83d38bf 100644 --- a/modules/ssllabs-server/src/api/Error.ts +++ b/modules/ssllabs-server/src/api/Error.ts @@ -2,11 +2,13 @@ * @see [Documentation]{@link https://github.com/ssllabs/ssllabs-scan/blob/master/ssllabs-api-docs-v3.md#error-reporting} */ export interface SsllabsServerError { - errors: { - field: string - message: string - }[] + errors: { + field: string; + message: string; + }[]; } -export const isSsllabsServerError = (object: unknown): object is SsllabsServerError => - Array.isArray((object as SsllabsServerError).errors) +export const isSsllabsServerError = ( + object: unknown, +): object is SsllabsServerError => + Array.isArray((object as SsllabsServerError).errors); diff --git a/modules/ssllabs-server/src/error/SsllabsServerError.ts b/modules/ssllabs-server/src/error/SsllabsServerError.ts index b9b78b42..18232647 100644 --- a/modules/ssllabs-server/src/error/SsllabsServerError.ts +++ b/modules/ssllabs-server/src/error/SsllabsServerError.ts @@ -1,8 +1,8 @@ export class SsllabsServerError extends Error { - constructor(message: string) { - super(message) + constructor(message: string) { + super(message); - // @see {@link https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work} - Object.setPrototypeOf(this, SsllabsServerError.prototype) - } + // @see {@link https://github.com/Microsoft/TypeScript-wiki/blob/main/Breaking-Changes.md#extending-built-ins-like-error-array-and-map-may-no-longer-work} + Object.setPrototypeOf(this, SsllabsServerError.prototype); + } } diff --git a/modules/ssllabs-server/src/index.ts b/modules/ssllabs-server/src/index.ts index 5d2fe0c4..7e211e4d 100644 --- a/modules/ssllabs-server/src/index.ts +++ b/modules/ssllabs-server/src/index.ts @@ -1,6 +1,9 @@ -import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" -import { SsllabsServerModule } from "./SsllabsServerModule.js" +import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common"; +import { SsllabsServerModule } from "./SsllabsServerModule.js"; -export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { - return new SsllabsServerModule(moduleMetadata, verbose) -} +export const initialize: ModuleIndex["initialize"] = ( + moduleMetadata: ModuleMetadata, + verbose: boolean, +) => { + return new SsllabsServerModule(moduleMetadata, verbose); +}; From 18289f3624cd862a6a90fc9508b0443058f440b3 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 03:16:32 +0200 Subject: [PATCH 15/28] fgeat: move the lint operation to the pre-push event --- .moon/hooks/pre-commit.sh | 2 +- .moon/hooks/pre-push.sh | 8 ++++++++ .moon/workspace.yml | 4 +++- 3 files changed, 12 insertions(+), 2 deletions(-) create mode 100755 .moon/hooks/pre-push.sh diff --git a/.moon/hooks/pre-commit.sh b/.moon/hooks/pre-commit.sh index abfead63..34fb1934 100755 --- a/.moon/hooks/pre-commit.sh +++ b/.moon/hooks/pre-commit.sh @@ -4,5 +4,5 @@ set -eo pipefail # Automatically generated by moon. DO NOT MODIFY! # https://moonrepo.dev/docs/guides/vcs-hooks -moon run :lint :format --affected --status=staged -- --staged --files-ignore-unknown=true --no-errors-on-unmatched +moon run :format --affected --status=staged -- --staged --files-ignore-unknown=true --no-errors-on-unmatched diff --git a/.moon/hooks/pre-push.sh b/.moon/hooks/pre-push.sh new file mode 100755 index 00000000..84410733 --- /dev/null +++ b/.moon/hooks/pre-push.sh @@ -0,0 +1,8 @@ +#!/usr/bin/env bash +set -eo pipefail + +# Automatically generated by moon. DO NOT MODIFY! +# https://moonrepo.dev/docs/guides/vcs-hooks + +moon run :lint --affected --status=staged -- --staged --files-ignore-unknown=true --no-errors-on-unmatched + diff --git a/.moon/workspace.yml b/.moon/workspace.yml index c43dbcda..244b7031 100644 --- a/.moon/workspace.yml +++ b/.moon/workspace.yml @@ -38,4 +38,6 @@ vcs: # # --staged will run the operation only on the staged files that match the biome.jssonc::files.includes patterns # https://biomejs.dev/reference/cli/#biome-lint - - 'moon run :lint :format --affected --status=staged -- --staged --files-ignore-unknown=true --no-errors-on-unmatched' \ No newline at end of file + - 'moon run :format --affected --status=staged -- --staged --files-ignore-unknown=true --no-errors-on-unmatched' + pre-push: + - 'moon run :lint --affected --status=staged -- --staged --files-ignore-unknown=true --no-errors-on-unmatched' \ No newline at end of file From 075e78f40492d0a1a3fd983208994e5b4747ca63 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 03:47:09 +0200 Subject: [PATCH 16/28] chore: files cleanup --- common/config/rush/.pnpmfile.cjs | 39 - common/config/rush/common-versions.json | 43 - common/config/rush/pnpm-lock.yaml | 6549 ----------------------- common/config/rush/repo-state.json | 4 - common/git-hooks/pre-commit | 9 - common/git-hooks/pre-push | 19 - rush.json | 447 -- 7 files changed, 7110 deletions(-) delete mode 100644 common/config/rush/.pnpmfile.cjs delete mode 100644 common/config/rush/common-versions.json delete mode 100644 common/config/rush/pnpm-lock.yaml delete mode 100644 common/config/rush/repo-state.json delete mode 100755 common/git-hooks/pre-commit delete mode 100755 common/git-hooks/pre-push delete mode 100644 rush.json diff --git a/common/config/rush/.pnpmfile.cjs b/common/config/rush/.pnpmfile.cjs deleted file mode 100644 index bb0f651a..00000000 --- a/common/config/rush/.pnpmfile.cjs +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; - -/** - * When using the PNPM package manager, you can use pnpmfile.js to workaround - * dependencies that have mistakes in their package.json file. (This feature is - * functionally similar to Yarn's "resolutions".) - * - * For details, see the PNPM documentation: - * https://pnpm.js.org/docs/en/hooks.html - * - * IMPORTANT: SINCE THIS FILE CONTAINS EXECUTABLE CODE, MODIFYING IT IS LIKELY - * TO INVALIDATE ANY CACHED DEPENDENCY ANALYSIS. We recommend to run "rush update --full" - * after any modification to pnpmfile.js. - * - */ -module.exports = { - hooks: { - readPackage - } -}; - -/** - * This hook is invoked during installation before a package's dependencies - * are selected. - * The `packageJson` parameter is the deserialized package.json - * contents for the package that is about to be installed. - * The `context` parameter provides a log() function. - * The return value is the updated object. - */ -function readPackage(packageJson, context) { - - // // The karma types have a missing dependency on typings from the log4js package. - // if (packageJson.name === '@types/karma') { - // context.log('Fixed up dependencies for @types/karma'); - // packageJson.dependencies['log4js'] = '0.6.38'; - // } - - return packageJson; -} diff --git a/common/config/rush/common-versions.json b/common/config/rush/common-versions.json deleted file mode 100644 index d53e25a4..00000000 --- a/common/config/rush/common-versions.json +++ /dev/null @@ -1,43 +0,0 @@ -/** - * This configuration file specifies NPM dependency version selections that affect all projects - * in a Rush repo. For full documentation, please see https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/common-versions.schema.json", - - /** - * A table that specifies a "preferred version" for a dependency package. The "preferred version" - * is typically used to hold an indirect dependency back to a specific version, however generally - * it can be any SemVer range specifier (e.g. "~1.2.3"), and it will narrow any (compatible) - * SemVer range specifier. See the Rush documentation for details about this feature. - */ - "preferredVersions": { - - /** - * When someone asks for "^1.0.0" make sure they get "1.2.3" when working in this repo, - * instead of the latest version. - */ - // "some-library": "1.2.3" - }, - - /** - * The "rush check" command can be used to enforce that every project in the repo must specify - * the same SemVer range for a given dependency. However, sometimes exceptions are needed. - * The allowedAlternativeVersions table allows you to list other SemVer ranges that will be - * accepted by "rush check" for a given dependency. - * - * IMPORTANT: THIS TABLE IS FOR *ADDITIONAL* VERSION RANGES THAT ARE ALTERNATIVES TO THE - * USUAL VERSION (WHICH IS INFERRED BY LOOKING AT ALL PROJECTS IN THE REPO). - * This design avoids unnecessary churn in this file. - */ - "allowedAlternativeVersions": { - - /** - * For example, allow some projects to use an older TypeScript compiler - * (in addition to whatever "usual" version is being used by other projects in the repo): - */ - // "typescript": [ - // "~2.4.0" - // ] - } -} diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml deleted file mode 100644 index 24481cf5..00000000 --- a/common/config/rush/pnpm-lock.yaml +++ /dev/null @@ -1,6549 +0,0 @@ -lockfileVersion: '6.0' - -settings: - autoInstallPeers: false - excludeLinksFromLockfile: false - -importers: - - .: {} - - ../../modules/api: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - '@fastify/cors': - specifier: ^8.5.0 - version: 8.5.0 - ajv: - specifier: ^8.12.0 - version: 8.12.0 - ajv-errors: - specifier: ^3.0.0 - version: 3.0.0(ajv@8.12.0) - fastify: - specifier: ^4.25.2 - version: 4.25.2 - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/express': - specifier: ^4.17.21 - version: 4.17.21 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/cli: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - ajv: - specifier: ^8.12.0 - version: 8.12.0 - ajv-errors: - specifier: ^3.0.0 - version: 3.0.0(ajv@8.12.0) - ajv-formats: - specifier: ^2.1.1 - version: 2.1.1(ajv@8.12.0) - commander: - specifier: ^11.1.0 - version: 11.1.0 - dotenv: - specifier: ^16.3.1 - version: 16.3.1 - ora: - specifier: ^8.0.1 - version: 8.0.1 - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@fastify/cors': - specifier: ^8.5.0 - version: 8.5.0 - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - fastify: - specifier: ^4.25.2 - version: 4.25.2 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - type-fest: - specifier: ^4.9.0 - version: 4.9.0 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/common: - dependencies: - '@mikro-orm/core': - specifier: ^5.9.7 - version: 5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7) - '@mikro-orm/reflection': - specifier: ^5.9.7 - version: 5.9.7(@mikro-orm/core@5.9.7) - ajv: - specifier: ^8.12.0 - version: 8.12.0 - ajv-errors: - specifier: ^3.0.0 - version: 3.0.0(ajv@8.12.0) - pino: - specifier: ^8.17.2 - version: 8.17.2 - pino-pretty: - specifier: ^10.3.1 - version: 10.3.1 - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@fastify/cors': - specifier: ^8.5.0 - version: 8.5.0 - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/har-format': - specifier: ^1.2.15 - version: 1.2.15 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - fastify: - specifier: ^4.25.2 - version: 4.25.2 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - lighthouse: - specifier: ^11.4.0 - version: 11.4.0 - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - type-fest: - specifier: ^4.9.0 - version: 4.9.0 - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/greenit: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - greenit-cli: - specifier: github:cnumr/GreenIT-Analysis-cli#a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571 - version: github.com/cnumr/GreenIT-Analysis-cli/a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571 - puppeteer: - specifier: ^21.7.0 - version: 21.7.0(typescript@5.3.3) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/lighthouse: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - lighthouse: - specifier: ^11.4.0 - version: 11.4.0 - puppeteer: - specifier: ^21.7.0 - version: 21.7.0(typescript@5.3.3) - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/mysql: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - '@mikro-orm/core': - specifier: ^5.9.7 - version: 5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7) - '@mikro-orm/migrations': - specifier: ^5.9.7 - version: 5.9.7(@mikro-orm/core@5.9.7) - '@mikro-orm/mysql': - specifier: ^5.9.7 - version: 5.9.7(@mikro-orm/core@5.9.7)(@mikro-orm/migrations@5.9.7) - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@mikro-orm/cli': - specifier: ^5.9.7 - version: 5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7) - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - ts-node: - specifier: ^10.9.1 - version: 10.9.1(@types/node@18.19.6)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/observatory: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/slack: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - '@slack/web-api': - specifier: ^6.11.2 - version: 6.11.2 - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/ssllabs-server: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../modules/tpl: - dependencies: - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - devDependencies: - '@ecocode/eslint-plugin': - specifier: ^1.4.0 - version: 1.4.0(eslint@8.56.0) - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.11 - version: 29.5.11 - '@types/node': - specifier: ^18.19.6 - version: 18.19.6 - '@typescript-eslint/eslint-plugin': - specifier: ^6.18.1 - version: 6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/parser': - specifier: ^6.18.1 - version: 6.18.1(eslint@8.56.0)(typescript@5.3.3) - eslint: - specifier: ^8.56.0 - version: 8.56.0 - jest: - specifier: ^29.7.0 - version: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - rimraf: - specifier: ^5.0.5 - version: 5.0.5 - ts-jest: - specifier: ^29.1.1 - version: 29.1.1(jest@29.7.0)(typescript@5.3.3) - typescript: - specifier: ^5.3.3 - version: 5.3.3 - - ../../test: - dependencies: - '@fabernovel/heart-api': - specifier: workspace:^4.0.0 - version: link:../modules/api - '@fabernovel/heart-cli': - specifier: workspace:^4.0.0 - version: link:../modules/cli - '@fabernovel/heart-greenit': - specifier: workspace:^4.0.0 - version: link:../modules/greenit - '@fabernovel/heart-lighthouse': - specifier: workspace:^4.0.0 - version: link:../modules/lighthouse - '@fabernovel/heart-mysql': - specifier: workspace:^4.0.1 - version: link:../modules/mysql - '@fabernovel/heart-observatory': - specifier: workspace:^4.0.1 - version: link:../modules/observatory - '@fabernovel/heart-slack': - specifier: workspace:^4.0.1 - version: link:../modules/slack - '@fabernovel/heart-ssllabs-server': - specifier: workspace:^4.0.0 - version: link:../modules/ssllabs-server - -packages: - - /@aashutoshrathi/word-wrap@1.2.6: - resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} - engines: {node: '>=0.10.0'} - dev: true - - /@ampproject/remapping@2.2.1: - resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - dev: true - - /@babel/code-frame@7.22.13: - resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/highlight': 7.22.20 - chalk: 2.4.2 - - /@babel/compat-data@7.22.20: - resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.23.0: - resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-compilation-targets': 7.22.15 - '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) - '@babel/helpers': 7.23.1 - '@babel/parser': 7.23.0 - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 - convert-source-map: 2.0.0 - debug: 4.3.4 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.23.0: - resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - '@jridgewell/gen-mapping': 0.3.3 - '@jridgewell/trace-mapping': 0.3.19 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.22.15: - resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.22.20 - '@babel/helper-validator-option': 7.22.15 - browserslist: 4.22.1 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.22.20: - resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-function-name@7.23.0: - resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-hoist-variables@7.22.5: - resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-module-imports@7.22.15: - resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): - resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-module-imports': 7.22.15 - '@babel/helper-simple-access': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/helper-validator-identifier': 7.22.20 - dev: true - - /@babel/helper-plugin-utils@7.22.5: - resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-simple-access@7.22.5: - resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-split-export-declaration@7.22.6: - resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@babel/helper-string-parser@7.22.5: - resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helper-validator-identifier@7.22.20: - resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option@7.22.15: - resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/helpers@7.23.1: - resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.22.15 - '@babel/traverse': 7.23.0 - '@babel/types': 7.23.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/highlight@7.22.20: - resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.22.20 - chalk: 2.4.2 - js-tokens: 4.0.0 - - /@babel/parser@7.23.0: - resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} - engines: {node: '>=6.0.0'} - hasBin: true - dev: true - - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): - resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.23.0 - '@babel/helper-plugin-utils': 7.22.5 - dev: true - - /@babel/runtime@7.23.1: - resolution: {integrity: sha512-hC2v6p8ZSI/W0HUzh3V8C5g+NwSKzKPtJwSpTjwl0o297GP9+ZLQSkdvHz46CM3LqyoXxq+5G9komY+eSqSO0g==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.0 - dev: false - - /@babel/template@7.22.15: - resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - dev: true - - /@babel/traverse@7.23.0: - resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.22.13 - '@babel/generator': 7.23.0 - '@babel/helper-environment-visitor': 7.22.20 - '@babel/helper-function-name': 7.23.0 - '@babel/helper-hoist-variables': 7.22.5 - '@babel/helper-split-export-declaration': 7.22.6 - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - debug: 4.3.4 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/types@7.23.0: - resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.22.5 - '@babel/helper-validator-identifier': 7.22.20 - to-fast-properties: 2.0.0 - dev: true - - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - dev: true - - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} - engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 - dev: true - - /@ecocode/eslint-plugin@1.4.0(eslint@8.56.0): - resolution: {integrity: sha512-+OilksRsZVt2vsZkNw5tZ6qh85POaWfFy4pSvu0ITxWz4dRMWRKbLTw1L7wXHhXDCylfHyhlJLiiwB6rKWxFzQ==} - engines: {node: ^14.17.0 || ^16.0.0 || >= 18.0.0} - peerDependencies: - eslint: '>=7' - dependencies: - eslint: 8.56.0 - dev: true - - /@eslint-community/eslint-utils@4.4.0(eslint@8.56.0): - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - dependencies: - eslint: 8.56.0 - eslint-visitor-keys: 3.4.3 - dev: true - - /@eslint-community/regexpp@4.9.1: - resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} - engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - dev: true - - /@eslint/eslintrc@2.1.4: - resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - ajv: 6.12.6 - debug: 4.3.4 - espree: 9.6.1 - globals: 13.23.0 - ignore: 5.2.4 - import-fresh: 3.3.0 - js-yaml: 4.1.0 - minimatch: 3.1.2 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@eslint/js@8.56.0: - resolution: {integrity: sha512-gMsVel9D7f2HLkBma9VbtzZRehRogVRfbr++f06nL2vnCGCNlzOD+/MUov/F4p8myyAHspEhVobgjpX64q5m6A==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /@fast-csv/format@4.3.5: - resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} - dependencies: - '@types/node': 14.18.63 - lodash.escaperegexp: 4.1.2 - lodash.isboolean: 3.0.3 - lodash.isequal: 4.5.0 - lodash.isfunction: 3.0.9 - lodash.isnil: 4.0.0 - dev: false - - /@fast-csv/parse@4.3.6: - resolution: {integrity: sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==} - dependencies: - '@types/node': 14.18.63 - lodash.escaperegexp: 4.1.2 - lodash.groupby: 4.6.0 - lodash.isfunction: 3.0.9 - lodash.isnil: 4.0.0 - lodash.isundefined: 3.0.1 - lodash.uniq: 4.5.0 - dev: false - - /@fastify/ajv-compiler@3.5.0: - resolution: {integrity: sha512-ebbEtlI7dxXF5ziNdr05mOY8NnDiPB1XvAlLHctRt/Rc+C3LCOVW5imUVX+mhvUhnNzmPBHewUkOFgGlCxgdAA==} - dependencies: - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - fast-uri: 2.2.0 - - /@fastify/cors@8.5.0: - resolution: {integrity: sha512-/oZ1QSb02XjP0IK1U0IXktEsw/dUBTxJOW7IpIeO8c/tNalw/KjoNSJv1Sf6eqoBPO+TDGkifq6ynFK3v68HFQ==} - dependencies: - fastify-plugin: 4.5.1 - mnemonist: 0.39.6 - - /@fastify/deepmerge@1.3.0: - resolution: {integrity: sha512-J8TOSBq3SoZbDhM9+R/u77hP93gz/rajSA+K2kGyijPpORPWUXHUpTaleoj+92As0S9uPRP7Oi8IqMf0u+ro6A==} - - /@fastify/error@3.4.0: - resolution: {integrity: sha512-e/mafFwbK3MNqxUcFBLgHhgxsF8UT1m8aj0dAlqEa2nJEgPsRtpHTZ3ObgrgkZ2M1eJHPTwgyUl/tXkvabsZdQ==} - - /@fastify/fast-json-stringify-compiler@4.3.0: - resolution: {integrity: sha512-aZAXGYo6m22Fk1zZzEUKBvut/CIIQe/BapEORnxiD5Qr0kPHqqI69NtEMCme74h+at72sPhbkb4ZrLd1W3KRLA==} - dependencies: - fast-json-stringify: 5.8.0 - - /@formatjs/ecma402-abstract@1.18.0: - resolution: {integrity: sha512-PEVLoa3zBevWSCZzPIM/lvPCi8P5l4G+NXQMc/CjEiaCWgyHieUoo0nM7Bs0n/NbuQ6JpXEolivQ9pKSBHaDlA==} - dependencies: - '@formatjs/intl-localematcher': 0.5.2 - tslib: 2.6.2 - - /@formatjs/fast-memoize@2.2.0: - resolution: {integrity: sha512-hnk/nY8FyrL5YxwP9e4r9dqeM6cAbo8PeU9UjyXojZMNvVad2Z06FAVHyR3Ecw6fza+0GH7vdJgiKIVXTMbSBA==} - dependencies: - tslib: 2.6.2 - - /@formatjs/icu-messageformat-parser@2.7.3: - resolution: {integrity: sha512-X/jy10V9S/vW+qlplqhMUxR8wErQ0mmIYSq4mrjpjDl9mbuGcCILcI1SUYkL5nlM4PJqpc0KOS0bFkkJNPxYRw==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - '@formatjs/icu-skeleton-parser': 1.7.0 - tslib: 2.6.2 - - /@formatjs/icu-skeleton-parser@1.7.0: - resolution: {integrity: sha512-Cfdo/fgbZzpN/jlN/ptQVe0lRHora+8ezrEeg2RfrNjyp+YStwBy7cqDY8k5/z2LzXg6O0AdzAV91XS0zIWv+A==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - tslib: 2.6.2 - - /@formatjs/intl-localematcher@0.5.2: - resolution: {integrity: sha512-txaaE2fiBMagLrR4jYhxzFO6wEdEG4TPMqrzBAcbr4HFUYzH/YC+lg6OIzKCHm8WgDdyQevxbAAV1OgcXctuGw==} - dependencies: - tslib: 2.6.2 - - /@humanwhocodes/config-array@0.11.14: - resolution: {integrity: sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==} - engines: {node: '>=10.10.0'} - dependencies: - '@humanwhocodes/object-schema': 2.0.2 - debug: 4.3.4 - minimatch: 3.1.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@humanwhocodes/module-importer@1.0.1: - resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} - engines: {node: '>=12.22'} - dev: true - - /@humanwhocodes/object-schema@2.0.2: - resolution: {integrity: sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==} - dev: true - - /@isaacs/cliui@8.0.2: - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - dependencies: - string-width: 5.1.2 - string-width-cjs: /string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: /strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: /wrap-ansi@7.0.0 - - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - - /@jercle/yargonaut@1.1.5: - resolution: {integrity: sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==} - dependencies: - chalk: 4.1.2 - figlet: 1.6.0 - parent-require: 1.0.0 - dev: true - - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - dev: true - - /@jest/core@29.7.0(ts-node@10.9.1): - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - jest-mock: 29.7.0 - dev: true - - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - dev: true - - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.6 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - '@types/node': 18.19.6 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.0 - istanbul-lib-instrument: 6.0.1 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.6 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.1.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/schemas@29.6.3: - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@sinclair/typebox': 0.27.8 - dev: true - - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.19 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - dev: true - - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.23.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.19 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.5 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.4 - '@types/istanbul-reports': 3.0.2 - '@types/node': 18.19.6 - '@types/yargs': 17.0.28 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - dev: true - - /@jridgewell/resolve-uri@3.1.1: - resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/set-array@1.1.2: - resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} - engines: {node: '>=6.0.0'} - dev: true - - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.19: - resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@jridgewell/trace-mapping@0.3.9: - resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.1 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - - /@mikro-orm/cli@5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7): - resolution: {integrity: sha512-RHMep4lOFRqniz3m97/JXl5DNFhZbGMpTtjw6C1ITYI9ZwWsSZbfBUTGy+PQTZKl9OinFoyR6E/Os/gj8y+NUg==} - engines: {node: '>= 14.0.0'} - hasBin: true - peerDependencies: - '@mikro-orm/better-sqlite': ^5.0.0 - '@mikro-orm/entity-generator': ^5.0.0 - '@mikro-orm/mariadb': ^5.0.0 - '@mikro-orm/migrations': ^5.0.0 - '@mikro-orm/migrations-mongodb': ^5.0.0 - '@mikro-orm/mongodb': ^5.0.0 - '@mikro-orm/mysql': ^5.0.0 - '@mikro-orm/postgresql': ^5.0.0 - '@mikro-orm/seeder': ^5.0.0 - '@mikro-orm/sqlite': ^5.0.0 - peerDependenciesMeta: - '@mikro-orm/better-sqlite': - optional: true - '@mikro-orm/entity-generator': - optional: true - '@mikro-orm/mariadb': - optional: true - '@mikro-orm/migrations': - optional: true - '@mikro-orm/migrations-mongodb': - optional: true - '@mikro-orm/mongodb': - optional: true - '@mikro-orm/mysql': - optional: true - '@mikro-orm/postgresql': - optional: true - '@mikro-orm/seeder': - optional: true - '@mikro-orm/sqlite': - optional: true - dependencies: - '@jercle/yargonaut': 1.1.5 - '@mikro-orm/core': 5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7) - '@mikro-orm/knex': 5.9.7(@mikro-orm/core@5.9.7)(@mikro-orm/migrations@5.9.7)(mysql2@3.6.2) - '@mikro-orm/migrations': 5.9.7(@mikro-orm/core@5.9.7) - '@mikro-orm/mysql': 5.9.7(@mikro-orm/core@5.9.7)(@mikro-orm/migrations@5.9.7) - fs-extra: 11.1.1 - tsconfig-paths: 4.2.0 - yargs: 17.7.2 - transitivePeerDependencies: - - better-sqlite3 - - mssql - - mysql - - mysql2 - - pg - - pg-native - - sqlite3 - - supports-color - - tedious - dev: true - - /@mikro-orm/core@5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7): - resolution: {integrity: sha512-VzbpJPQlwuK6Q/4FkppWNGKvzyYL31Gsw/qskr/GCa/010yLO8u3RQio/Q1EKRi+tNsjhqTPGA1b7OOM+DvpiQ==} - engines: {node: '>= 14.0.0'} - peerDependencies: - '@mikro-orm/better-sqlite': ^5.0.0 - '@mikro-orm/entity-generator': ^5.0.0 - '@mikro-orm/mariadb': ^5.0.0 - '@mikro-orm/migrations': ^5.0.0 - '@mikro-orm/migrations-mongodb': ^5.0.0 - '@mikro-orm/mongodb': ^5.0.0 - '@mikro-orm/mysql': ^5.0.0 - '@mikro-orm/postgresql': ^5.0.0 - '@mikro-orm/seeder': ^5.0.0 - '@mikro-orm/sqlite': ^5.0.0 - peerDependenciesMeta: - '@mikro-orm/better-sqlite': - optional: true - '@mikro-orm/entity-generator': - optional: true - '@mikro-orm/mariadb': - optional: true - '@mikro-orm/migrations': - optional: true - '@mikro-orm/migrations-mongodb': - optional: true - '@mikro-orm/mongodb': - optional: true - '@mikro-orm/mysql': - optional: true - '@mikro-orm/postgresql': - optional: true - '@mikro-orm/seeder': - optional: true - '@mikro-orm/sqlite': - optional: true - dependencies: - '@mikro-orm/migrations': 5.9.7(@mikro-orm/core@5.9.7) - '@mikro-orm/mysql': 5.9.7(@mikro-orm/core@5.9.7)(@mikro-orm/migrations@5.9.7) - acorn-loose: 8.3.0 - acorn-walk: 8.2.0 - dotenv: 16.3.1 - fs-extra: 11.1.1 - globby: 11.1.0 - mikro-orm: 5.9.7 - reflect-metadata: 0.1.13 - - /@mikro-orm/knex@5.9.7(@mikro-orm/core@5.9.7)(@mikro-orm/migrations@5.9.7)(mysql2@3.6.2): - resolution: {integrity: sha512-LmyoXPXrEtTJ4/D/2/ppWMjRxIHwyk/E/2SNz28/fmN+nK9of6Sqa0ql6M0WJRNxYOxLiVOGZWy1fGJAGW3lCg==} - engines: {node: '>= 14.0.0'} - peerDependencies: - '@mikro-orm/core': ^5.0.0 - '@mikro-orm/entity-generator': ^5.0.0 - '@mikro-orm/migrations': ^5.0.0 - better-sqlite3: '*' - mssql: '*' - mysql: '*' - mysql2: '*' - pg: '*' - sqlite3: '*' - peerDependenciesMeta: - '@mikro-orm/entity-generator': - optional: true - '@mikro-orm/migrations': - optional: true - better-sqlite3: - optional: true - mssql: - optional: true - mysql: - optional: true - mysql2: - optional: true - pg: - optional: true - sqlite3: - optional: true - dependencies: - '@mikro-orm/core': 5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7) - '@mikro-orm/migrations': 5.9.7(@mikro-orm/core@5.9.7) - fs-extra: 11.1.1 - knex: 2.5.1(mysql2@3.6.2) - mysql2: 3.6.2 - sqlstring: 2.3.3 - transitivePeerDependencies: - - pg-native - - supports-color - - tedious - - /@mikro-orm/migrations@5.9.7(@mikro-orm/core@5.9.7): - resolution: {integrity: sha512-5CFVIwmGMxN7p7Rs3KRQmYlDVy47DN2MJQqtDOSVG9ww0xzOP0suCLDA/yRG1uFcPnTn/Ru6lwAH6nllqV75FQ==} - engines: {node: '>= 14.0.0'} - peerDependencies: - '@mikro-orm/core': ^5.0.0 - dependencies: - '@mikro-orm/core': 5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7) - '@mikro-orm/knex': 5.9.7(@mikro-orm/core@5.9.7)(@mikro-orm/migrations@5.9.7)(mysql2@3.6.2) - fs-extra: 11.1.1 - knex: 2.5.1(mysql2@3.6.2) - umzug: 3.3.1 - transitivePeerDependencies: - - '@mikro-orm/entity-generator' - - better-sqlite3 - - mssql - - mysql - - mysql2 - - pg - - pg-native - - sqlite3 - - supports-color - - tedious - - /@mikro-orm/mysql@5.9.7(@mikro-orm/core@5.9.7)(@mikro-orm/migrations@5.9.7): - resolution: {integrity: sha512-jAgyNRAqSab6OHSdm7CB7+mhSImguHY2AR52XKfSHY1WoSCTxxaUtXheTc31spsBda1bSplWgC8Bjtr/F7sx6Q==} - engines: {node: '>= 14.0.0'} - peerDependencies: - '@mikro-orm/core': ^5.0.0 - '@mikro-orm/entity-generator': ^5.0.0 - '@mikro-orm/migrations': ^5.0.0 - '@mikro-orm/seeder': ^5.0.0 - peerDependenciesMeta: - '@mikro-orm/entity-generator': - optional: true - '@mikro-orm/migrations': - optional: true - '@mikro-orm/seeder': - optional: true - dependencies: - '@mikro-orm/core': 5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7) - '@mikro-orm/knex': 5.9.7(@mikro-orm/core@5.9.7)(@mikro-orm/migrations@5.9.7)(mysql2@3.6.2) - '@mikro-orm/migrations': 5.9.7(@mikro-orm/core@5.9.7) - mysql2: 3.6.2 - transitivePeerDependencies: - - better-sqlite3 - - mssql - - mysql - - pg - - pg-native - - sqlite3 - - supports-color - - tedious - - /@mikro-orm/reflection@5.9.7(@mikro-orm/core@5.9.7): - resolution: {integrity: sha512-LUyF/vtVy2ctVsUsKlzfOhHSvh3dgVa+san7MPn8JGnTchYA1vQDQ6vHtaACtKPp+JHS7MmxdiVsr7pighkzzw==} - engines: {node: '>= 14.0.0'} - peerDependencies: - '@mikro-orm/core': ^5.0.0 - dependencies: - '@mikro-orm/core': 5.9.7(@mikro-orm/migrations@5.9.7)(@mikro-orm/mysql@5.9.7) - globby: 11.1.0 - ts-morph: 20.0.0 - dev: false - - /@nodelib/fs.scandir@2.1.5: - resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - run-parallel: 1.2.0 - - /@nodelib/fs.stat@2.0.5: - resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} - engines: {node: '>= 8'} - - /@nodelib/fs.walk@1.2.8: - resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} - engines: {node: '>= 8'} - dependencies: - '@nodelib/fs.scandir': 2.1.5 - fastq: 1.15.0 - - /@pkgjs/parseargs@0.11.0: - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - requiresBuild: true - optional: true - - /@puppeteer/browsers@1.9.1: - resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} - engines: {node: '>=16.3.0'} - hasBin: true - dependencies: - debug: 4.3.4 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.3.1 - tar-fs: 3.0.4 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - - /@rushstack/ts-command-line@4.16.1: - resolution: {integrity: sha512-+OCsD553GYVLEmz12yiFjMOzuPeCiZ3f8wTiFHL30ZVXexTyPmgjwXEhg2K2P0a2lVf+8YBy7WtPoflB2Fp8/A==} - dependencies: - '@types/argparse': 1.0.38 - argparse: 1.0.10 - colors: 1.2.5 - string-argv: 0.3.2 - - /@sentry/core@6.19.7: - resolution: {integrity: sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==} - engines: {node: '>=6'} - dependencies: - '@sentry/hub': 6.19.7 - '@sentry/minimal': 6.19.7 - '@sentry/types': 6.19.7 - '@sentry/utils': 6.19.7 - tslib: 1.14.1 - - /@sentry/hub@6.19.7: - resolution: {integrity: sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==} - engines: {node: '>=6'} - dependencies: - '@sentry/types': 6.19.7 - '@sentry/utils': 6.19.7 - tslib: 1.14.1 - - /@sentry/minimal@6.19.7: - resolution: {integrity: sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==} - engines: {node: '>=6'} - dependencies: - '@sentry/hub': 6.19.7 - '@sentry/types': 6.19.7 - tslib: 1.14.1 - - /@sentry/node@6.19.7: - resolution: {integrity: sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==} - engines: {node: '>=6'} - dependencies: - '@sentry/core': 6.19.7 - '@sentry/hub': 6.19.7 - '@sentry/types': 6.19.7 - '@sentry/utils': 6.19.7 - cookie: 0.4.2 - https-proxy-agent: 5.0.1 - lru_map: 0.3.3 - tslib: 1.14.1 - transitivePeerDependencies: - - supports-color - - /@sentry/types@6.19.7: - resolution: {integrity: sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==} - engines: {node: '>=6'} - - /@sentry/utils@6.19.7: - resolution: {integrity: sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==} - engines: {node: '>=6'} - dependencies: - '@sentry/types': 6.19.7 - tslib: 1.14.1 - - /@sinclair/typebox@0.27.8: - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - dev: true - - /@sindresorhus/is@4.6.0: - resolution: {integrity: sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==} - engines: {node: '>=10'} - dev: false - - /@sinonjs/commons@3.0.0: - resolution: {integrity: sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.0 - dev: true - - /@slack/logger@3.0.0: - resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - dependencies: - '@types/node': 18.19.6 - dev: false - - /@slack/types@2.11.0: - resolution: {integrity: sha512-UlIrDWvuLaDly3QZhCPnwUSI/KYmV1N9LyhuH6EDKCRS1HWZhyTG3Ja46T3D0rYfqdltKYFXbJSSRPwZpwO0cQ==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - dev: false - - /@slack/web-api@6.11.2: - resolution: {integrity: sha512-s4qCQGXasr8jpCf/+6+V/smq+Z2RX7EIBnJeO/xe7Luie1nyBihFMgjICNyvzWoWBdaGntSnn5CcZdFm4ItBWg==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} - dependencies: - '@slack/logger': 3.0.0 - '@slack/types': 2.11.0 - '@types/is-stream': 1.1.0 - '@types/node': 18.19.6 - axios: 1.6.5 - eventemitter3: 3.1.2 - form-data: 2.5.1 - is-electron: 2.2.2 - is-stream: 1.1.0 - p-queue: 6.6.2 - p-retry: 4.6.2 - transitivePeerDependencies: - - debug - dev: false - - /@szmarczak/http-timer@4.0.6: - resolution: {integrity: sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==} - engines: {node: '>=10'} - dependencies: - defer-to-connect: 2.0.1 - dev: false - - /@tootallnate/once@1.1.2: - resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} - engines: {node: '>= 6'} - dev: false - - /@tootallnate/quickjs-emscripten@0.23.0: - resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} - - /@ts-morph/common@0.21.0: - resolution: {integrity: sha512-ES110Mmne5Vi4ypUKrtVQfXFDtCsDXiUiGxF6ILVlE90dDD4fdpC1LSjydl/ml7xJWKSDZwUYD2zkOePMSrPBA==} - dependencies: - fast-glob: 3.3.1 - minimatch: 7.4.6 - mkdirp: 2.1.6 - path-browserify: 1.0.1 - dev: false - - /@tsconfig/node10@1.0.9: - resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} - dev: true - - /@tsconfig/node12@1.0.11: - resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} - dev: true - - /@tsconfig/node14@1.0.3: - resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} - dev: true - - /@tsconfig/node16@1.0.4: - resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} - dev: true - - /@types/argparse@1.0.38: - resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - - /@types/babel__core@7.20.2: - resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} - dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - '@types/babel__generator': 7.6.5 - '@types/babel__template': 7.4.2 - '@types/babel__traverse': 7.20.2 - dev: true - - /@types/babel__generator@7.6.5: - resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@types/babel__template@7.4.2: - resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} - dependencies: - '@babel/parser': 7.23.0 - '@babel/types': 7.23.0 - dev: true - - /@types/babel__traverse@7.20.2: - resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} - dependencies: - '@babel/types': 7.23.0 - dev: true - - /@types/body-parser@1.19.3: - resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} - dependencies: - '@types/connect': 3.4.36 - '@types/node': 18.19.6 - dev: true - - /@types/cacheable-request@6.0.3: - resolution: {integrity: sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==} - dependencies: - '@types/http-cache-semantics': 4.0.2 - '@types/keyv': 3.1.4 - '@types/node': 18.19.6 - '@types/responselike': 1.0.1 - dev: false - - /@types/connect@3.4.36: - resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} - dependencies: - '@types/node': 18.19.6 - dev: true - - /@types/express-serve-static-core@4.17.37: - resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} - dependencies: - '@types/node': 18.19.6 - '@types/qs': 6.9.8 - '@types/range-parser': 1.2.5 - '@types/send': 0.17.2 - dev: true - - /@types/express@4.17.21: - resolution: {integrity: sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==} - dependencies: - '@types/body-parser': 1.19.3 - '@types/express-serve-static-core': 4.17.37 - '@types/qs': 6.9.8 - '@types/serve-static': 1.15.3 - dev: true - - /@types/graceful-fs@4.1.7: - resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} - dependencies: - '@types/node': 18.19.6 - dev: true - - /@types/har-format@1.2.15: - resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} - dev: true - - /@types/http-cache-semantics@4.0.2: - resolution: {integrity: sha512-FD+nQWA2zJjh4L9+pFXqWOi0Hs1ryBCfI+985NjluQ1p8EYtoLvjLOKidXBtZ4/IcxDX4o8/E8qDS3540tNliw==} - dev: false - - /@types/http-errors@2.0.2: - resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} - dev: true - - /@types/is-stream@1.1.0: - resolution: {integrity: sha512-jkZatu4QVbR60mpIzjINmtS1ZF4a/FqdTUTBeQDVOQ2PYyidtwFKr0B5G6ERukKwliq+7mIXvxyppwzG5EgRYg==} - dependencies: - '@types/node': 18.19.6 - dev: false - - /@types/istanbul-lib-coverage@2.0.4: - resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} - dev: true - - /@types/istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.4 - dev: true - - /@types/istanbul-reports@3.0.2: - resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} - dependencies: - '@types/istanbul-lib-report': 3.0.1 - dev: true - - /@types/jest@29.5.11: - resolution: {integrity: sha512-S2mHmYIVe13vrm6q4kN6fLYYAka15ALQki/vgDC3mIukEOx8WJlv0kQPM+d4w8Gp6u0uSdKND04IlTXBv0rwnQ==} - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - dev: true - - /@types/json-schema@7.0.13: - resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} - dev: true - - /@types/keyv@3.1.4: - resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} - dependencies: - '@types/node': 18.19.6 - dev: false - - /@types/mime@1.3.3: - resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} - dev: true - - /@types/mime@3.0.2: - resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} - dev: true - - /@types/node@14.18.63: - resolution: {integrity: sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==} - dev: false - - /@types/node@18.19.6: - resolution: {integrity: sha512-X36s5CXMrrJOs2lQCdDF68apW4Rfx9ixYMawlepwmE4Anezv/AV2LSpKD1Ub8DAc+urp5bk0BGZ6NtmBitfnsg==} - dependencies: - undici-types: 5.26.5 - - /@types/qs@6.9.8: - resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} - dev: true - - /@types/range-parser@1.2.5: - resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} - dev: true - - /@types/responselike@1.0.1: - resolution: {integrity: sha512-TiGnitEDxj2X0j+98Eqk5lv/Cij8oHd32bU4D/Yw6AOq7vvTk0gSD2GPj0G/HkvhMoVsdlhYF4yqqlyPBTM6Sg==} - dependencies: - '@types/node': 18.19.6 - dev: false - - /@types/retry@0.12.0: - resolution: {integrity: sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==} - dev: false - - /@types/semver@7.5.3: - resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} - dev: true - - /@types/send@0.17.2: - resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} - dependencies: - '@types/mime': 1.3.3 - '@types/node': 18.19.6 - dev: true - - /@types/serve-static@1.15.3: - resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} - dependencies: - '@types/http-errors': 2.0.2 - '@types/mime': 3.0.2 - '@types/node': 18.19.6 - dev: true - - /@types/stack-utils@2.0.1: - resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} - dev: true - - /@types/yargs-parser@21.0.1: - resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} - dev: true - - /@types/yargs@17.0.28: - resolution: {integrity: sha512-N3e3fkS86hNhtk6BEnc0rj3zcehaxx8QWhCROJkqpl5Zaoi7nAic3jH8q94jVD3zu5LGk+PUB6KAiDmimYOEQw==} - dependencies: - '@types/yargs-parser': 21.0.1 - dev: true - - /@types/yauzl@2.10.1: - resolution: {integrity: sha512-CHzgNU3qYBnp/O4S3yv2tXPlvMTq0YWSTVg2/JYLqWZGHwwgJGAwd00poay/11asPq8wLFwHzubyInqHIFmmiw==} - requiresBuild: true - dependencies: - '@types/node': 18.19.6 - optional: true - - /@typescript-eslint/eslint-plugin@6.18.1(@typescript-eslint/parser@6.18.1)(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-nISDRYnnIpk7VCFrGcu1rnZfM1Dh9LRHnfgdkjcbi/l7g16VYRri3TjXi9Ir4lOZSw5N/gnV/3H7jIPQ8Q4daA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - '@typescript-eslint/parser': ^6.0.0 || ^6.0.0-alpha - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@eslint-community/regexpp': 4.9.1 - '@typescript-eslint/parser': 6.18.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/scope-manager': 6.18.1 - '@typescript-eslint/type-utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.18.1 - debug: 4.3.4 - eslint: 8.56.0 - graphemer: 1.4.0 - ignore: 5.2.4 - natural-compare: 1.4.0 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/parser@6.18.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-zct/MdJnVaRRNy9e84XnVtRv9Vf91/qqe+hZJtKanjojud4wAVy/7lXxJmMyX6X6J+xc6c//YEWvpeif8cAhWA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/scope-manager': 6.18.1 - '@typescript-eslint/types': 6.18.1 - '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) - '@typescript-eslint/visitor-keys': 6.18.1 - debug: 4.3.4 - eslint: 8.56.0 - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/scope-manager@6.18.1: - resolution: {integrity: sha512-BgdBwXPFmZzaZUuw6wKiHKIovms97a7eTImjkXCZE04TGHysG+0hDQPmygyvgtkoB/aOQwSM/nWv3LzrOIQOBw==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.18.1 - '@typescript-eslint/visitor-keys': 6.18.1 - dev: true - - /@typescript-eslint/type-utils@6.18.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-wyOSKhuzHeU/5pcRDP2G2Ndci+4g653V43gXTpt4nbyoIOAASkGDA9JIAgbQCdCkcr1MvpSYWzxTz0olCn8+/Q==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) - '@typescript-eslint/utils': 6.18.1(eslint@8.56.0)(typescript@5.3.3) - debug: 4.3.4 - eslint: 8.56.0 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/types@6.18.1: - resolution: {integrity: sha512-4TuMAe+tc5oA7wwfqMtB0Y5OrREPF1GeJBAjqwgZh1lEMH5PJQgWgHGfYufVB51LtjD+peZylmeyxUXPfENLCw==} - engines: {node: ^16.0.0 || >=18.0.0} - dev: true - - /@typescript-eslint/typescript-estree@6.18.1(typescript@5.3.3): - resolution: {integrity: sha512-fv9B94UAhywPRhUeeV/v+3SBDvcPiLxRZJw/xZeeGgRLQZ6rLMG+8krrJUyIf6s1ecWTzlsbp0rlw7n9sjufHA==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - '@typescript-eslint/types': 6.18.1 - '@typescript-eslint/visitor-keys': 6.18.1 - debug: 4.3.4 - globby: 11.1.0 - is-glob: 4.0.3 - minimatch: 9.0.3 - semver: 7.5.4 - ts-api-utils: 1.0.3(typescript@5.3.3) - typescript: 5.3.3 - transitivePeerDependencies: - - supports-color - dev: true - - /@typescript-eslint/utils@6.18.1(eslint@8.56.0)(typescript@5.3.3): - resolution: {integrity: sha512-zZmTuVZvD1wpoceHvoQpOiewmWu3uP9FuTWo8vqpy2ffsmfCE8mklRPi+vmnIYAIk9t/4kOThri2QCDgor+OpQ==} - engines: {node: ^16.0.0 || >=18.0.0} - peerDependencies: - eslint: ^7.0.0 || ^8.0.0 - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@types/json-schema': 7.0.13 - '@types/semver': 7.5.3 - '@typescript-eslint/scope-manager': 6.18.1 - '@typescript-eslint/types': 6.18.1 - '@typescript-eslint/typescript-estree': 6.18.1(typescript@5.3.3) - eslint: 8.56.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - - typescript - dev: true - - /@typescript-eslint/visitor-keys@6.18.1: - resolution: {integrity: sha512-/kvt0C5lRqGoCfsbmm7/CwMqoSkY3zzHLIjdhHZQW3VFrnz7ATecOHR7nb7V+xn4286MBxfnQfQhAmCI0u+bJA==} - engines: {node: ^16.0.0 || >=18.0.0} - dependencies: - '@typescript-eslint/types': 6.18.1 - eslint-visitor-keys: 3.4.3 - dev: true - - /@ultraq/array-utils@2.1.0: - resolution: {integrity: sha512-TKO1zE6foqs5HG3+QH32yKwJ0zhZrm6J3UmltscveQmxCdbgIPXhNf3A8C9HakjyZDHVRK5pYZOU0tTl28YGFg==} - engines: {node: '>=10'} - dev: false - - /@ultraq/dom-utils@0.4.0: - resolution: {integrity: sha512-SZmHIvp7C8UXAPtgO6e0lKfkVzEJfWGdmLoHGwhk5+v0rxVo4Z3TQT4svRpFq42Pj3sXGhXU7jyWCoeWrrkdLA==} - engines: {node: '>=10.0.0'} - dev: false - - /@ultraq/string-utils@2.1.0: - resolution: {integrity: sha512-936LzGXW2R5/rG0vVhstr7l5v05TEjjm9SyJdQsvCfKuPF0UzWVfp77ViZIm32fH/zzzmEFEWzcZEcy7DE5+Yw==} - engines: {node: '>=10'} - dev: false - - /@ungap/structured-clone@1.2.0: - resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} - dev: true - - /abab@2.0.6: - resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} - dev: false - - /abort-controller@3.0.0: - resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} - engines: {node: '>=6.5'} - dependencies: - event-target-shim: 5.0.1 - - /abstract-logging@2.0.1: - resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} - - /acorn-globals@6.0.0: - resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} - dependencies: - acorn: 7.4.1 - acorn-walk: 7.2.0 - dev: false - - /acorn-jsx@5.3.2(acorn@8.10.0): - resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} - peerDependencies: - acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - dependencies: - acorn: 8.10.0 - dev: true - - /acorn-loose@8.3.0: - resolution: {integrity: sha512-75lAs9H19ldmW+fAbyqHdjgdCrz0pWGXKmnqFoh8PyVd1L2RIb4RzYrSjmopeqv3E1G3/Pimu6GgLlrGbrkF7w==} - engines: {node: '>=0.4.0'} - dependencies: - acorn: 8.10.0 - - /acorn-walk@7.2.0: - resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} - engines: {node: '>=0.4.0'} - dev: false - - /acorn-walk@8.2.0: - resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} - engines: {node: '>=0.4.0'} - - /acorn@7.4.1: - resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} - engines: {node: '>=0.4.0'} - hasBin: true - dev: false - - /acorn@8.10.0: - resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} - engines: {node: '>=0.4.0'} - hasBin: true - - /agent-base@5.1.1: - resolution: {integrity: sha512-TMeqbNl2fMW0nMjTEPOwe3J/PRFP4vqeoNuQMG0HlMrtm5QxKqdvAkZ1pRBQ/ulIyDD5Yq0nJ7YbdD8ey0TO3g==} - engines: {node: '>= 6.0.0'} - dev: false - - /agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - /agent-base@7.1.0: - resolution: {integrity: sha512-o/zjMZRhJxny7OyEF+Op8X+efiELC7k7yOjMzgfzVqOzXqkBkWI79YoTdOtsuWd5BWhAGAuOY/Xa6xpiaWXiNg==} - engines: {node: '>= 14'} - dependencies: - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - /ajv-errors@3.0.0(ajv@8.12.0): - resolution: {integrity: sha512-V3wD15YHfHz6y0KdhYFjyy9vWtEVALT9UrxfN3zqlI6dMioHnJrqOYfyPKol3oqrnCM9uwkcdCwkJ0WUcbLMTQ==} - peerDependencies: - ajv: ^8.0.1 - dependencies: - ajv: 8.12.0 - dev: false - - /ajv-formats@2.1.1(ajv@8.12.0): - resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} - peerDependencies: - ajv: ^8.0.0 - peerDependenciesMeta: - ajv: - optional: true - dependencies: - ajv: 8.12.0 - - /ajv@6.12.6: - resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} - dependencies: - fast-deep-equal: 3.1.3 - fast-json-stable-stringify: 2.1.0 - json-schema-traverse: 0.4.1 - uri-js: 4.4.1 - dev: true - - /ajv@8.12.0: - resolution: {integrity: sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==} - dependencies: - fast-deep-equal: 3.1.3 - json-schema-traverse: 1.0.0 - require-from-string: 2.0.2 - uri-js: 4.4.1 - - /ansi-colors@4.1.3: - resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} - engines: {node: '>=6'} - - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - - /ansi-regex@5.0.1: - resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} - engines: {node: '>=8'} - - /ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - - /ansi-styles@3.2.1: - resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} - engines: {node: '>=4'} - dependencies: - color-convert: 1.9.3 - - /ansi-styles@4.3.0: - resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} - engines: {node: '>=8'} - dependencies: - color-convert: 2.0.1 - - /ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - dev: true - - /ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - - /archiver-utils@2.1.0: - resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} - engines: {node: '>= 6'} - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 2.3.8 - dev: false - - /archiver-utils@3.0.4: - resolution: {integrity: sha512-KVgf4XQVrTjhyWmx6cte4RxonPLR9onExufI1jhvw/MQ4BB6IsZD5gT8Lq+u/+pRkWna/6JoHpiQioaqFP5Rzw==} - engines: {node: '>= 10'} - dependencies: - glob: 7.2.3 - graceful-fs: 4.2.11 - lazystream: 1.0.1 - lodash.defaults: 4.2.0 - lodash.difference: 4.5.0 - lodash.flatten: 4.4.0 - lodash.isplainobject: 4.0.6 - lodash.union: 4.6.0 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - dev: false - - /archiver@5.3.2: - resolution: {integrity: sha512-+25nxyyznAXF7Nef3y0EbBeqmGZgeN/BxHX29Rs39djAfaFalmQ89SE6CWyDCHzGL0yt/ycBtNOmGTW0FyGWNw==} - engines: {node: '>= 10'} - dependencies: - archiver-utils: 2.1.0 - async: 3.2.4 - buffer-crc32: 0.2.13 - readable-stream: 3.6.2 - readdir-glob: 1.1.3 - tar-stream: 2.2.0 - zip-stream: 4.1.1 - dev: false - - /archy@1.0.0: - resolution: {integrity: sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==} - - /arg@4.1.3: - resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} - dev: true - - /argparse@1.0.10: - resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} - dependencies: - sprintf-js: 1.0.3 - - /argparse@2.0.1: - resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} - - /array-union@2.1.0: - resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} - engines: {node: '>=8'} - - /ast-types@0.13.4: - resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} - engines: {node: '>=4'} - dependencies: - tslib: 2.6.2 - - /async@0.2.10: - resolution: {integrity: sha512-eAkdoKxU6/LkKDBzLpT+t6Ff5EtfSF4wx1WfJiPEEV7WNLnDaRXk0oVysiEPm262roaachGexwUv94WhSgN5TQ==} - dev: false - - /async@3.2.4: - resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} - dev: false - - /asynckit@0.4.0: - resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} - dev: false - - /atomic-sleep@1.0.0: - resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} - engines: {node: '>=8.0.0'} - - /avvio@8.2.1: - resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} - dependencies: - archy: 1.0.0 - debug: 4.3.4 - fastq: 1.15.0 - transitivePeerDependencies: - - supports-color - - /axe-core@4.8.2: - resolution: {integrity: sha512-/dlp0fxyM3R8YW7MFzaHWXrf4zzbr0vaYb23VBFCl83R7nWNPg/yaQw2Dc8jzCMmDVLhSdzH8MjrsuIUuvX+6g==} - engines: {node: '>=4'} - - /axios@0.21.4: - resolution: {integrity: sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==} - dependencies: - follow-redirects: 1.15.3 - transitivePeerDependencies: - - debug - dev: false - - /axios@1.6.5: - resolution: {integrity: sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg==} - dependencies: - follow-redirects: 1.15.5 - form-data: 4.0.0 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - dev: false - - /b4a@1.6.4: - resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - - /babel-jest@29.7.0(@babel/core@7.23.0): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.23.0 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.2 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.23.0) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.22.5 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.22.15 - '@babel/types': 7.23.0 - '@types/babel__core': 7.20.2 - '@types/babel__traverse': 7.20.2 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.0): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.23.0): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.23.0 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) - dev: true - - /balanced-match@1.0.2: - resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - - /base64-js@1.5.1: - resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - - /basic-ftp@5.0.3: - resolution: {integrity: sha512-QHX8HLlncOLpy54mh+k/sWIFd0ThmRqwe9ZjELybGZK+tZ8rUb9VO0saKJUROTbE+KhzDUT7xziGpGrW8Kmd+g==} - engines: {node: '>=10.0.0'} - - /big-integer@1.6.51: - resolution: {integrity: sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg==} - engines: {node: '>=0.6'} - dev: false - - /binary@0.3.0: - resolution: {integrity: sha512-D4H1y5KYwpJgK8wk1Cue5LLPgmwHKYSChkbspQg5JtVuR5ulGckxfR62H3AE9UDkdMC8yyXlqYihuz3Aqg2XZg==} - dependencies: - buffers: 0.1.1 - chainsaw: 0.1.0 - dev: false - - /bl@4.1.0: - resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} - dependencies: - buffer: 5.7.1 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /bluebird@3.4.7: - resolution: {integrity: sha512-iD3898SR7sWVRHbiQv+sHUtHnMvC1o3nW5rAcqnq3uOn07DSAppZYUkIGslDz6gXC7HfunPe7YVBgoEJASPcHA==} - dev: false - - /brace-expansion@1.1.11: - resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} - dependencies: - balanced-match: 1.0.2 - concat-map: 0.0.1 - - /brace-expansion@2.0.1: - resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} - dependencies: - balanced-match: 1.0.2 - - /braces@3.0.2: - resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} - engines: {node: '>=8'} - dependencies: - fill-range: 7.0.1 - - /browser-process-hrtime@1.0.0: - resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} - dev: false - - /browserslist@4.22.1: - resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001546 - electron-to-chromium: 1.4.544 - node-releases: 2.0.13 - update-browserslist-db: 1.0.13(browserslist@4.22.1) - dev: true - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - - /buffer-crc32@0.2.13: - resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - - /buffer-indexof-polyfill@1.0.2: - resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} - engines: {node: '>=0.10'} - dev: false - - /buffer@5.7.1: - resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffer@6.0.3: - resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} - dependencies: - base64-js: 1.5.1 - ieee754: 1.2.1 - - /buffers@0.1.1: - resolution: {integrity: sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==} - engines: {node: '>=0.2.0'} - dev: false - - /cacheable-lookup@5.0.4: - resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} - engines: {node: '>=10.6.0'} - dev: false - - /cacheable-request@7.0.4: - resolution: {integrity: sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==} - engines: {node: '>=8'} - dependencies: - clone-response: 1.0.3 - get-stream: 5.2.0 - http-cache-semantics: 4.1.1 - keyv: 4.5.4 - lowercase-keys: 2.0.0 - normalize-url: 6.1.0 - responselike: 2.0.1 - dev: false - - /callsites@3.1.0: - resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} - engines: {node: '>=6'} - - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite@1.0.30001546: - resolution: {integrity: sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==} - dev: true - - /chainsaw@0.1.0: - resolution: {integrity: sha512-75kWfWt6MEKNC8xYXIdRpDehRYY/tNSgwKaJq+dbbDcxORuVrrQ+SEHoWsniVn9XPYfP4gmdWIeDk/4YNp1rNQ==} - dependencies: - traverse: 0.3.9 - dev: false - - /chalk@2.4.2: - resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} - engines: {node: '>=4'} - dependencies: - ansi-styles: 3.2.1 - escape-string-regexp: 1.0.5 - supports-color: 5.5.0 - - /chalk@4.1.2: - resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - supports-color: 7.2.0 - dev: true - - /chalk@5.3.0: - resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} - engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - dev: false - - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} - dev: true - - /chownr@1.1.4: - resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: false - - /chrome-har@0.11.12: - resolution: {integrity: sha512-Fi/YCoUHjQMQC0sPKCdiuGVbApeEwIUNvISrlwZgbuUcxfHJA6MjD4RsIH/YSOAo/Z3ENiF+xaEpsdqqdETIjg==} - dependencies: - dayjs: 1.8.31 - debug: 4.1.1 - tough-cookie: 4.0.0 - uuid: 8.0.0 - dev: false - - /chrome-launcher@1.1.0: - resolution: {integrity: sha512-rJYWeEAERwWIr3c3mEVXwNiODPEdMRlRxHc47B1qHPOolHZnkj7rMv1QSUfPoG6MgatWj5AxSpnKKR4QEwEQIQ==} - engines: {node: '>=12.13.0'} - hasBin: true - dependencies: - '@types/node': 18.19.6 - escape-string-regexp: 4.0.0 - is-wsl: 2.2.0 - lighthouse-logger: 2.0.1 - - /chromium-bidi@0.5.2(devtools-protocol@0.0.1203626): - resolution: {integrity: sha512-PbVOSddxgKyj+JByqavWMNqWPCoCaT6XK5Z1EFe168sxnB/BM51LnZEPXSbFcFAJv/+u2B4XNTs9uXxy4GW3cQ==} - peerDependencies: - devtools-protocol: '*' - dependencies: - devtools-protocol: 0.0.1203626 - mitt: 3.0.1 - urlpattern-polyfill: 9.0.0 - - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /cjs-module-lexer@1.2.3: - resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - dev: true - - /cli-cursor@4.0.0: - resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - restore-cursor: 4.0.0 - dev: false - - /cli-spinners@2.9.2: - resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} - engines: {node: '>=6'} - dev: false - - /cliui@7.0.4: - resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - dev: false - - /cliui@8.0.1: - resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} - engines: {node: '>=12'} - dependencies: - string-width: 4.2.3 - strip-ansi: 6.0.1 - wrap-ansi: 7.0.0 - - /clone-response@1.0.3: - resolution: {integrity: sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==} - dependencies: - mimic-response: 1.0.1 - dev: false - - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - - /code-block-writer@12.0.0: - resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} - dev: false - - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true - - /color-convert@1.9.3: - resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} - dependencies: - color-name: 1.1.3 - - /color-convert@2.0.1: - resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} - engines: {node: '>=7.0.0'} - dependencies: - color-name: 1.1.4 - - /color-name@1.1.3: - resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} - - /color-name@1.1.4: - resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - - /colorette@2.0.19: - resolution: {integrity: sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==} - - /colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - dev: false - - /colors@1.2.5: - resolution: {integrity: sha512-erNRLao/Y3Fv54qUa0LBB+//Uf3YwMUmdJinN20yMXm9zdKKqH9wt7R9IIVZ+K7ShzfpLV/Zg8+VyrBJYB4lpg==} - engines: {node: '>=0.1.90'} - - /combined-stream@1.0.8: - resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} - engines: {node: '>= 0.8'} - dependencies: - delayed-stream: 1.0.0 - dev: false - - /commander@10.0.1: - resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} - engines: {node: '>=14'} - - /commander@11.1.0: - resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} - engines: {node: '>=16'} - dev: false - - /compress-commons@4.1.2: - resolution: {integrity: sha512-D3uMHtGc/fcO1Gt1/L7i1e33VOvD4A9hfQLP+6ewd+BvG/gQ84Yh4oftEhAdjSMgBgwGL+jsppT7JYNpo6MHHg==} - engines: {node: '>= 10'} - dependencies: - buffer-crc32: 0.2.13 - crc32-stream: 4.0.3 - normalize-path: 3.0.0 - readable-stream: 3.6.2 - dev: false - - /concat-files@0.1.1: - resolution: {integrity: sha512-rd86aOzWGNrvTQys7xHTif/e0Sr66v529O7IFc/gFM9W0ZB3IThqpWC6wOzbsNXmzTbMh3zNIgB2GIeOe2b72w==} - dependencies: - async: 0.2.10 - dev: false - - /concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - - /configstore@5.0.1: - resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} - engines: {node: '>=8'} - dependencies: - dot-prop: 5.3.0 - graceful-fs: 4.2.11 - make-dir: 3.1.0 - unique-string: 2.0.0 - write-file-atomic: 3.0.3 - xdg-basedir: 4.0.0 - - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - - /cookie@0.4.2: - resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} - engines: {node: '>= 0.6'} - - /cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - - /core-util-is@1.0.3: - resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} - dev: false - - /cosmiconfig@8.3.6(typescript@5.3.3): - resolution: {integrity: sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==} - engines: {node: '>=14'} - peerDependencies: - typescript: '>=4.9.5' - peerDependenciesMeta: - typescript: - optional: true - dependencies: - import-fresh: 3.3.0 - js-yaml: 4.1.0 - parse-json: 5.2.0 - path-type: 4.0.0 - typescript: 5.3.3 - dev: false - - /crc-32@1.2.2: - resolution: {integrity: sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==} - engines: {node: '>=0.8'} - hasBin: true - dev: false - - /crc32-stream@4.0.3: - resolution: {integrity: sha512-NT7w2JVU7DFroFdYkeq8cywxrgjPHWkdX1wjpRQXPX5Asews3tA+Ght6lddQO5Mkumffp3X7GEqku3epj2toIw==} - engines: {node: '>= 10'} - dependencies: - crc-32: 1.2.2 - readable-stream: 3.6.2 - dev: false - - /create-jest@29.7.0(@types/node@18.19.6)(ts-node@10.9.1): - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /create-require@1.1.1: - resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} - dev: true - - /cross-fetch@4.0.0: - resolution: {integrity: sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==} - dependencies: - node-fetch: 2.7.0 - transitivePeerDependencies: - - encoding - - /cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} - engines: {node: '>= 8'} - dependencies: - path-key: 3.1.1 - shebang-command: 2.0.0 - which: 2.0.2 - - /crypto-random-string@2.0.0: - resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} - engines: {node: '>=8'} - - /csp_evaluator@1.1.1: - resolution: {integrity: sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==} - - /cssom@0.3.8: - resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} - dev: false - - /cssom@0.4.4: - resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} - dev: false - - /cssstyle@2.3.0: - resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} - engines: {node: '>=8'} - dependencies: - cssom: 0.3.8 - dev: false - - /data-uri-to-buffer@6.0.1: - resolution: {integrity: sha512-MZd3VlchQkp8rdend6vrx7MmVDJzSNTBvghvKjirLkD+WTChA3KUf0jkE68Q4UyctNqI11zZO9/x2Yx+ub5Cvg==} - engines: {node: '>= 14'} - - /data-urls@2.0.0: - resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} - engines: {node: '>=10'} - dependencies: - abab: 2.0.6 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - dev: false - - /dateformat@4.6.3: - resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dev: false - - /dayjs@1.11.10: - resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} - dev: false - - /dayjs@1.8.31: - resolution: {integrity: sha512-mPh1mslned+5PuIuiUfbw4CikHk6AEAf2Baxih+wP5fssv+wmlVhvgZ7mq+BhLt7Sr/Hc8leWDiwe6YnrpNt3g==} - dev: false - - /debug@2.6.9: - resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} - dependencies: - ms: 2.0.0 - - /debug@4.1.1: - resolution: {integrity: sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==} - deprecated: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) - dependencies: - ms: 2.1.3 - dev: false - - /debug@4.3.4: - resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - dependencies: - ms: 2.1.2 - - /decimal.js@10.4.3: - resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} - dev: false - - /decompress-response@6.0.0: - resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} - engines: {node: '>=10'} - dependencies: - mimic-response: 3.1.0 - dev: false - - /dedent@1.5.1: - resolution: {integrity: sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true - - /deep-is@0.1.4: - resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} - dev: true - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} - dev: true - - /defer-to-connect@2.0.1: - resolution: {integrity: sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==} - engines: {node: '>=10'} - dev: false - - /define-lazy-prop@2.0.0: - resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==} - engines: {node: '>=8'} - - /degenerator@5.0.1: - resolution: {integrity: sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==} - engines: {node: '>= 14'} - dependencies: - ast-types: 0.13.4 - escodegen: 2.1.0 - esprima: 4.0.1 - - /delayed-stream@1.0.0: - resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} - engines: {node: '>=0.4.0'} - dev: false - - /denque@2.1.0: - resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} - engines: {node: '>=0.10'} - - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - - /devtools-protocol@0.0.1203626: - resolution: {integrity: sha512-nEzHZteIUZfGCZtTiS1fRpC8UZmsfD1SiyPvaUNvS13dvKf666OAm8YTi0+Ca3n1nLEyu49Cy4+dPWpaHFJk9g==} - - /devtools-protocol@0.0.1211954: - resolution: {integrity: sha512-f6BRhngr9wpHN8omZOoSaEJFscTL+tjNhmeBqHHC3CZ3K2N75sDeKXZeTkAEkTCcrusDatfwjRRBh0uz4ov/sA==} - - /devtools-protocol@0.0.818844: - resolution: {integrity: sha512-AD1hi7iVJ8OD0aMLQU5VK0XH9LDlA1+BcPIgrAxPfaibx2DbWucuyOhc4oyQCbnvDDO68nN6/LcKfqTP343Jjg==} - dev: false - - /diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /diff@4.0.2: - resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} - engines: {node: '>=0.3.1'} - dev: true - - /dir-glob@3.0.1: - resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} - engines: {node: '>=8'} - dependencies: - path-type: 4.0.0 - - /doctrine@3.0.0: - resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} - engines: {node: '>=6.0.0'} - dependencies: - esutils: 2.0.3 - dev: true - - /domexception@2.0.1: - resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} - engines: {node: '>=8'} - dependencies: - webidl-conversions: 5.0.0 - dev: false - - /dot-prop@5.3.0: - resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} - engines: {node: '>=8'} - dependencies: - is-obj: 2.0.0 - - /dotenv@16.3.1: - resolution: {integrity: sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ==} - engines: {node: '>=12'} - - /dumb-query-selector@3.3.0: - resolution: {integrity: sha512-hPRKbOOZUn9UBgO74fPSidcMqrYOJSMs27CEaDLZ+RjuY20ze0zgc4JH4ESXYyDXyCmGe3kirYHp6sFcH78Zsw==} - dev: false - - /duplexer2@0.1.4: - resolution: {integrity: sha512-asLFVfWWtJ90ZyOUHMqk7/S2w2guQKxUI2itj3d92ADHhxUSbCMGi1f1cBcJ7xM1To+pE/Khbwo1yuNbMEPKeA==} - dependencies: - readable-stream: 2.3.8 - dev: false - - /eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - - /electron-to-chromium@1.4.544: - resolution: {integrity: sha512-54z7squS1FyFRSUqq/knOFSptjjogLZXbKcYk3B0qkE1KZzvqASwRZnY2KzZQJqIYLVD38XZeoiMRflYSwyO4w==} - dev: true - - /emittery@0.13.1: - resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} - engines: {node: '>=12'} - - /emoji-regex@10.3.0: - resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} - dev: false - - /emoji-regex@8.0.0: - resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - - /emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - - /end-of-stream@1.4.4: - resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} - dependencies: - once: 1.4.0 - - /enquirer@2.4.1: - resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} - engines: {node: '>=8.6'} - dependencies: - ansi-colors: 4.1.3 - strip-ansi: 6.0.1 - - /error-ex@1.3.2: - resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} - dependencies: - is-arrayish: 0.2.1 - - /escalade@3.1.1: - resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} - engines: {node: '>=6'} - - /escape-string-regexp@1.0.5: - resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} - engines: {node: '>=0.8.0'} - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true - - /escape-string-regexp@4.0.0: - resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} - engines: {node: '>=10'} - - /escodegen@2.1.0: - resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} - engines: {node: '>=6.0'} - hasBin: true - dependencies: - esprima: 4.0.1 - estraverse: 5.3.0 - esutils: 2.0.3 - optionalDependencies: - source-map: 0.6.1 - - /eslint-scope@7.2.2: - resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - dev: true - - /eslint-visitor-keys@3.4.3: - resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - - /eslint@8.56.0: - resolution: {integrity: sha512-Go19xM6T9puCOWntie1/P997aXxFsOi37JIHRWI514Hc6ZnaHGKY9xFhrU65RT6CcBEzZoGG1e6Nq+DT04ZtZQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - hasBin: true - dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.56.0) - '@eslint-community/regexpp': 4.9.1 - '@eslint/eslintrc': 2.1.4 - '@eslint/js': 8.56.0 - '@humanwhocodes/config-array': 0.11.14 - '@humanwhocodes/module-importer': 1.0.1 - '@nodelib/fs.walk': 1.2.8 - '@ungap/structured-clone': 1.2.0 - ajv: 6.12.6 - chalk: 4.1.2 - cross-spawn: 7.0.3 - debug: 4.3.4 - doctrine: 3.0.0 - escape-string-regexp: 4.0.0 - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 - esquery: 1.5.0 - esutils: 2.0.3 - fast-deep-equal: 3.1.3 - file-entry-cache: 6.0.1 - find-up: 5.0.0 - glob-parent: 6.0.2 - globals: 13.23.0 - graphemer: 1.4.0 - ignore: 5.2.4 - imurmurhash: 0.1.4 - is-glob: 4.0.3 - is-path-inside: 3.0.3 - js-yaml: 4.1.0 - json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 - lodash.merge: 4.6.2 - minimatch: 3.1.2 - natural-compare: 1.4.0 - optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 - transitivePeerDependencies: - - supports-color - dev: true - - /esm@3.2.25: - resolution: {integrity: sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==} - engines: {node: '>=6'} - - /espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - acorn: 8.10.0 - acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.3 - dev: true - - /esprima@4.0.1: - resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} - engines: {node: '>=4'} - hasBin: true - - /esquery@1.5.0: - resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} - engines: {node: '>=0.10'} - dependencies: - estraverse: 5.3.0 - dev: true - - /esrecurse@4.3.0: - resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} - engines: {node: '>=4.0'} - dependencies: - estraverse: 5.3.0 - dev: true - - /estraverse@5.3.0: - resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} - engines: {node: '>=4.0'} - - /esutils@2.0.3: - resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} - engines: {node: '>=0.10.0'} - - /event-target-shim@5.0.1: - resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} - engines: {node: '>=6'} - - /eventemitter3@3.1.2: - resolution: {integrity: sha512-tvtQIeLVHjDkJYnzf2dgVMxfuSGJeM/7UCG17TT4EumTfNtF+0nebF/4zWOIkCreAbtNqhGEboB6BWrwqNaw4Q==} - dev: false - - /eventemitter3@4.0.7: - resolution: {integrity: sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==} - dev: false - - /events@3.3.0: - resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} - engines: {node: '>=0.8.x'} - - /exceljs@4.3.0: - resolution: {integrity: sha512-hTAeo5b5TPvf8Z02I2sKIT4kSfCnOO2bCxYX8ABqODCdAjppI3gI9VYiGCQQYVcBaBSKlFDMKlAQRqC+kV9O8w==} - engines: {node: '>=8.3.0'} - dependencies: - archiver: 5.3.2 - dayjs: 1.11.10 - fast-csv: 4.3.6 - jszip: 3.10.1 - readable-stream: 3.6.2 - saxes: 5.0.1 - tmp: 0.2.1 - unzipper: 0.10.14 - uuid: 8.3.2 - dev: false - - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} - dependencies: - cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 - merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - dev: true - - /extract-zip@2.0.1: - resolution: {integrity: sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==} - engines: {node: '>= 10.17.0'} - hasBin: true - dependencies: - debug: 4.3.4 - get-stream: 5.2.0 - yauzl: 2.10.0 - optionalDependencies: - '@types/yauzl': 2.10.1 - transitivePeerDependencies: - - supports-color - - /fast-content-type-parse@1.1.0: - resolution: {integrity: sha512-fBHHqSTFLVnR61C+gltJuE5GkVQMV0S2nqUO8TJ+5Z3qAKG8vAx4FKai1s5jq/inV1+sREynIWSuQ6HgoSXpDQ==} - - /fast-copy@3.0.1: - resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} - dev: false - - /fast-csv@4.3.6: - resolution: {integrity: sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==} - engines: {node: '>=10.0.0'} - dependencies: - '@fast-csv/format': 4.3.5 - '@fast-csv/parse': 4.3.6 - dev: false - - /fast-decode-uri-component@1.0.1: - resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} - - /fast-deep-equal@3.1.3: - resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - - /fast-fifo@1.3.2: - resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - - /fast-glob@3.3.1: - resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} - engines: {node: '>=8.6.0'} - dependencies: - '@nodelib/fs.stat': 2.0.5 - '@nodelib/fs.walk': 1.2.8 - glob-parent: 5.1.2 - merge2: 1.4.1 - micromatch: 4.0.5 - - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - - /fast-json-stringify@5.8.0: - resolution: {integrity: sha512-VVwK8CFMSALIvt14U8AvrSzQAwN/0vaVRiFFUVlpnXSnDGrSkOAO5MtzyN8oQNjLd5AqTW5OZRgyjoNuAuR3jQ==} - dependencies: - '@fastify/deepmerge': 1.3.0 - ajv: 8.12.0 - ajv-formats: 2.1.1(ajv@8.12.0) - fast-deep-equal: 3.1.3 - fast-uri: 2.2.0 - rfdc: 1.3.0 - - /fast-levenshtein@2.0.6: - resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} - dev: true - - /fast-querystring@1.1.2: - resolution: {integrity: sha512-g6KuKWmFXc0fID8WWH0jit4g0AGBoJhCkJMb1RmbsSEUNvQ+ZC8D6CUZ+GtF8nMzSPXnhiePyyqqipzNNEnHjg==} - dependencies: - fast-decode-uri-component: 1.0.1 - - /fast-redact@3.3.0: - resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} - engines: {node: '>=6'} - - /fast-safe-stringify@2.1.1: - resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} - dev: false - - /fast-uri@2.2.0: - resolution: {integrity: sha512-cIusKBIt/R/oI6z/1nyfe2FvGKVTohVRfvkOhvx0nCEW+xf5NoCXjAHcWp93uOUBchzYcsvPlrapAdX1uW+YGg==} - - /fastify-plugin@4.5.1: - resolution: {integrity: sha512-stRHYGeuqpEZTL1Ef0Ovr2ltazUT9g844X5z/zEBFLG8RYlpDiOCIG+ATvYEp+/zmc7sN29mcIMp8gvYplYPIQ==} - - /fastify@4.25.2: - resolution: {integrity: sha512-SywRouGleDHvRh054onj+lEZnbC1sBCLkR0UY3oyJwjD4BdZJUrxBqfkfCaqn74pVCwBaRHGuL3nEWeHbHzAfw==} - dependencies: - '@fastify/ajv-compiler': 3.5.0 - '@fastify/error': 3.4.0 - '@fastify/fast-json-stringify-compiler': 4.3.0 - abstract-logging: 2.0.1 - avvio: 8.2.1 - fast-content-type-parse: 1.1.0 - fast-json-stringify: 5.8.0 - find-my-way: 7.7.0 - light-my-request: 5.11.0 - pino: 8.17.2 - process-warning: 3.0.0 - proxy-addr: 2.0.7 - rfdc: 1.3.0 - secure-json-parse: 2.7.0 - semver: 7.5.4 - toad-cache: 3.3.0 - transitivePeerDependencies: - - supports-color - - /fastq@1.15.0: - resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} - dependencies: - reusify: 1.0.4 - - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - - /fd-slicer@1.1.0: - resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} - dependencies: - pend: 1.2.0 - - /figlet@1.6.0: - resolution: {integrity: sha512-31EQGhCEITv6+hi2ORRPyn3bulaV9Fl4xOdR169cBzH/n1UqcxsiSB/noo6SJdD7Kfb1Ljit+IgR1USvF/XbdA==} - engines: {node: '>= 0.4.0'} - hasBin: true - dev: true - - /file-entry-cache@6.0.1: - resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} - engines: {node: ^10.12.0 || >=12.0.0} - dependencies: - flat-cache: 3.1.1 - dev: true - - /fill-range@7.0.1: - resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} - engines: {node: '>=8'} - dependencies: - to-regex-range: 5.0.1 - - /find-my-way@7.7.0: - resolution: {integrity: sha512-+SrHpvQ52Q6W9f3wJoJBbAQULJuNEEQwBvlvYwACDhBTLOTMiQ0HYWh4+vC3OivGP2ENcTI1oKlFA2OepJNjhQ==} - engines: {node: '>=14'} - dependencies: - fast-deep-equal: 3.1.3 - fast-querystring: 1.1.2 - safe-regex2: 2.0.0 - - /find-up@4.1.0: - resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} - engines: {node: '>=8'} - dependencies: - locate-path: 5.0.0 - path-exists: 4.0.0 - - /find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - dev: true - - /flat-cache@3.1.1: - resolution: {integrity: sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q==} - engines: {node: '>=12.0.0'} - dependencies: - flatted: 3.2.9 - keyv: 4.5.4 - rimraf: 3.0.2 - dev: true - - /flatted@3.2.9: - resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} - dev: true - - /follow-redirects@1.15.3: - resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - - /follow-redirects@1.15.5: - resolution: {integrity: sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw==} - engines: {node: '>=4.0'} - peerDependencies: - debug: '*' - peerDependenciesMeta: - debug: - optional: true - dev: false - - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - - /form-data@2.5.1: - resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} - engines: {node: '>= 0.12'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /form-data@3.0.1: - resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /form-data@4.0.0: - resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} - engines: {node: '>= 6'} - dependencies: - asynckit: 0.4.0 - combined-stream: 1.0.8 - mime-types: 2.1.35 - dev: false - - /forwarded@0.2.0: - resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} - engines: {node: '>= 0.6'} - - /fs-constants@1.0.0: - resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: false - - /fs-extra@11.1.1: - resolution: {integrity: sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==} - engines: {node: '>=14.14'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 6.1.0 - universalify: 2.0.0 - - /fs-extra@8.1.0: - resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} - engines: {node: '>=6 <7 || >=8'} - dependencies: - graceful-fs: 4.2.11 - jsonfile: 4.0.0 - universalify: 0.1.2 - - /fs.realpath@1.0.0: - resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} - - /fsevents@2.3.3: - resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} - engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} - os: [darwin] - requiresBuild: true - dev: true - optional: true - - /fstream@1.0.12: - resolution: {integrity: sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==} - engines: {node: '>=0.6'} - dependencies: - graceful-fs: 4.2.11 - inherits: 2.0.4 - mkdirp: 0.5.6 - rimraf: 2.7.1 - dev: false - - /generate-function@2.3.1: - resolution: {integrity: sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==} - dependencies: - is-property: 1.0.2 - - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - - /get-caller-file@2.0.5: - resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} - engines: {node: 6.* || 8.* || >= 10.*} - - /get-east-asian-width@1.2.0: - resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} - engines: {node: '>=18'} - dev: false - - /get-package-type@0.1.0: - resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} - engines: {node: '>=8.0.0'} - - /get-stream@5.2.0: - resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} - engines: {node: '>=8'} - dependencies: - pump: 3.0.0 - - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} - dev: true - - /get-uri@6.0.2: - resolution: {integrity: sha512-5KLucCJobh8vBY1K07EFV4+cPZH3mrV9YeAruUseCQKHB58SGjjT2l9/eA9LD082IiuMjSlFJEcdJ27TXvbZNw==} - engines: {node: '>= 14'} - dependencies: - basic-ftp: 5.0.3 - data-uri-to-buffer: 6.0.1 - debug: 4.3.4 - fs-extra: 8.1.0 - transitivePeerDependencies: - - supports-color - - /getopts@2.3.0: - resolution: {integrity: sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA==} - - /glob-parent@5.1.2: - resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} - engines: {node: '>= 6'} - dependencies: - is-glob: 4.0.3 - - /glob-parent@6.0.2: - resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} - engines: {node: '>=10.13.0'} - dependencies: - is-glob: 4.0.3 - dev: true - - /glob@10.3.10: - resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - dependencies: - foreground-child: 3.1.1 - jackspeak: 2.3.6 - minimatch: 9.0.3 - minipass: 7.0.4 - path-scurry: 1.10.1 - - /glob@7.2.3: - resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 3.1.2 - once: 1.4.0 - path-is-absolute: 1.0.1 - - /glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - - /globals@13.23.0: - resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.20.2 - dev: true - - /globby@11.1.0: - resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} - engines: {node: '>=10'} - dependencies: - array-union: 2.1.0 - dir-glob: 3.0.1 - fast-glob: 3.3.1 - ignore: 5.2.4 - merge2: 1.4.1 - slash: 3.0.0 - - /got@11.8.6: - resolution: {integrity: sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==} - engines: {node: '>=10.19.0'} - dependencies: - '@sindresorhus/is': 4.6.0 - '@szmarczak/http-timer': 4.0.6 - '@types/cacheable-request': 6.0.3 - '@types/responselike': 1.0.1 - cacheable-lookup: 5.0.4 - cacheable-request: 7.0.4 - decompress-response: 6.0.0 - http2-wrapper: 1.0.3 - lowercase-keys: 2.0.0 - p-cancelable: 2.1.1 - responselike: 2.0.1 - dev: false - - /graceful-fs@4.2.11: - resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} - - /graphemer@1.4.0: - resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} - dev: true - - /has-flag@3.0.0: - resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} - engines: {node: '>=4'} - - /has-flag@4.0.0: - resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} - engines: {node: '>=8'} - dev: true - - /has@1.0.4: - resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} - engines: {node: '>= 0.4.0'} - - /help-me@5.0.0: - resolution: {integrity: sha512-7xgomUX6ADmcYzFik0HzAxh/73YlKR9bmFzf51CZwR+b6YtzU2m0u49hQCqV6SvlqIqsaxovfwdvbnsw3b/zpg==} - dev: false - - /html-encoding-sniffer@2.0.1: - resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} - engines: {node: '>=10'} - dependencies: - whatwg-encoding: 1.0.5 - dev: false - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true - - /http-cache-semantics@4.1.1: - resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} - dev: false - - /http-link-header@1.1.1: - resolution: {integrity: sha512-mW3N/rTYpCn99s1do0zx6nzFZSwLH9HGfUM4ZqLWJ16ylmYaC2v5eYGqrNTQlByx8AzUgGI+V/32gXPugs1+Sw==} - engines: {node: '>=6.0.0'} - - /http-proxy-agent@4.0.1: - resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} - engines: {node: '>= 6'} - dependencies: - '@tootallnate/once': 1.1.2 - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /http-proxy-agent@7.0.0: - resolution: {integrity: sha512-+ZT+iBxVUQ1asugqnD6oWoRiS25AkjNfG085dKJGtGxkdwLQrMKU5wJr2bOOFAXzKcTuqq+7fZlTMgG3SRfIYQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - /http2-wrapper@1.0.3: - resolution: {integrity: sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==} - engines: {node: '>=10.19.0'} - dependencies: - quick-lru: 5.1.1 - resolve-alpn: 1.2.1 - dev: false - - /https-proxy-agent@4.0.0: - resolution: {integrity: sha512-zoDhWrkR3of1l9QAL8/scJZyLu8j/gBkcwcaQOZh7Gyh/+uJQzGVETdgT30akuwkpL8HTRfssqI3BZuV18teDg==} - engines: {node: '>= 6.0.0'} - dependencies: - agent-base: 5.1.1 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - dev: false - - /https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} - dependencies: - agent-base: 6.0.2 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - /https-proxy-agent@7.0.2: - resolution: {integrity: sha512-NmLNjm6ucYwtcUmL7JQC1ZQ57LmHP4lT15FQ8D61nak1rO6DH+fz5qNK2Ap5UN4ZapYICE3/0KodcLYSPsPbaA==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - transitivePeerDependencies: - - supports-color - - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} - dev: true - - /iconv-lite@0.4.24: - resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - dev: false - - /iconv-lite@0.6.3: - resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} - engines: {node: '>=0.10.0'} - dependencies: - safer-buffer: 2.1.2 - - /ieee754@1.2.1: - resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - - /ignore@5.2.4: - resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} - engines: {node: '>= 4'} - - /image-ssim@0.2.0: - resolution: {integrity: sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==} - - /immediate@3.0.6: - resolution: {integrity: sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==} - dev: false - - /import-fresh@3.3.0: - resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} - engines: {node: '>=6'} - dependencies: - parent-module: 1.0.1 - resolve-from: 4.0.0 - - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - - /imurmurhash@0.1.4: - resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} - engines: {node: '>=0.8.19'} - - /inflight@1.0.6: - resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} - dependencies: - once: 1.4.0 - wrappy: 1.0.2 - - /inherits@2.0.4: - resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - - /interpret@2.2.0: - resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} - engines: {node: '>= 0.10'} - - /intl-messageformat@10.5.8: - resolution: {integrity: sha512-NRf0jpBWV0vd671G5b06wNofAN8tp7WWDogMZyaU8GUAsmbouyvgwmFJI7zLjfAMpm3zK+vSwRP3jzaoIcMbaA==} - dependencies: - '@formatjs/ecma402-abstract': 1.18.0 - '@formatjs/fast-memoize': 2.2.0 - '@formatjs/icu-messageformat-parser': 2.7.3 - tslib: 2.6.2 - - /ip@1.1.8: - resolution: {integrity: sha512-PuExPYUiu6qMBQb4l06ecm6T6ujzhmh+MeJcW9wa89PoAz5pvd4zPgN5WJV104mb6S2T1AwNIAaB70JNrLQWhg==} - - /ip@2.0.0: - resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} - - /ipaddr.js@1.9.1: - resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} - engines: {node: '>= 0.10'} - - /is-arrayish@0.2.1: - resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} - - /is-core-module@2.13.0: - resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} - dependencies: - has: 1.0.4 - - /is-docker@2.2.1: - resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==} - engines: {node: '>=8'} - hasBin: true - - /is-electron@2.2.2: - resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} - dev: false - - /is-extglob@2.1.1: - resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} - engines: {node: '>=0.10.0'} - - /is-fullwidth-code-point@3.0.0: - resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} - engines: {node: '>=8'} - - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - - /is-glob@4.0.3: - resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} - engines: {node: '>=0.10.0'} - dependencies: - is-extglob: 2.1.1 - - /is-gzip@2.0.0: - resolution: {integrity: sha512-jtO4Njg6q58zDo/Pu4027beSZ0VdsZlt8/5Moco6yAg+DIxb5BK/xUYqYG2+MD4+piKldXJNHxRkhEYI2fvrxA==} - engines: {node: '>=4'} - dev: false - - /is-interactive@2.0.0: - resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} - engines: {node: '>=12'} - dev: false - - /is-number@7.0.0: - resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} - engines: {node: '>=0.12.0'} - - /is-obj@2.0.0: - resolution: {integrity: sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==} - engines: {node: '>=8'} - - /is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - dev: true - - /is-potential-custom-element-name@1.0.1: - resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} - dev: false - - /is-property@1.0.2: - resolution: {integrity: sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==} - - /is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - dev: false - - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} - dev: true - - /is-typedarray@1.0.0: - resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} - - /is-unicode-supported@1.3.0: - resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} - engines: {node: '>=12'} - dev: false - - /is-unicode-supported@2.0.0: - resolution: {integrity: sha512-FRdAyx5lusK1iHG0TWpVtk9+1i+GjrzRffhDg4ovQ7mcidMQ6mj+MhKPmvh7Xwyv5gIS06ns49CA7Sqg7lC22Q==} - engines: {node: '>=18'} - dev: false - - /is-wsl@2.2.0: - resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==} - engines: {node: '>=8'} - dependencies: - is-docker: 2.2.1 - - /isarray@1.0.0: - resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} - dev: false - - /isexe@2.0.0: - resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - - /istanbul-lib-coverage@3.2.0: - resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.23.0 - '@babel/parser': 7.23.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-instrument@6.0.1: - resolution: {integrity: sha512-EAMEJBsYuyyztxMxW3g7ugGPkrZsV57v0Hmv3mm1uQsmB+QnZuepg731CRaIgeUVSdmsTngOkSnauNF8p7FIhA==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.23.0 - '@babel/parser': 7.23.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.0 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.4 - istanbul-lib-coverage: 3.2.0 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.6: - resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - - /jackspeak@2.3.6: - resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.1 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.0.4 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-cli@29.7.0(@types/node@18.19.6)(ts-node@10.9.1): - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /jest-config@29.7.0(@types/node@18.19.6)(ts-node@10.9.1): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.23.0 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - babel-jest: 29.7.0(@babel/core@7.23.0) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.5 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - ts-node: 10.9.1(@types/node@18.19.6)(typescript@5.3.3) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - dev: true - - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.7 - '@types/node': 18.19.6 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.5 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.22.13 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.1 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.5 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - jest-util: 29.7.0 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.7.0 - dev: true - - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.6 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - chalk: 4.1.2 - cjs-module-lexer: 1.2.3 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.23.0 - '@babel/generator': 7.23.0 - '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.23.0) - '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) - '@babel/types': 7.23.0 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.5.4 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - dev: true - - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.6 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - dev: true - - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 18.19.6 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@29.7.0(@types/node@18.19.6)(ts-node@10.9.1): - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.1) - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /joycon@3.1.1: - resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} - engines: {node: '>=10'} - dev: false - - /jpeg-js@0.4.4: - resolution: {integrity: sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==} - - /js-library-detector@6.7.0: - resolution: {integrity: sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==} - engines: {node: '>=12'} - - /js-tokens@4.0.0: - resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} - - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 - dev: true - - /js-yaml@4.1.0: - resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} - hasBin: true - dependencies: - argparse: 2.0.1 - - /jsdom@16.7.0: - resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} - engines: {node: '>=10'} - peerDependencies: - canvas: ^2.5.0 - peerDependenciesMeta: - canvas: - optional: true - dependencies: - abab: 2.0.6 - acorn: 8.10.0 - acorn-globals: 6.0.0 - cssom: 0.4.4 - cssstyle: 2.3.0 - data-urls: 2.0.0 - decimal.js: 10.4.3 - domexception: 2.0.1 - escodegen: 2.1.0 - form-data: 3.0.1 - html-encoding-sniffer: 2.0.1 - http-proxy-agent: 4.0.1 - https-proxy-agent: 5.0.1 - is-potential-custom-element-name: 1.0.1 - nwsapi: 2.2.7 - parse5: 6.0.1 - saxes: 5.0.1 - symbol-tree: 3.2.4 - tough-cookie: 4.1.3 - w3c-hr-time: 1.0.2 - w3c-xmlserializer: 2.0.0 - webidl-conversions: 6.1.0 - whatwg-encoding: 1.0.5 - whatwg-mimetype: 2.3.0 - whatwg-url: 8.7.0 - ws: 7.5.9 - xml-name-validator: 3.0.0 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - dev: false - - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - - /json-buffer@3.0.1: - resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} - - /json-parse-even-better-errors@2.3.1: - resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} - - /json-schema-traverse@0.4.1: - resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} - dev: true - - /json-schema-traverse@1.0.0: - resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} - - /json-stable-stringify-without-jsonify@1.0.1: - resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - dev: true - - /json5@2.2.3: - resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} - engines: {node: '>=6'} - hasBin: true - dev: true - - /jsonfile@4.0.0: - resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} - optionalDependencies: - graceful-fs: 4.2.11 - - /jsonfile@6.1.0: - resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} - dependencies: - universalify: 2.0.0 - optionalDependencies: - graceful-fs: 4.2.11 - - /jszip@3.10.1: - resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} - dependencies: - lie: 3.3.0 - pako: 1.0.11 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /keyv@4.5.4: - resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - dependencies: - json-buffer: 3.0.1 - - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - - /knex@2.5.1(mysql2@3.6.2): - resolution: {integrity: sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA==} - engines: {node: '>=12'} - hasBin: true - peerDependencies: - better-sqlite3: '*' - mysql: '*' - mysql2: '*' - pg: '*' - pg-native: '*' - sqlite3: '*' - tedious: '*' - peerDependenciesMeta: - better-sqlite3: - optional: true - mysql: - optional: true - mysql2: - optional: true - pg: - optional: true - pg-native: - optional: true - sqlite3: - optional: true - tedious: - optional: true - dependencies: - colorette: 2.0.19 - commander: 10.0.1 - debug: 4.3.4 - escalade: 3.1.1 - esm: 3.2.25 - get-package-type: 0.1.0 - getopts: 2.3.0 - interpret: 2.2.0 - lodash: 4.17.21 - mysql2: 3.6.2 - pg-connection-string: 2.6.1 - rechoir: 0.8.0 - resolve-from: 5.0.0 - tarn: 3.0.2 - tildify: 2.0.0 - transitivePeerDependencies: - - supports-color - - /lazystream@1.0.1: - resolution: {integrity: sha512-b94GiNHQNy6JNTrt5w6zNyffMrNkXZb3KTkCZJb2V1xaEGCk093vkZ2jk3tpaeP33/OiXC+WvK9AxUebnf5nbw==} - engines: {node: '>= 0.6.3'} - dependencies: - readable-stream: 2.3.8 - dev: false - - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - - /levn@0.4.1: - resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /lie@3.3.0: - resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} - dependencies: - immediate: 3.0.6 - dev: false - - /light-my-request@5.11.0: - resolution: {integrity: sha512-qkFCeloXCOMpmEdZ/MV91P8AT4fjwFXWaAFz3lUeStM8RcoM1ks4J/F8r1b3r6y/H4u3ACEJ1T+Gv5bopj7oDA==} - dependencies: - cookie: 0.5.0 - process-warning: 2.2.0 - set-cookie-parser: 2.6.0 - - /lighthouse-logger@2.0.1: - resolution: {integrity: sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==} - dependencies: - debug: 2.6.9 - marky: 1.2.5 - - /lighthouse-stack-packs@1.12.1: - resolution: {integrity: sha512-i4jTmg7tvZQFwNFiwB+nCK6a7ICR68Xcwo+VIVd6Spi71vBNFUlds5HiDrSbClZdkQDON2Bhqv+KKJIo5zkPeA==} - - /lighthouse@11.4.0: - resolution: {integrity: sha512-NmGBIdLznIBTfla566gpNPdbascVA0uWFG2LyuRQPeMT06ai3QxzDqSpaR5dToDuEQIPkyU0qqxwHj8kst8x+g==} - engines: {node: '>=18.16'} - hasBin: true - dependencies: - '@sentry/node': 6.19.7 - axe-core: 4.8.2 - chrome-launcher: 1.1.0 - configstore: 5.0.1 - csp_evaluator: 1.1.1 - devtools-protocol: 0.0.1211954 - enquirer: 2.4.1 - http-link-header: 1.1.1 - intl-messageformat: 10.5.8 - jpeg-js: 0.4.4 - js-library-detector: 6.7.0 - lighthouse-logger: 2.0.1 - lighthouse-stack-packs: 1.12.1 - lodash: 4.17.21 - lookup-closest-locale: 6.2.0 - metaviewport-parser: 0.3.0 - open: 8.4.2 - parse-cache-control: 1.0.1 - ps-list: 8.1.1 - puppeteer-core: 21.7.0 - robots-parser: 3.0.1 - semver: 5.7.2 - speedline-core: 1.4.3 - third-party-web: 0.24.1 - tldts-icann: 6.1.2 - ws: 7.5.9 - yargs: 17.7.2 - yargs-parser: 21.1.1 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - /lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - - /listenercount@1.0.1: - resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} - dev: false - - /locate-path@5.0.0: - resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} - engines: {node: '>=8'} - dependencies: - p-locate: 4.1.0 - - /locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - dependencies: - p-locate: 5.0.0 - dev: true - - /lodash.defaults@4.2.0: - resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} - dev: false - - /lodash.difference@4.5.0: - resolution: {integrity: sha512-dS2j+W26TQ7taQBGN8Lbbq04ssV3emRw4NY58WErlTO29pIqS0HmoT5aJ9+TUQ1N3G+JOZSji4eugsWwGp9yPA==} - dev: false - - /lodash.escaperegexp@4.1.2: - resolution: {integrity: sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==} - dev: false - - /lodash.flatten@4.4.0: - resolution: {integrity: sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g==} - dev: false - - /lodash.groupby@4.6.0: - resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} - dev: false - - /lodash.isboolean@3.0.3: - resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} - dev: false - - /lodash.isequal@4.5.0: - resolution: {integrity: sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==} - dev: false - - /lodash.isfunction@3.0.9: - resolution: {integrity: sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==} - dev: false - - /lodash.isnil@4.0.0: - resolution: {integrity: sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==} - dev: false - - /lodash.isplainobject@4.0.6: - resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} - dev: false - - /lodash.isundefined@3.0.1: - resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} - dev: false - - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - - /lodash.merge@4.6.2: - resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} - dev: true - - /lodash.union@4.6.0: - resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} - dev: false - - /lodash.uniq@4.5.0: - resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} - dev: false - - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - - /log-symbols@6.0.0: - resolution: {integrity: sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw==} - engines: {node: '>=18'} - dependencies: - chalk: 5.3.0 - is-unicode-supported: 1.3.0 - dev: false - - /long@5.2.3: - resolution: {integrity: sha512-lcHwpNoggQTObv5apGNCTdJrO69eHOZMi4BNC+rTLER8iHAqGrUVeLh/irVIM7zTw2bOXA8T6uNPeujwOLg/2Q==} - - /lookup-closest-locale@6.2.0: - resolution: {integrity: sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==} - - /lowercase-keys@2.0.0: - resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} - engines: {node: '>=8'} - dev: false - - /lru-cache@10.0.1: - resolution: {integrity: sha512-IJ4uwUTi2qCccrioU6g9g/5rvvVl13bsdczUUcqbciD9iLr095yj8DQKdObriEvuNSx325N1rV1O0sJFszx75g==} - engines: {node: 14 || >=16.14} - - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - - /lru-cache@6.0.0: - resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} - engines: {node: '>=10'} - dependencies: - yallist: 4.0.0 - - /lru-cache@7.18.3: - resolution: {integrity: sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==} - engines: {node: '>=12'} - - /lru-cache@8.0.5: - resolution: {integrity: sha512-MhWWlVnuab1RG5/zMRRcVGXZLCXrZTgfwMikgzCegsPnG62yDQo5JnqKkrK4jO5iKqDAZGItAqN5CtKBCBWRUA==} - engines: {node: '>=16.14'} - - /lru_map@0.3.3: - resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} - - /make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - dependencies: - semver: 6.3.1 - - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.5.4 - dev: true - - /make-error@1.3.6: - resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} - dev: true - - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - - /marky@1.2.5: - resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} - - /merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - dev: true - - /merge2@1.4.1: - resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} - engines: {node: '>= 8'} - - /metaviewport-parser@0.3.0: - resolution: {integrity: sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==} - - /micromatch@4.0.5: - resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} - engines: {node: '>=8.6'} - dependencies: - braces: 3.0.2 - picomatch: 2.3.1 - - /mikro-orm@5.9.7: - resolution: {integrity: sha512-0AxNDxQWk45n5N5g5q/K2tVj1/Narf4h5+1fhFc0uYAp/tOGAGvjmVK43Xy4TisEm/1VpBNOtS7FYKvh14WVOQ==} - engines: {node: '>= 14.0.0'} - - /mime-db@1.52.0: - resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} - engines: {node: '>= 0.6'} - dev: false - - /mime-types@2.1.35: - resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} - engines: {node: '>= 0.6'} - dependencies: - mime-db: 1.52.0 - dev: false - - /mimic-fn@2.1.0: - resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} - engines: {node: '>=6'} - - /mimic-response@1.0.1: - resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} - engines: {node: '>=4'} - dev: false - - /mimic-response@3.1.0: - resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} - engines: {node: '>=10'} - dev: false - - /minimatch@3.1.2: - resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - dependencies: - brace-expansion: 1.1.11 - - /minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - - /minimatch@7.4.6: - resolution: {integrity: sha512-sBz8G/YjVniEz6lKPNpKxXwazJe4c19fEfV2GDMX6AjFz+MX9uDWIZW8XreVhkFW3fkIdTv/gxWr/Kks5FFAVw==} - engines: {node: '>=10'} - dependencies: - brace-expansion: 2.0.1 - dev: false - - /minimatch@9.0.3: - resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - brace-expansion: 2.0.1 - - /minimist@1.2.8: - resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - - /minipass@7.0.4: - resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} - engines: {node: '>=16 || 14 >=14.17'} - - /mitt@3.0.1: - resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} - - /mkdirp-classic@0.5.3: - resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - - /mkdirp@0.5.6: - resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} - hasBin: true - dependencies: - minimist: 1.2.8 - dev: false - - /mkdirp@2.1.6: - resolution: {integrity: sha512-+hEnITedc8LAtIP9u3HJDFIdcLV2vXP33sqLLIzkv1Db1zO/1OxbvYf0Y1OC/S/Qo5dxHXepofhmxL02PsKe+A==} - engines: {node: '>=10'} - hasBin: true - dev: false - - /mnemonist@0.39.6: - resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} - dependencies: - obliterator: 2.0.4 - - /ms@2.0.0: - resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} - - /ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - - /ms@2.1.3: - resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} - dev: false - - /mysql2@3.6.2: - resolution: {integrity: sha512-m5erE6bMoWfPXW1D5UrVwlT8PowAoSX69KcZzPuARQ3wY1RJ52NW9PdvdPo076XiSIkQ5IBTis7hxdlrQTlyug==} - engines: {node: '>= 8.0'} - dependencies: - denque: 2.1.0 - generate-function: 2.3.1 - iconv-lite: 0.6.3 - long: 5.2.3 - lru-cache: 8.0.5 - named-placeholders: 1.1.3 - seq-queue: 0.0.5 - sqlstring: 2.3.3 - - /named-placeholders@1.1.3: - resolution: {integrity: sha512-eLoBxg6wE/rZkJPhU/xRX1WTpkFEwDJEN96oxFrTsqBdbT5ec295Q+CoHrL9IT0DipqKhmGcaZmwOt8OON5x1w==} - engines: {node: '>=12.0.0'} - dependencies: - lru-cache: 7.18.3 - - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} - dev: true - - /netmask@2.0.2: - resolution: {integrity: sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==} - engines: {node: '>= 0.4.0'} - - /node-fetch@2.7.0: - resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} - engines: {node: 4.x || >=6.0.0} - peerDependencies: - encoding: ^0.1.0 - peerDependenciesMeta: - encoding: - optional: true - dependencies: - whatwg-url: 5.0.0 - - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - - /node-releases@2.0.13: - resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} - dev: true - - /normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - - /normalize-url@6.1.0: - resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} - engines: {node: '>=10'} - dev: false - - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} - dependencies: - path-key: 3.1.1 - dev: true - - /nwsapi@2.2.7: - resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} - dev: false - - /obliterator@2.0.4: - resolution: {integrity: sha512-lgHwxlxV1qIg1Eap7LgIeoBWIMFibOjbrYPIPJZcI1mmGAI2m3lNYpK12Y+GBdPQ0U1hRwSord7GIaawz962qQ==} - - /on-exit-leak-free@2.1.2: - resolution: {integrity: sha512-0eJJY6hXLGf1udHwfNftBqH+g73EU4B504nZeKpz1sYRKafAghwxEJunB2O7rDZkL4PGfsMVnTXZ2EjibbqcsA==} - engines: {node: '>=14.0.0'} - - /once@1.4.0: - resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - dependencies: - wrappy: 1.0.2 - - /onetime@5.1.2: - resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} - engines: {node: '>=6'} - dependencies: - mimic-fn: 2.1.0 - - /open@8.4.2: - resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} - engines: {node: '>=12'} - dependencies: - define-lazy-prop: 2.0.0 - is-docker: 2.2.1 - is-wsl: 2.2.0 - - /optionator@0.9.3: - resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} - engines: {node: '>= 0.8.0'} - dependencies: - '@aashutoshrathi/word-wrap': 1.2.6 - deep-is: 0.1.4 - fast-levenshtein: 2.0.6 - levn: 0.4.1 - prelude-ls: 1.2.1 - type-check: 0.4.0 - dev: true - - /ora@8.0.1: - resolution: {integrity: sha512-ANIvzobt1rls2BDny5fWZ3ZVKyD6nscLvfFRpQgfWsythlcsVUC9kL0zq6j2Z5z9wwp1kd7wpsD/T9qNPVLCaQ==} - engines: {node: '>=18'} - dependencies: - chalk: 5.3.0 - cli-cursor: 4.0.0 - cli-spinners: 2.9.2 - is-interactive: 2.0.0 - is-unicode-supported: 2.0.0 - log-symbols: 6.0.0 - stdin-discarder: 0.2.2 - string-width: 7.0.0 - strip-ansi: 7.1.0 - dev: false - - /p-cancelable@2.1.1: - resolution: {integrity: sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==} - engines: {node: '>=8'} - dev: false - - /p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - dev: false - - /p-limit@2.3.0: - resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} - engines: {node: '>=6'} - dependencies: - p-try: 2.2.0 - - /p-limit@3.1.0: - resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} - engines: {node: '>=10'} - dependencies: - yocto-queue: 0.1.0 - - /p-locate@4.1.0: - resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} - engines: {node: '>=8'} - dependencies: - p-limit: 2.3.0 - - /p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - dependencies: - p-limit: 3.1.0 - dev: true - - /p-queue@6.6.2: - resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} - engines: {node: '>=8'} - dependencies: - eventemitter3: 4.0.7 - p-timeout: 3.2.0 - dev: false - - /p-retry@4.6.2: - resolution: {integrity: sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==} - engines: {node: '>=8'} - dependencies: - '@types/retry': 0.12.0 - retry: 0.13.1 - dev: false - - /p-timeout@3.2.0: - resolution: {integrity: sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==} - engines: {node: '>=8'} - dependencies: - p-finally: 1.0.0 - dev: false - - /p-try@2.2.0: - resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} - engines: {node: '>=6'} - - /pac-proxy-agent@7.0.1: - resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} - engines: {node: '>= 14'} - dependencies: - '@tootallnate/quickjs-emscripten': 0.23.0 - agent-base: 7.1.0 - debug: 4.3.4 - get-uri: 6.0.2 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - pac-resolver: 7.0.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - - /pac-resolver@7.0.0: - resolution: {integrity: sha512-Fd9lT9vJbHYRACT8OhCbZBbxr6KRSawSovFpy8nDGshaK99S/EBhVIHp9+crhxrsZOuvLpgL1n23iyPg6Rl2hg==} - engines: {node: '>= 14'} - dependencies: - degenerator: 5.0.1 - ip: 1.1.8 - netmask: 2.0.2 - - /pako@1.0.11: - resolution: {integrity: sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==} - dev: false - - /parent-module@1.0.1: - resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} - engines: {node: '>=6'} - dependencies: - callsites: 3.1.0 - - /parent-require@1.0.0: - resolution: {integrity: sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==} - engines: {node: '>= 0.4.0'} - dev: true - - /parse-cache-control@1.0.1: - resolution: {integrity: sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==} - - /parse-json@5.2.0: - resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} - engines: {node: '>=8'} - dependencies: - '@babel/code-frame': 7.22.13 - error-ex: 1.3.2 - json-parse-even-better-errors: 2.3.1 - lines-and-columns: 1.2.4 - - /parse5@6.0.1: - resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} - dev: false - - /path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - dev: false - - /path-exists@4.0.0: - resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} - engines: {node: '>=8'} - - /path-is-absolute@1.0.1: - resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} - engines: {node: '>=0.10.0'} - - /path-key@3.1.1: - resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} - engines: {node: '>=8'} - - /path-parse@1.0.7: - resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - - /path-scurry@1.10.1: - resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} - engines: {node: '>=16 || 14 >=14.17'} - dependencies: - lru-cache: 10.0.1 - minipass: 7.0.4 - - /path-type@4.0.0: - resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} - engines: {node: '>=8'} - - /pend@1.2.0: - resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} - - /pg-connection-string@2.6.1: - resolution: {integrity: sha512-w6ZzNu6oMmIzEAYVw+RLK0+nqHPt8K3ZnknKi+g48Ak2pr3dtljJW3o+D/n2zzCG07Zoe9VOX3aiKpj+BN0pjg==} - - /picocolors@1.0.0: - resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} - dev: true - - /picomatch@2.3.1: - resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} - engines: {node: '>=8.6'} - - /pino-abstract-transport@1.1.0: - resolution: {integrity: sha512-lsleG3/2a/JIWUtf9Q5gUNErBqwIu1tUKTT3dUzaf5DySw9ra1wcqKjJjLX1VTY64Wk1eEOYsVGSaGfCK85ekA==} - dependencies: - readable-stream: 4.4.2 - split2: 4.2.0 - - /pino-pretty@10.3.1: - resolution: {integrity: sha512-az8JbIYeN/1iLj2t0jR9DV48/LQ3RC6hZPpapKPkb84Q+yTidMCpgWxIT3N0flnBDilyBQ1luWNpOeJptjdp/g==} - hasBin: true - dependencies: - colorette: 2.0.20 - dateformat: 4.6.3 - fast-copy: 3.0.1 - fast-safe-stringify: 2.1.1 - help-me: 5.0.0 - joycon: 3.1.1 - minimist: 1.2.8 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.1.0 - pump: 3.0.0 - readable-stream: 4.4.2 - secure-json-parse: 2.7.0 - sonic-boom: 3.8.0 - strip-json-comments: 3.1.1 - dev: false - - /pino-std-serializers@6.2.2: - resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} - - /pino@8.17.2: - resolution: {integrity: sha512-LA6qKgeDMLr2ux2y/YiUt47EfgQ+S9LznBWOJdN3q1dx2sv0ziDLUBeVpyVv17TEcGCBuWf0zNtg3M5m1NhhWQ==} - hasBin: true - dependencies: - atomic-sleep: 1.0.0 - fast-redact: 3.3.0 - on-exit-leak-free: 2.1.2 - pino-abstract-transport: 1.1.0 - pino-std-serializers: 6.2.2 - process-warning: 3.0.0 - quick-format-unescaped: 4.0.4 - real-require: 0.2.0 - safe-stable-stringify: 2.4.3 - sonic-boom: 3.8.0 - thread-stream: 2.4.1 - - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - - /pkg-dir@4.2.0: - resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} - engines: {node: '>=8'} - dependencies: - find-up: 4.1.0 - - /pony-cause@2.1.10: - resolution: {integrity: sha512-3IKLNXclQgkU++2fSi93sQ6BznFuxSLB11HdvZQ6JW/spahf/P1pAHBQEahr20rs0htZW0UDkM1HmA+nZkXKsw==} - engines: {node: '>=12.0.0'} - - /prelude-ls@1.2.1: - resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} - engines: {node: '>= 0.8.0'} - dev: true - - /pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.2.0 - dev: true - - /process-nextick-args@2.0.1: - resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} - dev: false - - /process-warning@2.2.0: - resolution: {integrity: sha512-/1WZ8+VQjR6avWOgHeEPd7SDQmFQ1B5mC1eRXsCm5TarlNmx/wCsa5GEaxGm05BORRtyG/Ex/3xq3TuRvq57qg==} - - /process-warning@3.0.0: - resolution: {integrity: sha512-mqn0kFRl0EoqhnL0GQ0veqFHyIN1yig9RHh/InzORTUiZHFRAur+aMtRkELNwGs9aNwKS6tg/An4NYBPGwvtzQ==} - - /process@0.11.10: - resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==} - engines: {node: '>= 0.6.0'} - - /progress@2.0.3: - resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} - engines: {node: '>=0.4.0'} - - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - - /proxy-addr@2.0.7: - resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} - engines: {node: '>= 0.10'} - dependencies: - forwarded: 0.2.0 - ipaddr.js: 1.9.1 - - /proxy-agent@6.3.1: - resolution: {integrity: sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - http-proxy-agent: 7.0.0 - https-proxy-agent: 7.0.2 - lru-cache: 7.18.3 - pac-proxy-agent: 7.0.1 - proxy-from-env: 1.1.0 - socks-proxy-agent: 8.0.2 - transitivePeerDependencies: - - supports-color - - /proxy-from-env@1.1.0: - resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} - - /ps-list@8.1.1: - resolution: {integrity: sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - - /psl@1.9.0: - resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} - dev: false - - /pump@3.0.0: - resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} - dependencies: - end-of-stream: 1.4.4 - once: 1.4.0 - - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} - engines: {node: '>=6'} - - /puppeteer-core@21.7.0: - resolution: {integrity: sha512-elPYPozrgiM3phSy7VDUJCVWQ07SPnOm78fpSaaSNFoQx5sur/MqhTSro9Wz8lOEjqCykGC6WRkwxDgmqcy1dQ==} - engines: {node: '>=16.13.2'} - dependencies: - '@puppeteer/browsers': 1.9.1 - chromium-bidi: 0.5.2(devtools-protocol@0.0.1203626) - cross-fetch: 4.0.0 - debug: 4.3.4 - devtools-protocol: 0.0.1203626 - ws: 8.16.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - - /puppeteer-har@1.1.2(puppeteer@5.5.0): - resolution: {integrity: sha512-Z5zfoj8RkhUT9UbrrR8JjOHNnCr7sNINoeR346F40sLo/4zn+KX/sw/eoKNrtsISc1s/2YCZaqaSEVx6cZ8NQg==} - engines: {node: '>=7.6.0'} - peerDependencies: - puppeteer: '>=1.0.0' - dependencies: - chrome-har: 0.11.12 - puppeteer: 5.5.0 - dev: false - - /puppeteer@21.7.0(typescript@5.3.3): - resolution: {integrity: sha512-Yy+UUy0b9siJezbhHO/heYUoZQUwyqDK1yOQgblTt0l97tspvDVFkcW9toBlnSvSfkDmMI3Dx9cZL6R8bDArHA==} - engines: {node: '>=16.13.2'} - hasBin: true - requiresBuild: true - dependencies: - '@puppeteer/browsers': 1.9.1 - cosmiconfig: 8.3.6(typescript@5.3.3) - puppeteer-core: 21.7.0 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - typescript - - utf-8-validate - dev: false - - /puppeteer@5.5.0: - resolution: {integrity: sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==} - engines: {node: '>=10.18.1'} - deprecated: < 21.3.7 is no longer supported - requiresBuild: true - dependencies: - debug: 4.3.4 - devtools-protocol: 0.0.818844 - extract-zip: 2.0.1 - https-proxy-agent: 4.0.0 - node-fetch: 2.7.0 - pkg-dir: 4.2.0 - progress: 2.0.3 - proxy-from-env: 1.1.0 - rimraf: 3.0.2 - tar-fs: 2.1.1 - unbzip2-stream: 1.4.3 - ws: 7.5.9 - transitivePeerDependencies: - - bufferutil - - encoding - - supports-color - - utf-8-validate - dev: false - - /pure-rand@6.0.4: - resolution: {integrity: sha512-LA0Y9kxMYv47GIPJy6MI84fqTd2HmYZI83W/kM/SkKfDlajnZYfmXFTxkbY+xSBPkLJxltMa9hIkmdc29eguMA==} - dev: true - - /querystringify@2.2.0: - resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} - dev: false - - /queue-microtask@1.2.3: - resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - - /queue-tick@1.0.1: - resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - - /quick-format-unescaped@4.0.4: - resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} - - /quick-lru@5.1.1: - resolution: {integrity: sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==} - engines: {node: '>=10'} - dev: false - - /react-is@18.2.0: - resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} - dev: true - - /readable-stream@2.3.8: - resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} - dependencies: - core-util-is: 1.0.3 - inherits: 2.0.4 - isarray: 1.0.0 - process-nextick-args: 2.0.1 - safe-buffer: 5.1.2 - string_decoder: 1.1.1 - util-deprecate: 1.0.2 - dev: false - - /readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - dev: false - - /readable-stream@4.4.2: - resolution: {integrity: sha512-Lk/fICSyIhodxy1IDK2HazkeGjSmezAWX2egdtJnYhtzKEsBPJowlI6F6LPb5tqIQILrMbx22S5o3GuJavPusA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dependencies: - abort-controller: 3.0.0 - buffer: 6.0.3 - events: 3.3.0 - process: 0.11.10 - string_decoder: 1.3.0 - - /readdir-glob@1.1.3: - resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} - dependencies: - minimatch: 5.1.6 - dev: false - - /real-require@0.2.0: - resolution: {integrity: sha512-57frrGM/OCTLqLOAh0mhVA9VBMHd+9U7Zb2THMGdBUoZVOtGbJzjxsYGDJ3A9AYYCP4hn6y1TVbaOfzWtm5GFg==} - engines: {node: '>= 12.13.0'} - - /rechoir@0.8.0: - resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} - engines: {node: '>= 10.13.0'} - dependencies: - resolve: 1.22.6 - - /reflect-metadata@0.1.13: - resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} - - /regenerator-runtime@0.14.0: - resolution: {integrity: sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==} - dev: false - - /require-directory@2.1.1: - resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} - engines: {node: '>=0.10.0'} - - /require-from-string@2.0.2: - resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} - engines: {node: '>=0.10.0'} - - /requires-port@1.0.0: - resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} - dev: false - - /resolve-alpn@1.2.1: - resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} - dev: false - - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - - /resolve-from@4.0.0: - resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} - engines: {node: '>=4'} - - /resolve-from@5.0.0: - resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} - engines: {node: '>=8'} - - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true - - /resolve@1.22.6: - resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} - hasBin: true - dependencies: - is-core-module: 2.13.0 - path-parse: 1.0.7 - supports-preserve-symlinks-flag: 1.0.0 - - /responselike@2.0.1: - resolution: {integrity: sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==} - dependencies: - lowercase-keys: 2.0.0 - dev: false - - /restore-cursor@4.0.0: - resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - dependencies: - onetime: 5.1.2 - signal-exit: 3.0.7 - dev: false - - /ret@0.2.2: - resolution: {integrity: sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==} - engines: {node: '>=4'} - - /retry@0.13.1: - resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} - engines: {node: '>= 4'} - dev: false - - /reusify@1.0.4: - resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} - engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - - /rfdc@1.3.0: - resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} - - /rimraf@2.7.1: - resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} - hasBin: true - dependencies: - glob: 7.2.3 - dev: false - - /rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - hasBin: true - dependencies: - glob: 7.2.3 - - /rimraf@5.0.5: - resolution: {integrity: sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==} - engines: {node: '>=14'} - hasBin: true - dependencies: - glob: 10.3.10 - - /robots-parser@3.0.1: - resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} - engines: {node: '>=10.0.0'} - - /run-parallel@1.2.0: - resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} - dependencies: - queue-microtask: 1.2.3 - - /safe-buffer@5.1.2: - resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} - dev: false - - /safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - - /safe-regex2@2.0.0: - resolution: {integrity: sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==} - dependencies: - ret: 0.2.2 - - /safe-stable-stringify@2.4.3: - resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} - engines: {node: '>=10'} - - /safer-buffer@2.1.2: - resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} - - /sax@1.3.0: - resolution: {integrity: sha512-0s+oAmw9zLl1V1cS9BtZN7JAd0cW5e0QH4W3LWEK6a4LaLEA2OTpGYWDY+6XasBLtz6wkm3u1xRw95mRuJ59WA==} - dev: false - - /saxes@5.0.1: - resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} - engines: {node: '>=10'} - dependencies: - xmlchars: 2.2.0 - dev: false - - /secure-json-parse@2.7.0: - resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} - - /semver@5.7.2: - resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} - hasBin: true - - /semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - - /semver@7.5.4: - resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} - engines: {node: '>=10'} - hasBin: true - dependencies: - lru-cache: 6.0.0 - - /seq-queue@0.0.5: - resolution: {integrity: sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q==} - - /set-cookie-parser@2.6.0: - resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - - /setimmediate@1.0.5: - resolution: {integrity: sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==} - dev: false - - /shebang-command@2.0.0: - resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} - engines: {node: '>=8'} - dependencies: - shebang-regex: 3.0.0 - - /shebang-regex@3.0.0: - resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} - engines: {node: '>=8'} - - /signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - - /signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - - /sitemapper@3.2.6: - resolution: {integrity: sha512-AZbim4lmKgchUj6yyJ9ru0eLJ4/S6QAqy5QEbpCpvBbBnXxTERLMC6rzgKy1gHM19YUEtYJFTC2t8lxDWO0wkQ==} - engines: {node: '>= 10.0.0'} - dependencies: - got: 11.8.6 - is-gzip: 2.0.0 - p-limit: 3.1.0 - xml2js: 0.4.23 - dev: false - - /slash@3.0.0: - resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} - engines: {node: '>=8'} - - /smart-buffer@4.2.0: - resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} - engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - - /socks-proxy-agent@8.0.2: - resolution: {integrity: sha512-8zuqoLv1aP/66PHF5TqwJ7Czm3Yv32urJQHrVyhD7mmA6d61Zv8cIXQYPTWwmg6qlupnPvs/QKDmfa4P/qct2g==} - engines: {node: '>= 14'} - dependencies: - agent-base: 7.1.0 - debug: 4.3.4 - socks: 2.7.1 - transitivePeerDependencies: - - supports-color - - /socks@2.7.1: - resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} - engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} - dependencies: - ip: 2.0.0 - smart-buffer: 4.2.0 - - /sonic-boom@3.8.0: - resolution: {integrity: sha512-ybz6OYOUjoQQCQ/i4LU8kaToD8ACtYP+Cj5qd2AO36bwbdewxWJ3ArmJ2cr6AvxlL2o0PqnCcPGUgkILbfkaCA==} - dependencies: - atomic-sleep: 1.0.0 - - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 - dev: true - - /source-map@0.6.1: - resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} - engines: {node: '>=0.10.0'} - - /speedline-core@1.4.3: - resolution: {integrity: sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==} - engines: {node: '>=8.0'} - dependencies: - '@types/node': 18.19.6 - image-ssim: 0.2.0 - jpeg-js: 0.4.4 - - /split2@4.2.0: - resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} - engines: {node: '>= 10.x'} - - /sprintf-js@1.0.3: - resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} - - /sqlstring@2.3.3: - resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} - engines: {node: '>= 0.6'} - - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 - dev: true - - /stdin-discarder@0.2.2: - resolution: {integrity: sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ==} - engines: {node: '>=18'} - dev: false - - /streamx@2.15.1: - resolution: {integrity: sha512-fQMzy2O/Q47rgwErk/eGeLu/roaFWV0jVsogDmrszM9uIw8L5OA+t+V93MgYlufNptfjmYR1tOMWhei/Eh7TQA==} - dependencies: - fast-fifo: 1.3.2 - queue-tick: 1.0.1 - - /string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - - /string-width@4.2.3: - resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} - engines: {node: '>=8'} - dependencies: - emoji-regex: 8.0.0 - is-fullwidth-code-point: 3.0.0 - strip-ansi: 6.0.1 - - /string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - - /string-width@7.0.0: - resolution: {integrity: sha512-GPQHj7row82Hjo9hKZieKcHIhaAIKOJvFSIZXuCU9OASVZrMNUaZuz++SPVrBjnLsnk4k+z9f2EIypgxf2vNFw==} - engines: {node: '>=18'} - dependencies: - emoji-regex: 10.3.0 - get-east-asian-width: 1.2.0 - strip-ansi: 7.1.0 - dev: false - - /string_decoder@1.1.1: - resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} - dependencies: - safe-buffer: 5.1.2 - dev: false - - /string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} - dependencies: - safe-buffer: 5.2.1 - - /strip-ansi@6.0.1: - resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} - engines: {node: '>=8'} - dependencies: - ansi-regex: 5.0.1 - - /strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - dependencies: - ansi-regex: 6.0.1 - - /strip-bom@3.0.0: - resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} - engines: {node: '>=4'} - dev: true - - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} - dev: true - - /strip-json-comments@3.1.1: - resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} - engines: {node: '>=8'} - - /supports-color@5.5.0: - resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} - engines: {node: '>=4'} - dependencies: - has-flag: 3.0.0 - - /supports-color@7.2.0: - resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} - engines: {node: '>=8'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-color@8.1.1: - resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} - engines: {node: '>=10'} - dependencies: - has-flag: 4.0.0 - dev: true - - /supports-preserve-symlinks-flag@1.0.0: - resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} - engines: {node: '>= 0.4'} - - /symbol-tree@3.2.4: - resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} - dev: false - - /tar-fs@2.1.1: - resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} - dependencies: - chownr: 1.1.4 - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 2.2.0 - dev: false - - /tar-fs@3.0.4: - resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} - dependencies: - mkdirp-classic: 0.5.3 - pump: 3.0.0 - tar-stream: 3.1.6 - - /tar-stream@2.2.0: - resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} - engines: {node: '>=6'} - dependencies: - bl: 4.1.0 - end-of-stream: 1.4.4 - fs-constants: 1.0.0 - inherits: 2.0.4 - readable-stream: 3.6.2 - dev: false - - /tar-stream@3.1.6: - resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} - dependencies: - b4a: 1.6.4 - fast-fifo: 1.3.2 - streamx: 2.15.1 - - /tarn@3.0.2: - resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} - engines: {node: '>=8.0.0'} - - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - - /text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - dev: true - - /third-party-web@0.24.1: - resolution: {integrity: sha512-5VqmcM0QEF7KX1/EX9I8Yohs7GoWzhQHXfLOLGmLGbcw/zPdEohXJNctiLu0x4D0i9EzOUjFXlbmcmXcbZXl1Q==} - - /thread-stream@2.4.1: - resolution: {integrity: sha512-d/Ex2iWd1whipbT681JmTINKw0ZwOUBZm7+Gjs64DHuX34mmw8vJL2bFAaNacaW72zYiTJxSHi5abUuOi5nsfg==} - dependencies: - real-require: 0.2.0 - - /through@2.3.8: - resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} - - /thymeleaf@0.20.5: - resolution: {integrity: sha512-3LGXOiKWoJthENI+5oSUy6Y4XhYrQEq8WgoIEiJQixatycTVWPZY1UAiq8gMazcknXGJkVRSMD9OJv42v7uktw==} - engines: {node: '>=10'} - dependencies: - '@babel/runtime': 7.23.1 - '@ultraq/array-utils': 2.1.0 - '@ultraq/dom-utils': 0.4.0 - '@ultraq/string-utils': 2.1.0 - dumb-query-selector: 3.3.0 - jsdom: 16.7.0 - transitivePeerDependencies: - - bufferutil - - canvas - - supports-color - - utf-8-validate - dev: false - - /tildify@2.0.0: - resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} - engines: {node: '>=8'} - - /tldts-core@6.1.2: - resolution: {integrity: sha512-cFBCCSilkRe/7JkZrQlzqhWDE0r1irpEYRp5XiFLFGl8fTwN4eWqutyx9wfFaDfmVv7E7pQMUZnM1VHnOid5Vw==} - - /tldts-icann@6.1.2: - resolution: {integrity: sha512-dQOMfC+yVFZOGyuutzDhuCf/Y/AiPTFdbOm1DVBXgrUOcQ1a2Q5e/udGwl1QE4Bz/uwFZ1EY5wz7AUKcNEkhZA==} - dependencies: - tldts-core: 6.1.2 - - /tmp@0.2.1: - resolution: {integrity: sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==} - engines: {node: '>=8.17.0'} - dependencies: - rimraf: 3.0.2 - dev: false - - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - - /to-regex-range@5.0.1: - resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} - engines: {node: '>=8.0'} - dependencies: - is-number: 7.0.0 - - /toad-cache@3.3.0: - resolution: {integrity: sha512-3oDzcogWGHZdkwrHyvJVpPjA7oNzY6ENOV3PsWJY9XYPZ6INo94Yd47s5may1U+nleBPwDhrRiTPMIvKaa3MQg==} - engines: {node: '>=12'} - - /tough-cookie@4.0.0: - resolution: {integrity: sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.1.2 - dev: false - - /tough-cookie@4.1.3: - resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} - engines: {node: '>=6'} - dependencies: - psl: 1.9.0 - punycode: 2.3.0 - universalify: 0.2.0 - url-parse: 1.5.10 - dev: false - - /tr46@0.0.3: - resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} - - /tr46@2.1.0: - resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} - engines: {node: '>=8'} - dependencies: - punycode: 2.3.0 - dev: false - - /traverse@0.3.9: - resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} - dev: false - - /ts-api-utils@1.0.3(typescript@5.3.3): - resolution: {integrity: sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg==} - engines: {node: '>=16.13.0'} - peerDependencies: - typescript: '>=4.2.0' - dependencies: - typescript: 5.3.3 - dev: true - - /ts-jest@29.1.1(jest@29.7.0)(typescript@5.3.3): - resolution: {integrity: sha512-D6xjnnbP17cC85nliwGiL+tpoKN0StpgE0TeOjXQTU6MVCfsB4v7aW05CgQ/1OywGb0x/oy9hHFnN+sczTiRaA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@18.19.6)(ts-node@10.9.1) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.5.4 - typescript: 5.3.3 - yargs-parser: 21.1.1 - dev: true - - /ts-morph@20.0.0: - resolution: {integrity: sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==} - dependencies: - '@ts-morph/common': 0.21.0 - code-block-writer: 12.0.0 - dev: false - - /ts-node@10.9.1(@types/node@18.19.6)(typescript@5.3.3): - resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} - hasBin: true - peerDependencies: - '@swc/core': '>=1.2.50' - '@swc/wasm': '>=1.2.50' - '@types/node': '*' - typescript: '>=2.7' - peerDependenciesMeta: - '@swc/core': - optional: true - '@swc/wasm': - optional: true - dependencies: - '@cspotcode/source-map-support': 0.8.1 - '@tsconfig/node10': 1.0.9 - '@tsconfig/node12': 1.0.11 - '@tsconfig/node14': 1.0.3 - '@tsconfig/node16': 1.0.4 - '@types/node': 18.19.6 - acorn: 8.10.0 - acorn-walk: 8.2.0 - arg: 4.1.3 - create-require: 1.1.1 - diff: 4.0.2 - make-error: 1.3.6 - typescript: 5.3.3 - v8-compile-cache-lib: 3.0.1 - yn: 3.1.1 - dev: true - - /tsconfig-paths@4.2.0: - resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==} - engines: {node: '>=6'} - dependencies: - json5: 2.2.3 - minimist: 1.2.8 - strip-bom: 3.0.0 - dev: true - - /tslib@1.14.1: - resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} - - /tslib@2.6.2: - resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} - - /type-check@0.4.0: - resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} - engines: {node: '>= 0.8.0'} - dependencies: - prelude-ls: 1.2.1 - dev: true - - /type-detect@4.0.8: - resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} - engines: {node: '>=4'} - dev: true - - /type-fest@0.20.2: - resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} - engines: {node: '>=10'} - dev: true - - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - - /type-fest@3.13.1: - resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} - engines: {node: '>=14.16'} - - /type-fest@4.9.0: - resolution: {integrity: sha512-KS/6lh/ynPGiHD/LnAobrEFq3Ad4pBzOlJ1wAnJx9N4EYoqFhMfLIBjUT2UEx4wg5ZE+cC1ob6DCSpppVo+rtg==} - engines: {node: '>=16'} - dev: true - - /typedarray-to-buffer@3.1.5: - resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} - dependencies: - is-typedarray: 1.0.0 - - /typescript@5.3.3: - resolution: {integrity: sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==} - engines: {node: '>=14.17'} - hasBin: true - - /umzug@3.3.1: - resolution: {integrity: sha512-jG3C35jti1YnCuH/k3fJEfHbnIG9c3Q9ITZ0B9eWwnXngh/AUd0mRHv8OdpE2Q9VoK7tB6xL990JrMCr0LtfNA==} - engines: {node: '>=12'} - dependencies: - '@rushstack/ts-command-line': 4.16.1 - emittery: 0.13.1 - glob: 8.1.0 - pony-cause: 2.1.10 - type-fest: 3.13.1 - - /unbzip2-stream@1.4.3: - resolution: {integrity: sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==} - dependencies: - buffer: 5.7.1 - through: 2.3.8 - - /undici-types@5.26.5: - resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - - /unique-string@2.0.0: - resolution: {integrity: sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==} - engines: {node: '>=8'} - dependencies: - crypto-random-string: 2.0.0 - - /universalify@0.1.2: - resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} - engines: {node: '>= 4.0.0'} - - /universalify@0.2.0: - resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} - engines: {node: '>= 4.0.0'} - dev: false - - /universalify@2.0.0: - resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} - engines: {node: '>= 10.0.0'} - - /unzipper@0.10.14: - resolution: {integrity: sha512-ti4wZj+0bQTiX2KmKWuwj7lhV+2n//uXEotUmGuQqrbVZSEGFMbI68+c6JCQ8aAmUWYvtHEz2A8K6wXvueR/6g==} - dependencies: - big-integer: 1.6.51 - binary: 0.3.0 - bluebird: 3.4.7 - buffer-indexof-polyfill: 1.0.2 - duplexer2: 0.1.4 - fstream: 1.0.12 - graceful-fs: 4.2.11 - listenercount: 1.0.1 - readable-stream: 2.3.8 - setimmediate: 1.0.5 - dev: false - - /update-browserslist-db@1.0.13(browserslist@4.22.1): - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.22.1 - escalade: 3.1.1 - picocolors: 1.0.0 - dev: true - - /uri-js@4.4.1: - resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} - dependencies: - punycode: 2.3.0 - - /url-parse@1.5.10: - resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} - dependencies: - querystringify: 2.2.0 - requires-port: 1.0.0 - dev: false - - /urlpattern-polyfill@9.0.0: - resolution: {integrity: sha512-WHN8KDQblxd32odxeIgo83rdVDE2bvdkb86it7bMhYZwWKJz0+O0RK/eZiHYnM+zgt/U7hAHOlCQGfjjvSkw2g==} - - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - - /uuid@8.0.0: - resolution: {integrity: sha512-jOXGuXZAWdsTH7eZLtyXMqUb9EcWMGZNbL9YcGBJl4MH4nrxHmZJhEHvyLFrkxo+28uLb/NYRcStH48fnD0Vzw==} - hasBin: true - dev: false - - /uuid@8.3.2: - resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} - hasBin: true - dev: false - - /v8-compile-cache-lib@3.0.1: - resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} - dev: true - - /v8-to-istanbul@9.1.3: - resolution: {integrity: sha512-9lDD+EVI2fjFsMWXc6dy5JJzBsVTcQ2fVkfBvncZ6xJWG9wtBhOldG+mHkSL0+V1K/xgZz0JDO5UT5hFwHUghg==} - engines: {node: '>=10.12.0'} - dependencies: - '@jridgewell/trace-mapping': 0.3.19 - '@types/istanbul-lib-coverage': 2.0.4 - convert-source-map: 2.0.0 - dev: true - - /w3c-hr-time@1.0.2: - resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} - deprecated: Use your platform's native performance.now() and performance.timeOrigin. - dependencies: - browser-process-hrtime: 1.0.0 - dev: false - - /w3c-xmlserializer@2.0.0: - resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} - engines: {node: '>=10'} - dependencies: - xml-name-validator: 3.0.0 - dev: false - - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - - /webidl-conversions@3.0.1: - resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} - - /webidl-conversions@5.0.0: - resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} - engines: {node: '>=8'} - dev: false - - /webidl-conversions@6.1.0: - resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} - engines: {node: '>=10.4'} - dev: false - - /whatwg-encoding@1.0.5: - resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} - dependencies: - iconv-lite: 0.4.24 - dev: false - - /whatwg-mimetype@2.3.0: - resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} - dev: false - - /whatwg-url@5.0.0: - resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - dependencies: - tr46: 0.0.3 - webidl-conversions: 3.0.1 - - /whatwg-url@8.7.0: - resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} - engines: {node: '>=10'} - dependencies: - lodash: 4.17.21 - tr46: 2.1.0 - webidl-conversions: 6.1.0 - dev: false - - /which@2.0.2: - resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} - engines: {node: '>= 8'} - hasBin: true - dependencies: - isexe: 2.0.0 - - /wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - /wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - - /wrappy@1.0.2: - resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - - /write-file-atomic@3.0.3: - resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} - dependencies: - imurmurhash: 0.1.4 - is-typedarray: 1.0.0 - signal-exit: 3.0.7 - typedarray-to-buffer: 3.1.5 - - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - - /ws@7.5.9: - resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} - engines: {node: '>=8.3.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /ws@8.16.0: - resolution: {integrity: sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - - /xdg-basedir@4.0.0: - resolution: {integrity: sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==} - engines: {node: '>=8'} - - /xml-name-validator@3.0.0: - resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} - dev: false - - /xml2js@0.4.23: - resolution: {integrity: sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==} - engines: {node: '>=4.0.0'} - dependencies: - sax: 1.3.0 - xmlbuilder: 11.0.1 - dev: false - - /xmlbuilder@11.0.1: - resolution: {integrity: sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==} - engines: {node: '>=4.0'} - dev: false - - /xmlchars@2.2.0: - resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} - dev: false - - /y18n@5.0.8: - resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} - engines: {node: '>=10'} - - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - - /yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} - - /yaml@1.10.2: - resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} - engines: {node: '>= 6'} - dev: false - - /yargs-parser@20.2.9: - resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} - engines: {node: '>=10'} - dev: false - - /yargs-parser@21.1.1: - resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} - engines: {node: '>=12'} - - /yargs@16.2.0: - resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} - engines: {node: '>=10'} - dependencies: - cliui: 7.0.4 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 20.2.9 - dev: false - - /yargs@17.7.2: - resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} - engines: {node: '>=12'} - dependencies: - cliui: 8.0.1 - escalade: 3.1.1 - get-caller-file: 2.0.5 - require-directory: 2.1.1 - string-width: 4.2.3 - y18n: 5.0.8 - yargs-parser: 21.1.1 - - /yauzl@2.10.0: - resolution: {integrity: sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==} - dependencies: - buffer-crc32: 0.2.13 - fd-slicer: 1.1.0 - - /yn@3.1.1: - resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} - engines: {node: '>=6'} - dev: true - - /yocto-queue@0.1.0: - resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} - engines: {node: '>=10'} - - /zip-stream@4.1.1: - resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==} - engines: {node: '>= 10'} - dependencies: - archiver-utils: 3.0.4 - compress-commons: 4.1.2 - readable-stream: 3.6.2 - dev: false - - github.com/cnumr/GreenIT-Analysis-cli/a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571: - resolution: {tarball: https://codeload.github.com/cnumr/GreenIT-Analysis-cli/tar.gz/a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571} - name: greenit-cli - version: 1.0.0 - hasBin: true - requiresBuild: true - dependencies: - axios: 0.21.4 - concat-files: 0.1.1 - exceljs: 4.3.0 - glob: 7.2.3 - progress: 2.0.3 - puppeteer: 5.5.0 - puppeteer-har: 1.1.2(puppeteer@5.5.0) - sitemapper: 3.2.6 - thymeleaf: 0.20.5 - yaml: 1.10.2 - yargs: 16.2.0 - transitivePeerDependencies: - - bufferutil - - canvas - - debug - - encoding - - supports-color - - utf-8-validate - dev: false diff --git a/common/config/rush/repo-state.json b/common/config/rush/repo-state.json deleted file mode 100644 index 0e7b1440..00000000 --- a/common/config/rush/repo-state.json +++ /dev/null @@ -1,4 +0,0 @@ -// DO NOT MODIFY THIS FILE MANUALLY BUT DO COMMIT IT. It is generated and used by Rush. -{ - "preferredVersionsHash": "bf21a9e8fbc5a3846fb05b4fa0859e0917b2202f" -} diff --git a/common/git-hooks/pre-commit b/common/git-hooks/pre-commit deleted file mode 100755 index 2438e23d..00000000 --- a/common/git-hooks/pre-commit +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/sh -# Called by "git commit" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message if -# it wants to stop the commit. - -# Invoke the "rush prettier" custom command to reformat files whenever they -# are committed. The command is defined in common/config/rush/command-line.json -# and uses the "rush-prettier" autoinstaller. -node common/scripts/install-run-rush.js prettier || exit $? \ No newline at end of file diff --git a/common/git-hooks/pre-push b/common/git-hooks/pre-push deleted file mode 100755 index ce952ab5..00000000 --- a/common/git-hooks/pre-push +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/sh -# Called by "git push" with no arguments. The hook should -# exit with non-zero status after issuing an appropriate message if -# it wants to stop the commit. - -COMMAND=/usr/local/bin/rush - -echo -------------------------------------------- -echo Starting Git hook: pre-push - -if [ -f $COMMAND ]; then - echo Invoking $COMMAND lint - $COMMAND lint -else - echo Command not installed: $COMMAND lint -fi - -echo Finished Git hook: pre-push -echo -------------------------------------------- \ No newline at end of file diff --git a/rush.json b/rush.json deleted file mode 100644 index 5cc38b79..00000000 --- a/rush.json +++ /dev/null @@ -1,447 +0,0 @@ -/** - * This is the main configuration file for Rush. - * For full documentation, please see https://rushjs.io - */ -{ - "$schema": "https://developer.microsoft.com/json-schemas/rush/v5/rush.schema.json", - - /** - * (Required) This specifies the version of the Rush engine to be used in this repo. - * Rush's "version selector" feature ensures that the globally installed tool will - * behave like this release, regardless of which version is installed globally. - * - * The common/scripts/install-run-rush.js automation script also uses this version. - * - * NOTE: If you upgrade to a new major version of Rush, you should replace the "v5" - * path segment in the "$schema" field for all your Rush config files. This will ensure - * correct error-underlining and tab-completion for editors such as VS Code. - */ - "rushVersion": "5.112.2", - - /** - * The next field selects which package manager should be installed and determines its version. - * Rush installs its own local copy of the package manager to ensure that your build process - * is fully isolated from whatever tools are present in the local environment. - * - * Specify one of: "pnpmVersion", "npmVersion", or "yarnVersion". See the Rush documentation - * for details about these alternatives. - */ - "pnpmVersion": "8.14.1", - - /** - * Options that are only used when the PNPM package manager is selected - */ - "pnpmOptions": { - /** - * If true, then Rush will add the "--strict-peer-dependencies" option when invoking PNPM. - * This causes "rush install" to fail if there are unsatisfied peer dependencies, which is - * an invalid state that can cause build failures or incompatible dependency versions. - * (For historical reasons, JavaScript package managers generally do not treat this invalid - * state as an error.) - * - * The default value is false to avoid legacy compatibility issues. - * It is strongly recommended to set strictPeerDependencies=true. - */ - "strictPeerDependencies": true, - - /** - * Configures the strategy used to select versions during installation. - * - * This feature requires PNPM version 3.1 or newer. It corresponds to the "--resolution-strategy" command-line - * option for PNPM. Possible values are "fast" and "fewer-dependencies". PNPM's default is "fast", but this may - * be incompatible with certain packages, for example the "@types" packages from DefinitelyTyped. Rush's default - * is "fewer-dependencies", which causes PNPM to avoid installing a newer version if an already installed version - * can be reused; this is more similar to NPM's algorithm. - */ - // "resolutionStrategy": "fast" - - /** - * If true, then `rush install` will use the PNPM workspaces feature to perform the - * install. - * - * This feature uses PNPM to perform the entire monorepo install. When using workspaces, Rush will - * generate a "pnpm-workspace.yaml" file referencing all local projects to install. Rush will - * also generate a "pnpmfile.js" which is used to provide preferred versions support. When install - * is run, this pnpmfile will be used to replace dependency version ranges with a smaller subset - * of the original range. If the preferred version is not fully a subset of the original version - * range, it will be left as-is. After this, the pnpmfile.js provided in the repository (if one - * exists) will be called to further modify package dependencies. - * - * This option is experimental. The default value is false. - */ - "useWorkspaces": true - }, - - /** - * Older releases of the NodeJS engine may be missing features required by your system. - * Other releases may have bugs. In particular, the "latest" version will not be a - * Long Term Support (LTS) version and is likely to have regressions. - * - * Specify a SemVer range to ensure developers use a NodeJS version that is appropriate - * for your repo. - */ - "nodeSupportedVersionRange": ">=18 <22", - - /** - * If you would like the version specifiers for your dependencies to be consistent, then - * uncomment this line. This is effectively similar to running "rush check" before any - * of the following commands: - * - * rush install, rush update, rush link, rush version, rush publish - * - * In some cases you may want this turned on, but need to allow certain packages to use a different - * version. In those cases, you will need to add an entry to the "allowedAlternativeVersions" - * section of the common-versions.json. - */ - "ensureConsistentVersions": true, - - /** - * Large monorepos can become intimidating for newcomers if project folder paths don't follow - * a consistent and recognizable pattern. When the system allows nested folder trees, - * we've found that teams will often use subfolders to create islands that isolate - * their work from others ("shipping the org"). This hinders collaboration and code sharing. - * - * The Rush developers recommend a "category folder" model, where buildable project folders - * must always be exactly two levels below the repo root. The parent folder acts as the category. - * This provides a basic facility for grouping related projects (e.g. "apps", "libaries", - * "tools", "prototypes") while still encouraging teams to organize their projects into - * a unified taxonomy. Limiting to 2 levels seems very restrictive at first, but if you have - * 20 categories and 20 projects in each category, this scheme can easily accommodate hundreds - * of projects. In practice, you will find that the folder hierarchy needs to be rebalanced - * occasionally, but if that's painful, it's a warning sign that your development style may - * discourage refactoring. Reorganizing the categories should be an enlightening discussion - * that brings people together, and maybe also identifies poor coding practices (e.g. file - * references that reach into other project's folders without using NodeJS module resolution). - * - * The defaults are projectFolderMinDepth=1 and projectFolderMaxDepth=2. - * - * To remove these restrictions, you could set projectFolderMinDepth=1 - * and set projectFolderMaxDepth to a large number. - */ - "projectFolderMinDepth": 1, - "projectFolderMaxDepth": 2, - - /** - * This feature helps you to review and approve new packages before they are introduced - * to your monorepo. For example, you may be concerned about licensing, code quality, - * performance, or simply accumulating too many libraries with overlapping functionality. - * The approvals are tracked in two config files "browser-approved-packages.json" - * and "nonbrowser-approved-packages.json". See the Rush documentation for details. - */ - // "approvedPackagesPolicy": { - // /** - // * The review categories allow you to say for example "This library is approved for usage - // * in prototypes, but not in production code." - // * - // * Each project can be associated with one review category, by assigning the "reviewCategory" field - // * in the "projects" section of rush.json. The approval is then recorded in the files - // * "common/config/rush/browser-approved-packages.json" and "nonbrowser-approved-packages.json" - // * which are automatically generated during "rush update". - // * - // * Designate categories with whatever granularity is appropriate for your review process, - // * or you could just have a single category called "default". - // */ - // "reviewCategories": [ - // // Some example categories: - // "production", // projects that ship to production - // "tools", // non-shipping projects that are part of the developer toolchain - // "prototypes" // experiments that should mostly be ignored by the review process - // ], - // - // /** - // * A list of NPM package scopes that will be excluded from review. - // * We recommend to exclude TypeScript typings (the "@types" scope), because - // * if the underlying package was already approved, this would imply that the typings - // * are also approved. - // */ - // // "ignoredNpmScopes": [ "@types" ] - // }, - - /** - * If you use Git as your version control system, this section has some additional - * optional features you can use. - */ - "gitPolicy": { - /** - * Work at a big company? Tired of finding Git commits at work with unprofessional Git - * emails such as "beer-lover@my-college.edu"? Rush can validate people's Git email address - * before they get started. - * - * Define a list of regular expressions describing allowable e-mail patterns for Git commits. - * They are case-insensitive anchored JavaScript RegExps. Example: ".*@example\.com" - * - * IMPORTANT: Because these are regular expressions encoded as JSON string literals, - * RegExp escapes need two backslashes, and ordinary periods should be "\\.". - */ - // "allowedEmailRegExps": [ - // "[^@]+@users\\.noreply\\.github\\.com", - // "rush-bot@example\\.org" - // ], - - /** - * When Rush reports that the address is malformed, the notice can include an example - * of a recommended email. Make sure it conforms to one of the allowedEmailRegExps - * expressions. - */ - // "sampleEmail": "example@users.noreply.github.com", - - /** - * The commit message to use when committing changes during 'rush publish'. - * - * For example, if you want to prevent these commits from triggering a CI build, - * you might configure your system's trigger to look for a special string such as "[skip-ci]" - * in the commit message, and then customize Rush's message to contain that string. - */ - "versionBumpCommitMessage": "feat: bump versions", - - /** - * The commit message to use when committing changes during 'rush version'. - * - * For example, if you want to prevent these commits from triggering a CI build, - * you might configure your system's trigger to look for a special string such as "[skip-ci]" - * in the commit message, and then customize Rush's message to contain that string. - */ - "changeLogUpdateCommitMessage": "docs: update changelogs" - - /** - * The commit message to use when commiting changefiles during 'rush change --commit' - * - * If no commit message is set it will default to 'Rush change' - */ - // "changefilesCommitMessage": "Rush change" - }, - - "repository": { - /** - * The URL of this Git repository, used by "rush change" to determine the base branch for your PR. - * - * The "rush change" command needs to determine which files are affected by your PR diff. - * If you merged or cherry-picked commits from the main branch into your PR branch, those commits - * should be excluded from this diff (since they belong to some other PR). In order to do that, - * Rush needs to know where to find the base branch for your PR. This information cannot be - * determined from Git alone, since the "pull request" feature is not a Git concept. Ideally - * Rush would use a vendor-specific protocol to query the information from GitHub, Azure DevOps, etc. - * But to keep things simple, "rush change" simply assumes that your PR is against the "main" branch - * of the Git remote indicated by the respository.url setting in rush.json. If you are working in - * a GitHub "fork" of the real repo, this setting will be different from the repository URL of your - * your PR branch, and in this situation "rush change" will also automatically invoke "git fetch" - * to retrieve the latest activity for the remote main branch. - */ - "url": "git@github.com:faberNovel/heart.git", - - /** - * The default branch name. This tells "rush change" which remote branch to compare against. - * The default value is "main" - */ - "defaultBranch": "main" - }, - - /** - * Event hooks are customized script actions that Rush executes when specific events occur - */ - "eventHooks": { - /** - * The list of shell commands to run before the Rush installation starts - */ - "preRushInstall": [ - // "common/scripts/pre-rush-install.js" - ], - - /** - * The list of shell commands to run after the Rush installation finishes - */ - "postRushInstall": [], - - /** - * The list of shell commands to run before the Rush build command starts - */ - "preRushBuild": [], - - /** - * The list of shell commands to run after the Rush build command finishes - */ - "postRushBuild": [] - }, - - /** - * Installation variants allow you to maintain a parallel set of configuration files that can be - * used to build the entire monorepo with an alternate set of dependencies. For example, suppose - * you upgrade all your projects to use a new release of an important framework, but during a transition period - * you intend to maintain compability with the old release. In this situation, you probably want your - * CI validation to build the entire repo twice: once with the old release, and once with the new release. - * - * Rush "installation variants" correspond to sets of config files located under this folder: - * - * common/config/rush/variants/ - * - * The variant folder can contain an alternate common-versions.json file. Its "preferredVersions" field can be used - * to select older versions of dependencies (within a loose SemVer range specified in your package.json files). - * To install a variant, run "rush install --variant ". - * - * For more details and instructions, see this article: https://rushjs.io/pages/advanced/installation_variants/ - */ - "variants": [ - // { - // /** - // * The folder name for this variant. - // */ - // "variantName": "old-sdk", - // - // /** - // * An informative description - // */ - // "description": "Build this repo using the previous release of the SDK" - // } - ], - - /** - * Rush can collect anonymous telemetry about everyday developer activity such as - * success/failure of installs, builds, and other operations. You can use this to identify - * problems with your toolchain or Rush itself. THIS TELEMETRY IS NOT SHARED WITH MICROSOFT. - * It is written into JSON files in the common/temp folder. It's up to you to write scripts - * that read these JSON files and do something with them. These scripts are typically registered - * in the "eventHooks" section. - */ - "telemetryEnabled": false, - - /** - * Allows creation of hotfix changes. This feature is experimental so it is disabled by default. - */ - // "hotfixChangeEnabled": false, - - /** - * (Required) This is the inventory of projects to be managed by Rush. - * - * Rush does not automatically scan for projects using wildcards, for a few reasons: - * 1. Depth-first scans are expensive, particularly when tools need to repeatedly collect the list. - * 2. On a caching CI machine, scans can accidentally pick up files left behind from a previous build. - * 3. It's useful to have a centralized inventory of all projects and their important metadata. - */ - "projects": [ - // { - // /** - // * The NPM package name of the project (must match package.json) - // */ - // "packageName": "my-app", - // - // /** - // * The path to the project folder, relative to the rush.json config file. - // */ - // "projectFolder": "apps/my-app", - // - // /** - // * An optional category for usage in the "browser-approved-packages.json" - // * and "nonbrowser-approved-packages.json" files. The value must be one of the - // * strings from the "reviewCategories" defined above. - // */ - // "reviewCategory": "production", - // - // /** - // * A list of local projects that appear as devDependencies for this project, but cannot be - // * locally linked because it would create a cyclic dependency; instead, the last published - // * version will be installed in the Common folder. - // */ - // "cyclicDependencyProjects": [ - // // "my-toolchain" - // ], - // - // /** - // * If true, then this project will be ignored by the "rush check" command. - // * The default value is false. - // */ - // // "skipRushCheck": false, - // - // /** - // * A flag indicating that changes to this project will be published to npm, which affects - // * the Rush change and publish workflows. The default value is false. - // * NOTE: "versionPolicyName" and "shouldPublish" are alternatives; you cannot specify them both. - // */ - // // "shouldPublish": false, - // - // /** - // * An optional version policy associated with the project. Version policies are defined - // * in "version-policies.json" file. See the "rush publish" documentation for more info. - // * NOTE: "versionPolicyName" and "shouldPublish" are alternatives; you cannot specify them both. - // */ - // // "versionPolicyName": "" - // }, - // - // { - // "packageName": "my-controls", - // "projectFolder": "libraries/my-controls", - // "reviewCategory": "production" - // }, - // - // { - // "packageName": "my-toolchain", - // "projectFolder": "tools/my-toolchain", - // "reviewCategory": "tools" - // } - { - "packageName": "@fabernovel/heart-test", - "projectFolder": "test", - "shouldPublish": false, - "tags": ["test"] - }, - { - "packageName": "@fabernovel/heart-api", - "projectFolder": "modules/api", - "versionPolicyName": "individualVersion", - "tags": ["server", "api"] - }, - { - "packageName": "@fabernovel/heart-cli", - "projectFolder": "modules/cli", - "versionPolicyName": "individualVersion", - "tags": ["cli"] - }, - { - "packageName": "@fabernovel/heart-common", - "projectFolder": "modules/common", - "versionPolicyName": "individualVersion", - "tags": ["common"] - }, - { - "packageName": "@fabernovel/heart-greenit", - "projectFolder": "modules/greenit", - "versionPolicyName": "individualVersion", - "tags": ["analysis", "greenit"] - }, - { - "packageName": "@fabernovel/heart-lighthouse", - "projectFolder": "modules/lighthouse", - "versionPolicyName": "individualVersion", - "tags": ["analysis", "lighthouse"] - }, - { - "packageName": "@fabernovel/heart-mysql", - "projectFolder": "modules/mysql", - "versionPolicyName": "individualVersion", - "tags": ["listener", "mysql"] - }, - { - "packageName": "@fabernovel/heart-observatory", - "projectFolder": "modules/observatory", - "versionPolicyName": "individualVersion", - "tags": ["analysis", "observatory"] - }, - { - "packageName": "@fabernovel/heart-slack", - "projectFolder": "modules/slack", - "versionPolicyName": "individualVersion", - "tags": ["listener", "slack"] - }, - { - "packageName": "@fabernovel/heart-ssllabs-server", - "projectFolder": "modules/ssllabs-server", - "versionPolicyName": "individualVersion", - "tags": ["analysis", "ssllabs-server"] - }, - { - "packageName": "@fabernovel/heart-tpl", - "projectFolder": "modules/tpl", - "shouldPublish": false, - "tags": ["tpl"] - } - ] -} From 938ead4d42ac144e38842d4c491dab838cffe8a3 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 03:47:24 +0200 Subject: [PATCH 17/28] refactor: remove duplicates declarations --- tsconfig.options.json | 7 ------- 1 file changed, 7 deletions(-) diff --git a/tsconfig.options.json b/tsconfig.options.json index c1198564..45910fc2 100644 --- a/tsconfig.options.json +++ b/tsconfig.options.json @@ -8,15 +8,8 @@ "allowUnreachableCode": false, // Disable error reporting for unused labels. "allowUnusedLabels": false, - // Enable error reporting for codepaths that do not explicitly return in a function. - "noImplicitReturns": true, - // Enable error reporting when local variables aren't read. - "noUnusedLocals": true, // Raise an error when a function parameter isn't read. "noUnusedParameters": true, - // Enable all strict type-checking options. - "strict": true, - "verbatimModuleSyntax": true, "declaration": true, "removeComments": true, From e2055ccf9e5636a8775630d01c858eb61ba89b14 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 03:47:38 +0200 Subject: [PATCH 18/28] feat: add VSCode extensions suggestions --- .gitignore | 3 --- .vscode/extensions.json | 6 ++++++ 2 files changed, 6 insertions(+), 3 deletions(-) create mode 100644 .vscode/extensions.json diff --git a/.gitignore b/.gitignore index e083e83b..156e670c 100644 --- a/.gitignore +++ b/.gitignore @@ -19,9 +19,6 @@ lib # OS X temporary files .DS_Store -# Visual Studio Code -.vscode - # MikroORM temporary directory modules/*/temp test/temp diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..afd70d62 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,6 @@ +{ + "recommendations": [ + "moonrepo.moon-console", + "biomejs.biome" + ] +} \ No newline at end of file From 2cca2dd152db2f38e09128de299e180b9e15a378 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 05:18:05 +0200 Subject: [PATCH 19/28] refactor: move rimraf to developer tools dependencies --- modules/api/package.json | 3 +- modules/cli/package.json | 1 - modules/common/package.json | 1 - modules/greenit/package.json | 3 +- modules/lighthouse/package.json | 3 +- modules/mysql/package.json | 1 - modules/observatory/package.json | 3 +- modules/slack/package.json | 3 +- modules/ssllabs-server/package.json | 3 +- modules/tpl/package.json | 3 +- package.json | 1 + pnpm-lock.yaml | 55 +++++++++++++---------------- 12 files changed, 33 insertions(+), 47 deletions(-) diff --git a/modules/api/package.json b/modules/api/package.json index 7574e3a5..87471032 100644 --- a/modules/api/package.json +++ b/modules/api/package.json @@ -38,8 +38,7 @@ }, "devDependencies": { "@types/express": "^4.17.21", - "@types/node": "^18.19.6", - "rimraf": "^5.0.5" + "@types/node": "^18.19.6" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/cli/package.json b/modules/cli/package.json index a5b364b5..f78a1e56 100644 --- a/modules/cli/package.json +++ b/modules/cli/package.json @@ -44,7 +44,6 @@ "@fastify/cors": "^8.5.0", "@types/node": "^18.19.6", "fastify": "^4.25.2", - "rimraf": "^5.0.5", "type-fest": "^4.9.0" }, "engines": { diff --git a/modules/common/package.json b/modules/common/package.json index f6f0af77..59624335 100644 --- a/modules/common/package.json +++ b/modules/common/package.json @@ -41,7 +41,6 @@ "@types/node": "^18.19.6", "fastify": "^4.25.2", "lighthouse": "^11.4.0", - "rimraf": "^5.0.5", "type-fest": "^4.9.0" }, "engines": { diff --git a/modules/greenit/package.json b/modules/greenit/package.json index 75925c2c..2af772c2 100644 --- a/modules/greenit/package.json +++ b/modules/greenit/package.json @@ -39,8 +39,7 @@ "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0", "greenit-cli": "github:cnumr/GreenIT-Analysis-cli#a4363a9bcf7630e4a5a4cd264a7da9ec6f34b571", - "puppeteer": "^21.7.0", - "rimraf": "^5.0.5" + "puppeteer": "^21.7.0" }, "devDependencies": { "@types/node": "^18.19.6" diff --git a/modules/lighthouse/package.json b/modules/lighthouse/package.json index f8974598..eadc81ac 100644 --- a/modules/lighthouse/package.json +++ b/modules/lighthouse/package.json @@ -36,8 +36,7 @@ "puppeteer": "^21.7.0" }, "devDependencies": { - "@types/node": "^18.19.6", - "rimraf": "^5.0.5" + "@types/node": "^18.19.6" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/mysql/package.json b/modules/mysql/package.json index 6e979cd0..e0bd5a90 100644 --- a/modules/mysql/package.json +++ b/modules/mysql/package.json @@ -38,7 +38,6 @@ "devDependencies": { "@mikro-orm/cli": "^5.9.7", "@types/node": "^18.19.6", - "rimraf": "^5.0.5", "ts-node": "^10.9.1" }, "peerDependencies": { diff --git a/modules/observatory/package.json b/modules/observatory/package.json index 6d319303..76b8e659 100644 --- a/modules/observatory/package.json +++ b/modules/observatory/package.json @@ -33,8 +33,7 @@ "@fabernovel/heart-common": "workspace:^4.0.0" }, "devDependencies": { - "@types/node": "^18.19.6", - "rimraf": "^5.0.5" + "@types/node": "^18.19.6" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/slack/package.json b/modules/slack/package.json index ac5ef26d..63d9c099 100644 --- a/modules/slack/package.json +++ b/modules/slack/package.json @@ -34,8 +34,7 @@ "@slack/web-api": "^6.11.2" }, "devDependencies": { - "@types/node": "^18.19.6", - "rimraf": "^5.0.5" + "@types/node": "^18.19.6" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/ssllabs-server/package.json b/modules/ssllabs-server/package.json index 337d2785..bc65c74d 100644 --- a/modules/ssllabs-server/package.json +++ b/modules/ssllabs-server/package.json @@ -33,8 +33,7 @@ "@fabernovel/heart-common": "workspace:^4.0.0" }, "devDependencies": { - "@types/node": "^18.19.6", - "rimraf": "^5.0.5" + "@types/node": "^18.19.6" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/modules/tpl/package.json b/modules/tpl/package.json index 559ed154..d987a332 100644 --- a/modules/tpl/package.json +++ b/modules/tpl/package.json @@ -35,8 +35,7 @@ "@fabernovel/heart-common": "workspace:^4.0.0" }, "devDependencies": { - "@types/node": "^18.19.6", - "rimraf": "^5.0.5" + "@types/node": "^18.19.6" }, "peerDependencies": { "@fabernovel/heart-cli": "^4.0.0" diff --git a/package.json b/package.json index ffbdeaef..60e6c5ac 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,7 @@ "@jest/globals": "^29.7.0", "@types/jest": "^29.5.11", "jest": "^29.7.0", + "rimraf": "^5.0.5", "ts-jest": "^29.1.1", "tsconfig-moon": "^1.3.0", "typescript": "^5.3.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index def228d9..ccb9ed8a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: jest: specifier: ^29.7.0 version: 29.7.0 + rimraf: + specifier: ^5.0.5 + version: 5.0.7 ts-jest: specifier: ^29.1.1 version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) @@ -57,9 +60,6 @@ importers: '@types/node': specifier: ^18.19.6 version: 18.19.33 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 modules/cli: dependencies: @@ -94,9 +94,6 @@ importers: fastify: specifier: ^4.25.2 version: 4.27.0 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 type-fest: specifier: ^4.9.0 version: 4.18.3 @@ -137,9 +134,6 @@ importers: lighthouse: specifier: ^11.4.0 version: 11.7.1 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 type-fest: specifier: ^4.9.0 version: 4.18.3 @@ -158,9 +152,6 @@ importers: puppeteer: specifier: ^21.7.0 version: 21.11.0(typescript@5.4.5) - rimraf: - specifier: ^5.0.5 - version: 5.0.7 devDependencies: '@types/node': specifier: ^18.19.6 @@ -184,9 +175,6 @@ importers: '@types/node': specifier: ^18.19.6 version: 18.19.33 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 modules/mysql: dependencies: @@ -212,9 +200,6 @@ importers: '@types/node': specifier: ^18.19.6 version: 18.19.33 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 ts-node: specifier: ^10.9.1 version: 10.9.2(@types/node@18.19.33)(typescript@5.4.5) @@ -231,9 +216,6 @@ importers: '@types/node': specifier: ^18.19.6 version: 18.19.33 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 modules/slack: dependencies: @@ -250,9 +232,6 @@ importers: '@types/node': specifier: ^18.19.6 version: 18.19.33 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 modules/ssllabs-server: dependencies: @@ -266,9 +245,6 @@ importers: '@types/node': specifier: ^18.19.6 version: 18.19.33 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 modules/tpl: dependencies: @@ -282,9 +258,6 @@ importers: '@types/node': specifier: ^18.19.6 version: 18.19.33 - rimraf: - specifier: ^5.0.5 - version: 5.0.7 packages: @@ -810,6 +783,7 @@ packages: strip-ansi-cjs: /strip-ansi@6.0.1 wrap-ansi: 8.1.0 wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: true /@istanbuljs/load-nyc-config@1.1.0: resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} @@ -1321,6 +1295,7 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} requiresBuild: true + dev: true optional: true /@puppeteer/browsers@1.9.1: @@ -1922,6 +1897,7 @@ packages: /ansi-styles@6.2.1: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} + dev: true /anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} @@ -2584,6 +2560,7 @@ packages: path-key: 3.1.1 shebang-command: 2.0.0 which: 2.0.2 + dev: true /crypto-random-string@2.0.0: resolution: {integrity: sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==} @@ -2793,6 +2770,7 @@ packages: /eastasianwidth@0.2.0: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: true /electron-to-chromium@1.4.788: resolution: {integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==} @@ -2811,6 +2789,7 @@ packages: /emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: true /end-of-stream@1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} @@ -3101,6 +3080,7 @@ packages: dependencies: cross-spawn: 7.0.3 signal-exit: 4.1.0 + dev: true /form-data@2.5.1: resolution: {integrity: sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA==} @@ -3250,6 +3230,7 @@ packages: minimatch: 9.0.4 minipass: 7.1.2 path-scurry: 1.11.1 + dev: true /glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} @@ -3588,6 +3569,7 @@ packages: /isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: true /istanbul-lib-coverage@3.2.2: resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} @@ -3655,6 +3637,7 @@ packages: '@isaacs/cliui': 8.0.2 optionalDependencies: '@pkgjs/parseargs': 0.11.0 + dev: true /jest-changed-files@29.7.0: resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} @@ -4418,6 +4401,7 @@ packages: /lru-cache@10.2.2: resolution: {integrity: sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==} engines: {node: 14 || >=16.14} + dev: true /lru-cache@5.1.1: resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} @@ -4539,6 +4523,7 @@ packages: engines: {node: '>=16 || 14 >=14.17'} dependencies: brace-expansion: 2.0.1 + dev: true /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} @@ -4546,6 +4531,7 @@ packages: /minipass@7.1.2: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + dev: true /mitt@3.0.1: resolution: {integrity: sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==} @@ -4814,6 +4800,7 @@ packages: /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} + dev: true /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -4824,6 +4811,7 @@ packages: dependencies: lru-cache: 10.2.2 minipass: 7.1.2 + dev: true /path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} @@ -5277,6 +5265,7 @@ packages: hasBin: true dependencies: glob: 10.4.1 + dev: true /robots-parser@3.0.1: resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} @@ -5362,10 +5351,12 @@ packages: engines: {node: '>=8'} dependencies: shebang-regex: 3.0.0 + dev: true /shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} + dev: true /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -5373,6 +5364,7 @@ packages: /signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + dev: true /sisteransi@1.0.5: resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} @@ -5505,6 +5497,7 @@ packages: eastasianwidth: 0.2.0 emoji-regex: 9.2.2 strip-ansi: 7.1.0 + dev: true /string-width@7.1.0: resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} @@ -6047,6 +6040,7 @@ packages: hasBin: true dependencies: isexe: 2.0.0 + dev: true /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} @@ -6063,6 +6057,7 @@ packages: ansi-styles: 6.2.1 string-width: 5.1.2 strip-ansi: 7.1.0 + dev: true /wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} From a10af3cc8c95651bf98447c49468b3100b14e65a Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 05:19:51 +0200 Subject: [PATCH 20/28] chore: remove unused file and npm scripts --- modules/.eslintrc.yaml | 2 -- test/package.json | 6 ------ 2 files changed, 8 deletions(-) delete mode 100644 modules/.eslintrc.yaml diff --git a/modules/.eslintrc.yaml b/modules/.eslintrc.yaml deleted file mode 100644 index 7240035c..00000000 --- a/modules/.eslintrc.yaml +++ /dev/null @@ -1,2 +0,0 @@ -root: true -ignorePatterns: ["coverage", "lib", "jest.config.mjs"] diff --git a/test/package.json b/test/package.json index bb065a6c..5fe6268a 100644 --- a/test/package.json +++ b/test/package.json @@ -2,12 +2,6 @@ "name": "@fabernovel/heart-test", "version": "4.0.0", "private": true, - "scripts": { - "build": "", - "build:watch": "", - "lint": "", - "test": "" - }, "dependencies": { "@fabernovel/heart-api": "workspace:^4.0.0", "@fabernovel/heart-cli": "workspace:^4.0.0", From f03792accee89643f231655d0f57a69a19d2223d Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sun, 2 Jun 2024 16:52:58 +0200 Subject: [PATCH 21/28] feat: add new module creation CLI --- modules/tpl/README.md | 5 --- modules/tpl/src/index.ts | 6 ---- templates/package/README.md | 9 ++++++ .../tpl => templates/package}/jest.config.mjs | 0 .../tpl => templates/package}/package.json | 24 ++++++-------- .../package/src/[name|pascal_case]Module.ts | 8 ++++- templates/package/src/index.ts | 12 +++++++ templates/package/template.yml | 31 +++++++++++++++++++ .../package}/tests/.gitignore | 0 .../package}/tsconfig.build.json | 0 .../tpl => templates/package}/tsconfig.json | 0 11 files changed, 68 insertions(+), 27 deletions(-) delete mode 100644 modules/tpl/README.md delete mode 100644 modules/tpl/src/index.ts create mode 100644 templates/package/README.md rename {modules/tpl => templates/package}/jest.config.mjs (100%) rename {modules/tpl => templates/package}/package.json (60%) rename modules/tpl/src/TplModule.ts => templates/package/src/[name|pascal_case]Module.ts (66%) create mode 100644 templates/package/src/index.ts create mode 100644 templates/package/template.yml rename {modules/tpl => templates/package}/tests/.gitignore (100%) rename {modules/tpl => templates/package}/tsconfig.build.json (100%) rename {modules/tpl => templates/package}/tsconfig.json (100%) diff --git a/modules/tpl/README.md b/modules/tpl/README.md deleted file mode 100644 index 4b37130f..00000000 --- a/modules/tpl/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Heart Tpl - -_Heart Tpl_ is a template module which goal is to serve as a codebase for new module creation. - -To create a new module, see the _[Create a new module](../../docs/CREATE_NEW_MODULE.md)_ guide. diff --git a/modules/tpl/src/index.ts b/modules/tpl/src/index.ts deleted file mode 100644 index 2648cda5..00000000 --- a/modules/tpl/src/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" -import { TplModule } from "./TplModule.js" - -export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { - return new TplModule(moduleMetadata, verbose) -} diff --git a/templates/package/README.md b/templates/package/README.md new file mode 100644 index 00000000..fc0683a8 --- /dev/null +++ b/templates/package/README.md @@ -0,0 +1,9 @@ +--- +force: true +--- + +# Heart {{ name | capitalize }} + +_Heart {{ name | capitalize }}_ is a template module which goal is to serve as a codebase for new module creation. + +To create a new module, see the _[Create a new module](../../docs/CREATE_NEW_MODULE.md)_ guide. diff --git a/modules/tpl/jest.config.mjs b/templates/package/jest.config.mjs similarity index 100% rename from modules/tpl/jest.config.mjs rename to templates/package/jest.config.mjs diff --git a/modules/tpl/package.json b/templates/package/package.json similarity index 60% rename from modules/tpl/package.json rename to templates/package/package.json index d987a332..6169bf1e 100644 --- a/modules/tpl/package.json +++ b/templates/package/package.json @@ -1,7 +1,7 @@ { - "name": "@fabernovel/heart-tpl", + "name": "@fabernovel/heart-{{ name | slugify }}", "version": "4.0.0", - "description": "", + "description": "{{ name }}", "homepage": "https://heart.fabernovel.com", "bugs": { "url": "https://github.com/faberNovel/heart/issues" @@ -9,7 +9,7 @@ "repository": { "type": "git", "url": "https://github.com/faberNovel/heart.git", - "directory": "modules/tpl" + "directory": "modules/{{ name | slugify }}" }, "license": "MIT", "contributors": [], @@ -20,16 +20,10 @@ "lib": "lib" }, "files": [ - "lib/**/*", - ".env.default", - ".env.schema.json" + "lib/**/*" ], "scripts": { - "build": "rimraf lib && tsc --project tsconfig.build.json", - "build:watch": "npm run build --watch", - "lint": "eslint .", - "prepublishOnly": "npm run build", - "test": "NODE_OPTIONS='--experimental-vm-modules' jest --passWithNoTests" + "prepublishOnly": "moon run common:build" }, "dependencies": { "@fabernovel/heart-common": "workspace:^4.0.0" @@ -44,11 +38,11 @@ "node": ">=18 <22" }, "heart": { - "id": "tpl", - "name": "Heart Tpl", + "id": "{{ name | slugify }}", + "name": "Heart {{ name }}", "service": { - "name": "Tpl", - "logoUrl": "https://raw.githubusercontent.com/faberNovel/heart/main/assets/images/logos/Tpl.png?v=20221126" + "name": "{{ name }}", + "logoUrl": "https://raw.githubusercontent.com/faberNovel/heart/main/assets/images/logos/{{ name | pascal_case }}.png?v=20221126" } } } diff --git a/modules/tpl/src/TplModule.ts b/templates/package/src/[name|pascal_case]Module.ts similarity index 66% rename from modules/tpl/src/TplModule.ts rename to templates/package/src/[name|pascal_case]Module.ts index a7c9cd49..a1d0ce50 100644 --- a/modules/tpl/src/TplModule.ts +++ b/templates/package/src/[name|pascal_case]Module.ts @@ -1,6 +1,12 @@ +{% set class_name = name ~ 'Module' | pascal_case %} + +--- +to: src//{{ class_name }}.ts +--- + import { Module, logger, type ModuleMetadata } from "@fabernovel/heart-common" -export class TplModule extends Module { +export class {{ class_name }} extends Module { constructor(moduleMetadata: ModuleMetadata, verbose: boolean) { super(moduleMetadata, verbose) diff --git a/templates/package/src/index.ts b/templates/package/src/index.ts new file mode 100644 index 00000000..10952ba9 --- /dev/null +++ b/templates/package/src/index.ts @@ -0,0 +1,12 @@ +{% set class_name = name ~ 'Module' | pascal_case %} + +--- +to: src//index.ts +--- + +import type { ModuleIndex, ModuleMetadata } from "@fabernovel/heart-common" +import { {{ class_name }} } from "./{{ class_name }}.js" + +export const initialize: ModuleIndex["initialize"] = (moduleMetadata: ModuleMetadata, verbose: boolean) => { + return new {{ class_name }}(moduleMetadata, verbose) +} diff --git a/templates/package/template.yml b/templates/package/template.yml new file mode 100644 index 00000000..b7f555e2 --- /dev/null +++ b/templates/package/template.yml @@ -0,0 +1,31 @@ +# https://moonrepo.dev/docs/config/template +$schema: 'https://moonrepo.dev/schemas/template.json' + +# REQUIRED: Name of the template in a human readable format. +title: 'Title' + +# REQUIRED: Description of what the template is for and other relevant information. +description: 'Description of the template.' + +destination: modules/[name | slugify] + +# Mapping of variables that will be interpolated and rendered within template files. +# Users will be prompted to provide a value when running the generator. +variables: + name: + prompt: 'Name of your package' + type: 'string' + required: true + order: 1 + type: + prompt: 'What does your module do?' + type: 'enum' + values: + - label: Analyzes URLs using a third-party service + value: analysis + - label: Do thing with the results of the analysis + value: listener + - label: Trigger an analysis + value: runner + default: analysis + order: 2 diff --git a/modules/tpl/tests/.gitignore b/templates/package/tests/.gitignore similarity index 100% rename from modules/tpl/tests/.gitignore rename to templates/package/tests/.gitignore diff --git a/modules/tpl/tsconfig.build.json b/templates/package/tsconfig.build.json similarity index 100% rename from modules/tpl/tsconfig.build.json rename to templates/package/tsconfig.build.json diff --git a/modules/tpl/tsconfig.json b/templates/package/tsconfig.json similarity index 100% rename from modules/tpl/tsconfig.json rename to templates/package/tsconfig.json From c58d11bd901c5ce58acfc0174dc5544d49c7fed3 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Mon, 10 Jun 2024 02:57:10 +0200 Subject: [PATCH 22/28] fix: moon plugin download URL --- .prototools | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.prototools b/.prototools index fcb31a60..b363ac90 100644 --- a/.prototools +++ b/.prototools @@ -3,4 +3,5 @@ node = "~18" pnpm = "~8" [plugins] -moon = "source:https://raw.githubusercontent.com/moonrepo/moon/master/proto-plugin.toml" +# do not use master at the moment, as there is an error that disallow the install moon +moon = "source:https://raw.githubusercontent.com/moonrepo/moon/ef641b0e91e3096846c80a1ba058d44f534afe9d/proto-plugin.toml" From 5fc6c9dbd7a7b82b65b5112138b5dc6a5355fe95 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Sat, 15 Jun 2024 00:29:46 +0200 Subject: [PATCH 23/28] chore: fix lock file --- pnpm-lock.yaml | 17 ++--------------- 1 file changed, 2 insertions(+), 15 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ccb9ed8a..49d9870f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -246,19 +246,6 @@ importers: specifier: ^18.19.6 version: 18.19.33 - modules/tpl: - dependencies: - '@fabernovel/heart-cli': - specifier: ^4.0.0 - version: link:../cli - '@fabernovel/heart-common': - specifier: workspace:^4.0.0 - version: link:../common - devDependencies: - '@types/node': - specifier: ^18.19.6 - version: 18.19.33 - packages: /@ampproject/remapping@2.3.0: @@ -5048,7 +5035,7 @@ packages: /puppeteer@21.11.0(typescript@5.4.5): resolution: {integrity: sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg==} engines: {node: '>=16.13.2'} - deprecated: < 22.5.0 is no longer supported + deprecated: < 22.6.4 is no longer supported hasBin: true requiresBuild: true dependencies: @@ -5066,7 +5053,7 @@ packages: /puppeteer@5.5.0: resolution: {integrity: sha512-OM8ZvTXAhfgFA7wBIIGlPQzvyEETzDjeRa4mZRCRHxYL+GNH5WAuYUQdja3rpWZvkX/JKqmuVgbsxDNsDFjMEg==} engines: {node: '>=10.18.1'} - deprecated: < 22.5.0 is no longer supported + deprecated: < 22.6.4 is no longer supported requiresBuild: true dependencies: debug: 4.3.5 From 5c7a09e38036f4fa56ce6edfde2bf666f486bc6d Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Mon, 17 Jun 2024 21:01:06 +0200 Subject: [PATCH 24/28] chore: cleanup files --- .gitattributes | 11 ----------- .gitignore | 4 ++-- package.json | 1 - 3 files changed, 2 insertions(+), 14 deletions(-) delete mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 378164b4..00000000 --- a/.gitattributes +++ /dev/null @@ -1,11 +0,0 @@ -# Don't allow people to merge changes to these generated files, because the result -# may be invalid. You need to run "rush update" again. -pnpm-lock.yaml merge=binary - -# Rush's JSON config files use JavaScript-style code comments. The rule below prevents pedantic -# syntax highlighters such as GitHub's from highlighting these comments as errors. Your text editor -# may also require a special configuration to allow comments in JSON. -# -# For more information, see this issue: https://github.com/Microsoft/web-build-tools/issues/1088 -# -*.json linguist-language=JSON-with-Comments diff --git a/.gitignore b/.gitignore index 156e670c..aed7ed68 100644 --- a/.gitignore +++ b/.gitignore @@ -14,7 +14,7 @@ coverage .env # Common toolchain intermediate files -lib +lib/ # OS X temporary files .DS_Store @@ -27,5 +27,5 @@ test/temp .moon/cache .moon/docker -# TypeScript +# Build cache manifests *.tsbuildinfo diff --git a/package.json b/package.json index 60e6c5ac..b77edb25 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "tsconfig-moon": "^1.3.0", "typescript": "^5.3.3" }, - "packageManager": "pnpm@~8", "engines": { "node": "~18" } From d1afccf303ada1359c434f5cd5410c9d9e74ed87 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Mon, 17 Jun 2024 21:01:54 +0200 Subject: [PATCH 25/28] refactor: standardized tsconfig files --- modules/api/tsconfig.build.json | 4 +++- modules/api/tsconfig.json | 8 ++++---- modules/cli/tsconfig.build.json | 7 +++---- modules/cli/tsconfig.json | 10 +++++----- modules/common/tsconfig.build.json | 5 ++++- modules/common/tsconfig.json | 11 ++++++----- modules/greenit/tsconfig.build.json | 7 +++---- modules/greenit/tsconfig.json | 8 ++++---- modules/lighthouse/tsconfig.build.json | 7 +++---- modules/lighthouse/tsconfig.json | 8 ++++---- modules/mysql/tsconfig.build.json | 7 +++---- modules/mysql/tsconfig.json | 8 ++++---- modules/observatory/tsconfig.build.json | 7 +++---- modules/observatory/tsconfig.json | 8 ++++---- modules/slack/tsconfig.build.json | 7 +++---- modules/slack/tsconfig.json | 8 ++++---- modules/ssllabs-server/tsconfig.build.json | 7 +++---- modules/ssllabs-server/tsconfig.json | 8 ++++---- 18 files changed, 67 insertions(+), 68 deletions(-) diff --git a/modules/api/tsconfig.build.json b/modules/api/tsconfig.build.json index 55e1ee6e..f77db483 100644 --- a/modules/api/tsconfig.build.json +++ b/modules/api/tsconfig.build.json @@ -8,5 +8,7 @@ "rootDir": "src" }, - "include": ["src/**/*", "*.ts"] + "include": [ + "src/**/*.ts" + ] } diff --git a/modules/api/tsconfig.json b/modules/api/tsconfig.json index 8b8d48be..fada5560 100644 --- a/modules/api/tsconfig.json +++ b/modules/api/tsconfig.json @@ -1,10 +1,6 @@ { "$schema": "http://json.schemastore.org/tsconfig", "extends": "../../tsconfig.options.json", - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], "compilerOptions": { "outDir": "lib", "rootDir": "src" @@ -19,5 +15,9 @@ { "path": "../common" } + ], + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ] } diff --git a/modules/cli/tsconfig.build.json b/modules/cli/tsconfig.build.json index 55e1ee6e..648151b8 100644 --- a/modules/cli/tsconfig.build.json +++ b/modules/cli/tsconfig.build.json @@ -1,12 +1,11 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "compilerOptions": { "outDir": "lib", "rootDir": "src" }, - - "include": ["src/**/*", "*.ts"] + "include": [ + "src/**/*.ts", + ] } diff --git a/modules/cli/tsconfig.json b/modules/cli/tsconfig.json index fb98d747..f8b02345 100644 --- a/modules/cli/tsconfig.json +++ b/modules/cli/tsconfig.json @@ -7,16 +7,16 @@ "outDir": "lib", "rootDir": "src" }, - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], "references": [ { "path": "./tsconfig.build.json" }, { "path": "../common" - } + }, + ], + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ] } diff --git a/modules/common/tsconfig.build.json b/modules/common/tsconfig.build.json index cabd906e..8887c758 100644 --- a/modules/common/tsconfig.build.json +++ b/modules/common/tsconfig.build.json @@ -8,5 +8,8 @@ "rootDir": "src" }, - "include": ["src/**/*", "*.ts", "*.json"] + "include": [ + "src/**/*.ts", + "src/**/*.json" + ] } diff --git a/modules/common/tsconfig.json b/modules/common/tsconfig.json index c95558bd..20680300 100644 --- a/modules/common/tsconfig.json +++ b/modules/common/tsconfig.json @@ -1,20 +1,21 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "../../tsconfig.options.json", - "compilerOptions": { "emitDecoratorMetadata": true, "esModuleInterop": true, "experimentalDecorators": true, "resolveJsonModule": true, }, - "references": [ { "path": "./tsconfig.build.json" } ], - - "include": ["src/**/*", "tests/**/*", "*.ts", "*.json"] + "include": [ + "src/**/*.ts", + "src/**/*.json", + "tests/**/*.ts", + "tests/**/*.json" + ] } \ No newline at end of file diff --git a/modules/greenit/tsconfig.build.json b/modules/greenit/tsconfig.build.json index 55e1ee6e..cc0d7234 100644 --- a/modules/greenit/tsconfig.build.json +++ b/modules/greenit/tsconfig.build.json @@ -1,12 +1,11 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "compilerOptions": { "outDir": "lib", "rootDir": "src" }, - - "include": ["src/**/*", "*.ts"] + "include": [ + "src/**/*.ts" + ] } diff --git a/modules/greenit/tsconfig.json b/modules/greenit/tsconfig.json index 0929d7a1..f3dc57ae 100644 --- a/modules/greenit/tsconfig.json +++ b/modules/greenit/tsconfig.json @@ -7,10 +7,6 @@ "outDir": "lib", "rootDir": "src" }, - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], "references": [ { "path": "./tsconfig.build.json" @@ -21,5 +17,9 @@ { "path": "../common" } + ], + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ] } diff --git a/modules/lighthouse/tsconfig.build.json b/modules/lighthouse/tsconfig.build.json index ed4d6754..498d51ce 100644 --- a/modules/lighthouse/tsconfig.build.json +++ b/modules/lighthouse/tsconfig.build.json @@ -1,13 +1,12 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "compilerOptions": { "esModuleInterop": false, "outDir": "lib", "rootDir": "src" }, - - "include": ["src/**/*", "*.ts"] + "include": [ + "src/**/*.ts" + ] } diff --git a/modules/lighthouse/tsconfig.json b/modules/lighthouse/tsconfig.json index 51834d5e..5be54003 100644 --- a/modules/lighthouse/tsconfig.json +++ b/modules/lighthouse/tsconfig.json @@ -6,10 +6,6 @@ "outDir": "lib", "rootDir": "src" }, - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], "references": [ { "path": "./tsconfig.build.json" @@ -20,5 +16,9 @@ { "path": "../common" } + ], + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ] } diff --git a/modules/mysql/tsconfig.build.json b/modules/mysql/tsconfig.build.json index 55e1ee6e..cc0d7234 100644 --- a/modules/mysql/tsconfig.build.json +++ b/modules/mysql/tsconfig.build.json @@ -1,12 +1,11 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "compilerOptions": { "outDir": "lib", "rootDir": "src" }, - - "include": ["src/**/*", "*.ts"] + "include": [ + "src/**/*.ts" + ] } diff --git a/modules/mysql/tsconfig.json b/modules/mysql/tsconfig.json index e97c7b75..bf506f0c 100644 --- a/modules/mysql/tsconfig.json +++ b/modules/mysql/tsconfig.json @@ -8,10 +8,6 @@ "outDir": "lib", "rootDir": "src" }, - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], "references": [ { "path": "./tsconfig.build.json" @@ -22,5 +18,9 @@ { "path": "../common" } + ], + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ] } diff --git a/modules/observatory/tsconfig.build.json b/modules/observatory/tsconfig.build.json index ed4d6754..498d51ce 100644 --- a/modules/observatory/tsconfig.build.json +++ b/modules/observatory/tsconfig.build.json @@ -1,13 +1,12 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "compilerOptions": { "esModuleInterop": false, "outDir": "lib", "rootDir": "src" }, - - "include": ["src/**/*", "*.ts"] + "include": [ + "src/**/*.ts" + ] } diff --git a/modules/observatory/tsconfig.json b/modules/observatory/tsconfig.json index 51834d5e..5be54003 100644 --- a/modules/observatory/tsconfig.json +++ b/modules/observatory/tsconfig.json @@ -6,10 +6,6 @@ "outDir": "lib", "rootDir": "src" }, - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], "references": [ { "path": "./tsconfig.build.json" @@ -20,5 +16,9 @@ { "path": "../common" } + ], + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ] } diff --git a/modules/slack/tsconfig.build.json b/modules/slack/tsconfig.build.json index 55e1ee6e..cc0d7234 100644 --- a/modules/slack/tsconfig.build.json +++ b/modules/slack/tsconfig.build.json @@ -1,12 +1,11 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "compilerOptions": { "outDir": "lib", "rootDir": "src" }, - - "include": ["src/**/*", "*.ts"] + "include": [ + "src/**/*.ts" + ] } diff --git a/modules/slack/tsconfig.json b/modules/slack/tsconfig.json index 8b8d48be..fada5560 100644 --- a/modules/slack/tsconfig.json +++ b/modules/slack/tsconfig.json @@ -1,10 +1,6 @@ { "$schema": "http://json.schemastore.org/tsconfig", "extends": "../../tsconfig.options.json", - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], "compilerOptions": { "outDir": "lib", "rootDir": "src" @@ -19,5 +15,9 @@ { "path": "../common" } + ], + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ] } diff --git a/modules/ssllabs-server/tsconfig.build.json b/modules/ssllabs-server/tsconfig.build.json index 55e1ee6e..cc0d7234 100644 --- a/modules/ssllabs-server/tsconfig.build.json +++ b/modules/ssllabs-server/tsconfig.build.json @@ -1,12 +1,11 @@ { "$schema": "http://json.schemastore.org/tsconfig", - "extends": "./tsconfig.json", - "compilerOptions": { "outDir": "lib", "rootDir": "src" }, - - "include": ["src/**/*", "*.ts"] + "include": [ + "src/**/*.ts" + ] } diff --git a/modules/ssllabs-server/tsconfig.json b/modules/ssllabs-server/tsconfig.json index 8b8d48be..fada5560 100644 --- a/modules/ssllabs-server/tsconfig.json +++ b/modules/ssllabs-server/tsconfig.json @@ -1,10 +1,6 @@ { "$schema": "http://json.schemastore.org/tsconfig", "extends": "../../tsconfig.options.json", - "include": [ - "src/**/*.ts", - "tests/**/*.ts" - ], "compilerOptions": { "outDir": "lib", "rootDir": "src" @@ -19,5 +15,9 @@ { "path": "../common" } + ], + "include": [ + "src/**/*.ts", + "tests/**/*.ts" ] } From 001fcf7f1a0fd4e3b0b588cecbe2cd5c5c6ad200 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Mon, 17 Jun 2024 21:16:39 +0200 Subject: [PATCH 26/28] chore: upgrade dependencies, especially biome to >1.8.0 --- package.json | 10 +- pnpm-lock.yaml | 494 +++++++++++++++++++++++++------------------------ 2 files changed, 257 insertions(+), 247 deletions(-) diff --git a/package.json b/package.json index b77edb25..61ea99ca 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "devDependencies": { - "@biomejs/biome": "1.7.3", + "@biomejs/biome": "^1.8.1", "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.11", + "@types/jest": "^29.5.12", "jest": "^29.7.0", - "rimraf": "^5.0.5", - "ts-jest": "^29.1.1", + "rimraf": "^5.0.7", + "ts-jest": "^29.1.5", "tsconfig-moon": "^1.3.0", - "typescript": "^5.3.3" + "typescript": "^5.4.5" }, "engines": { "node": "~18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 49d9870f..8ba82fbc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,28 +9,28 @@ importers: .: devDependencies: '@biomejs/biome': - specifier: 1.7.3 - version: 1.7.3 + specifier: ^1.8.1 + version: 1.8.1 '@jest/globals': specifier: ^29.7.0 version: 29.7.0 '@types/jest': - specifier: ^29.5.11 + specifier: ^29.5.12 version: 29.5.12 jest: specifier: ^29.7.0 version: 29.7.0 rimraf: - specifier: ^5.0.5 + specifier: ^5.0.7 version: 5.0.7 ts-jest: - specifier: ^29.1.1 - version: 29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5) + specifier: ^29.1.5 + version: 29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.4.5) tsconfig-moon: specifier: ^1.3.0 version: 1.3.0 typescript: - specifier: ^5.3.3 + specifier: ^5.4.5 version: 5.4.5 modules/api: @@ -256,32 +256,32 @@ packages: '@jridgewell/trace-mapping': 0.3.25 dev: true - /@babel/code-frame@7.24.6: - resolution: {integrity: sha512-ZJhac6FkEd1yhG2AHOmfcXG4ceoLltoCVJjN5XsWN9BifBQr+cHJbWi0h68HZuSORq+3WtJ2z0hwF2NG1b5kcA==} + /@babel/code-frame@7.24.7: + resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/highlight': 7.24.6 + '@babel/highlight': 7.24.7 picocolors: 1.0.1 - /@babel/compat-data@7.24.6: - resolution: {integrity: sha512-aC2DGhBq5eEdyXWqrDInSqQjO0k8xtPRf5YylULqx8MCd6jBtzqfta/3ETMRpuKIc5hyswfO80ObyA1MvkCcUQ==} + /@babel/compat-data@7.24.7: + resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} engines: {node: '>=6.9.0'} dev: true - /@babel/core@7.24.6: - resolution: {integrity: sha512-qAHSfAdVyFmIvl0VHELib8xar7ONuSHrE2hLnsaWkYNTI68dmi1x8GYDhJjMI/e7XWal9QBlZkwbOnkcw7Z8gQ==} + /@babel/core@7.24.7: + resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} engines: {node: '>=6.9.0'} dependencies: '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.6 - '@babel/generator': 7.24.6 - '@babel/helper-compilation-targets': 7.24.6 - '@babel/helper-module-transforms': 7.24.6(@babel/core@7.24.6) - '@babel/helpers': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/template': 7.24.6 - '@babel/traverse': 7.24.6 - '@babel/types': 7.24.6 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-compilation-targets': 7.24.7 + '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) + '@babel/helpers': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/template': 7.24.7 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 convert-source-map: 2.0.0 debug: 4.3.5 gensync: 1.0.0-beta.2 @@ -291,253 +291,263 @@ packages: - supports-color dev: true - /@babel/generator@7.24.6: - resolution: {integrity: sha512-S7m4eNa6YAPJRHmKsLHIDJhNAGNKoWNiWefz1MBbpnt8g9lvMDl1hir4P9bo/57bQEmuwEhnRU/AMWsD0G/Fbg==} + /@babel/generator@7.24.7: + resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.7 '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 jsesc: 2.5.2 dev: true - /@babel/helper-compilation-targets@7.24.6: - resolution: {integrity: sha512-VZQ57UsDGlX/5fFA7GkVPplZhHsVc+vuErWgdOiysI9Ksnw0Pbbd6pnPiR/mmJyKHgyIW0c7KT32gmhiF+cirg==} + /@babel/helper-compilation-targets@7.24.7: + resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/compat-data': 7.24.6 - '@babel/helper-validator-option': 7.24.6 - browserslist: 4.23.0 + '@babel/compat-data': 7.24.7 + '@babel/helper-validator-option': 7.24.7 + browserslist: 4.23.1 lru-cache: 5.1.1 semver: 6.3.1 dev: true - /@babel/helper-environment-visitor@7.24.6: - resolution: {integrity: sha512-Y50Cg3k0LKLMjxdPjIl40SdJgMB85iXn27Vk/qbHZCFx/o5XO3PSnpi675h1KEmmDb6OFArfd5SCQEQ5Q4H88g==} + /@babel/helper-environment-visitor@7.24.7: + resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.7 dev: true - /@babel/helper-function-name@7.24.6: - resolution: {integrity: sha512-xpeLqeeRkbxhnYimfr2PC+iA0Q7ljX/d1eZ9/inYbmfG2jpl8Lu3DyXvpOAnrS5kxkfOWJjioIMQsaMBXFI05w==} + /@babel/helper-function-name@7.24.7: + resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 dev: true - /@babel/helper-hoist-variables@7.24.6: - resolution: {integrity: sha512-SF/EMrC3OD7dSta1bLJIlrsVxwtd0UpjRJqLno6125epQMJ/kyFmpTT4pbvPbdQHzCHg+biQ7Syo8lnDtbR+uA==} + /@babel/helper-hoist-variables@7.24.7: + resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.7 dev: true - /@babel/helper-module-imports@7.24.6: - resolution: {integrity: sha512-a26dmxFJBF62rRO9mmpgrfTLsAuyHk4e1hKTUkD/fcMfynt8gvEKwQPQDVxWhca8dHoDck+55DFt42zV0QMw5g==} + /@babel/helper-module-imports@7.24.7: + resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.6 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-module-transforms@7.24.6(@babel/core@7.24.6): - resolution: {integrity: sha512-Y/YMPm83mV2HJTbX1Qh2sjgjqcacvOlhbzdCCsSlblOKjSYmQqEbO6rUniWQyRo9ncyfjT8hnUjlG06RXDEmcA==} + /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-environment-visitor': 7.24.6 - '@babel/helper-module-imports': 7.24.6 - '@babel/helper-simple-access': 7.24.6 - '@babel/helper-split-export-declaration': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-module-imports': 7.24.7 + '@babel/helper-simple-access': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-plugin-utils@7.24.6: - resolution: {integrity: sha512-MZG/JcWfxybKwsA9N9PmtF2lOSFSEMVCpIRrbxccZFLJPrJciJdG/UhSh5W96GEteJI2ARqm5UAHxISwRDLSNg==} + /@babel/helper-plugin-utils@7.24.7: + resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-simple-access@7.24.6: - resolution: {integrity: sha512-nZzcMMD4ZhmB35MOOzQuiGO5RzL6tJbsT37Zx8M5L/i9KSrukGXWTjLe1knIbb/RmxoJE9GON9soq0c0VEMM5g==} + /@babel/helper-simple-access@7.24.7: + resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.6 + '@babel/traverse': 7.24.7 + '@babel/types': 7.24.7 + transitivePeerDependencies: + - supports-color dev: true - /@babel/helper-split-export-declaration@7.24.6: - resolution: {integrity: sha512-CvLSkwXGWnYlF9+J3iZUvwgAxKiYzK3BWuo+mLzD/MDGOZDj7Gq8+hqaOkMxmJwmlv0iu86uH5fdADd9Hxkymw==} + /@babel/helper-split-export-declaration@7.24.7: + resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.7 dev: true - /@babel/helper-string-parser@7.24.6: - resolution: {integrity: sha512-WdJjwMEkmBicq5T9fm/cHND3+UlFa2Yj8ALLgmoSQAJZysYbBjw+azChSGPN4DSPLXOcooGRvDwZWMcF/mLO2Q==} + /@babel/helper-string-parser@7.24.7: + resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} engines: {node: '>=6.9.0'} dev: true - /@babel/helper-validator-identifier@7.24.6: - resolution: {integrity: sha512-4yA7s865JHaqUdRbnaxarZREuPTHrjpDT+pXoAZ1yhyo6uFnIEpS8VMu16siFOHDpZNKYv5BObhsB//ycbICyw==} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - /@babel/helper-validator-option@7.24.6: - resolution: {integrity: sha512-Jktc8KkF3zIkePb48QO+IapbXlSapOW9S+ogZZkcO6bABgYAxtZcjZ/O005111YLf+j4M84uEgwYoidDkXbCkQ==} + /@babel/helper-validator-option@7.24.7: + resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} engines: {node: '>=6.9.0'} dev: true - /@babel/helpers@7.24.6: - resolution: {integrity: sha512-V2PI+NqnyFu1i0GyTd/O/cTpxzQCYioSkUIRmgo7gFEHKKCg5w46+r/A6WeUR1+P3TeQ49dspGPNd/E3n9AnnA==} + /@babel/helpers@7.24.7: + resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 dev: true - /@babel/highlight@7.24.6: - resolution: {integrity: sha512-2YnuOp4HAk2BsBrJJvYCbItHx0zWscI1C3zgWkz+wDyD9I7GIVrfnLyrR4Y1VR+7p+chAEcrgRQYZAGIKMV7vQ==} + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-validator-identifier': 7.24.7 chalk: 2.4.2 js-tokens: 4.0.0 picocolors: 1.0.1 - /@babel/parser@7.24.6: - resolution: {integrity: sha512-eNZXdfU35nJC2h24RznROuOpO94h6x8sg9ju0tT9biNtLZ2vuP8SduLqqV+/8+cebSLV9SJEAN5Z3zQbJG/M+Q==} + /@babel/parser@7.24.7: + resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.7 dev: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.6): + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7): resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.6): + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.6): + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.6): + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.6): + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-jsx@7.24.6(@babel/core@7.24.6): - resolution: {integrity: sha512-lWfvAIFNWMlCsU0DRUun2GpFwZdGTukLaHJqRh1JRb80NdAP5Sb1HDHB5X9P9OtgZHQl089UzQkpYlBq2VTPRw==} + /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.6): + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.6): + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.6): + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.6): + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.6): + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.6): + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.6): + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7): resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true - /@babel/plugin-syntax-typescript@7.24.6(@babel/core@7.24.6): - resolution: {integrity: sha512-TzCtxGgVTEJWWwcYwQhCIQ6WaKlo80/B+Onsk4RRCcYqpYGFcG9etPW94VToGte5AAcxRrhjPUFvUS3Y2qKi4A==} + /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7): + resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} engines: {node: '>=6.9.0'} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.24.6 - '@babel/helper-plugin-utils': 7.24.6 + '@babel/core': 7.24.7 + '@babel/helper-plugin-utils': 7.24.7 dev: true /@babel/runtime@7.24.6: @@ -547,39 +557,39 @@ packages: regenerator-runtime: 0.14.1 dev: false - /@babel/template@7.24.6: - resolution: {integrity: sha512-3vgazJlLwNXi9jhrR1ef8qiB65L1RK90+lEQwv4OxveHnqC3BfmnHdgySwRLzf6akhlOYenT+b7AfWq+a//AHw==} + /@babel/template@7.24.7: + resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/code-frame': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 dev: true - /@babel/traverse@7.24.6: - resolution: {integrity: sha512-OsNjaJwT9Zn8ozxcfoBc+RaHdj3gFmCmYoQLUII1o6ZrUwku0BMg80FoOTPx+Gi6XhcQxAYE4xyjPTo4SxEQqw==} + /@babel/traverse@7.24.7: + resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/code-frame': 7.24.6 - '@babel/generator': 7.24.6 - '@babel/helper-environment-visitor': 7.24.6 - '@babel/helper-function-name': 7.24.6 - '@babel/helper-hoist-variables': 7.24.6 - '@babel/helper-split-export-declaration': 7.24.6 - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/code-frame': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/helper-environment-visitor': 7.24.7 + '@babel/helper-function-name': 7.24.7 + '@babel/helper-hoist-variables': 7.24.7 + '@babel/helper-split-export-declaration': 7.24.7 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 debug: 4.3.5 globals: 11.12.0 transitivePeerDependencies: - supports-color dev: true - /@babel/types@7.24.6: - resolution: {integrity: sha512-WaMsgi6Q8zMgMth93GvWPXkhAIEobfsIkLTacoVZoK1J0CevIPGYY2Vo5YvJGqyHqXM6P4ppOYGsIRU8MM9pFQ==} + /@babel/types@7.24.7: + resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-string-parser': 7.24.6 - '@babel/helper-validator-identifier': 7.24.6 + '@babel/helper-string-parser': 7.24.7 + '@babel/helper-validator-identifier': 7.24.7 to-fast-properties: 2.0.0 dev: true @@ -587,24 +597,24 @@ packages: resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} dev: true - /@biomejs/biome@1.7.3: - resolution: {integrity: sha512-ogFQI+fpXftr+tiahA6bIXwZ7CSikygASdqMtH07J2cUzrpjyTMVc9Y97v23c7/tL1xCZhM+W9k4hYIBm7Q6cQ==} + /@biomejs/biome@1.8.1: + resolution: {integrity: sha512-fQXGfvq6DIXem12dGQCM2tNF+vsNHH1qs3C7WeOu75Pd0trduoTmoO7G4ntLJ2qDs5wuw981H+cxQhi1uHnAtA==} engines: {node: '>=14.21.3'} hasBin: true requiresBuild: true optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.7.3 - '@biomejs/cli-darwin-x64': 1.7.3 - '@biomejs/cli-linux-arm64': 1.7.3 - '@biomejs/cli-linux-arm64-musl': 1.7.3 - '@biomejs/cli-linux-x64': 1.7.3 - '@biomejs/cli-linux-x64-musl': 1.7.3 - '@biomejs/cli-win32-arm64': 1.7.3 - '@biomejs/cli-win32-x64': 1.7.3 - dev: true - - /@biomejs/cli-darwin-arm64@1.7.3: - resolution: {integrity: sha512-eDvLQWmGRqrPIRY7AIrkPHkQ3visEItJKkPYSHCscSDdGvKzYjmBJwG1Gu8+QC5ed6R7eiU63LEC0APFBobmfQ==} + '@biomejs/cli-darwin-arm64': 1.8.1 + '@biomejs/cli-darwin-x64': 1.8.1 + '@biomejs/cli-linux-arm64': 1.8.1 + '@biomejs/cli-linux-arm64-musl': 1.8.1 + '@biomejs/cli-linux-x64': 1.8.1 + '@biomejs/cli-linux-x64-musl': 1.8.1 + '@biomejs/cli-win32-arm64': 1.8.1 + '@biomejs/cli-win32-x64': 1.8.1 + dev: true + + /@biomejs/cli-darwin-arm64@1.8.1: + resolution: {integrity: sha512-XLiB7Uu6GALIOBWzQ2aMD0ru4Ly5/qSeQF7kk3AabzJ/kwsEWSe33iVySBP/SS2qv25cgqNiLksjGcw2bHT3mw==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [darwin] @@ -612,8 +622,8 @@ packages: dev: true optional: true - /@biomejs/cli-darwin-x64@1.7.3: - resolution: {integrity: sha512-JXCaIseKRER7dIURsVlAJacnm8SG5I0RpxZ4ya3dudASYUc68WGl4+FEN03ABY3KMIq7hcK1tzsJiWlmXyosZg==} + /@biomejs/cli-darwin-x64@1.8.1: + resolution: {integrity: sha512-uMTSxVLMfqkBVqyc25hSn83jBbp+wtWjzM/pHFlKXt3htJuw7FErVGW0nmQ9Sxa9vJ7GcqoltLMl28VQRIMYzg==} engines: {node: '>=14.21.3'} cpu: [x64] os: [darwin] @@ -621,8 +631,8 @@ packages: dev: true optional: true - /@biomejs/cli-linux-arm64-musl@1.7.3: - resolution: {integrity: sha512-c8AlO45PNFZ1BYcwaKzdt46kYbuP6xPGuGQ6h4j3XiEDpyseRRUy/h+6gxj07XovmyxKnSX9GSZ6nVbZvcVUAw==} + /@biomejs/cli-linux-arm64-musl@1.8.1: + resolution: {integrity: sha512-UQ8Wc01J0wQL+5AYOc7qkJn20B4PZmQL1KrmDZh7ot0DvD6aX4+8mmfd/dG5b6Zjo/44QvCKcvkFGCMRYuhWZA==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] @@ -630,8 +640,8 @@ packages: dev: true optional: true - /@biomejs/cli-linux-arm64@1.7.3: - resolution: {integrity: sha512-phNTBpo7joDFastnmZsFjYcDYobLTx4qR4oPvc9tJ486Bd1SfEVPHEvJdNJrMwUQK56T+TRClOQd/8X1nnjA9w==} + /@biomejs/cli-linux-arm64@1.8.1: + resolution: {integrity: sha512-3SzZRuC/9Oi2P2IBNPsEj0KXxSXUEYRR2kfRF/Ve8QAfGgrt4qnwuWd6QQKKN5R+oYH691qjm+cXBKEcrP1v/Q==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [linux] @@ -639,8 +649,8 @@ packages: dev: true optional: true - /@biomejs/cli-linux-x64-musl@1.7.3: - resolution: {integrity: sha512-UdEHKtYGWEX3eDmVWvQeT+z05T9/Sdt2+F/7zmMOFQ7boANeX8pcO6EkJPK3wxMudrApsNEKT26rzqK6sZRTRA==} + /@biomejs/cli-linux-x64-musl@1.8.1: + resolution: {integrity: sha512-fYbP/kNu/rtZ4kKzWVocIdqZOtBSUEg9qUhZaao3dy3CRzafR6u6KDtBeSCnt47O+iLnks1eOR1TUxzr5+QuqA==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] @@ -648,8 +658,8 @@ packages: dev: true optional: true - /@biomejs/cli-linux-x64@1.7.3: - resolution: {integrity: sha512-vnedYcd5p4keT3iD48oSKjOIRPYcjSNNbd8MO1bKo9ajg3GwQXZLAH+0Cvlr+eMsO67/HddWmscSQwTFrC/uPA==} + /@biomejs/cli-linux-x64@1.8.1: + resolution: {integrity: sha512-AeBycVdNrTzsyYKEOtR2R0Ph0hCD0sCshcp2aOnfGP0hCZbtFg09D0SdKLbyzKntisY41HxKVrydYiaApp+2uw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [linux] @@ -657,8 +667,8 @@ packages: dev: true optional: true - /@biomejs/cli-win32-arm64@1.7.3: - resolution: {integrity: sha512-unNCDqUKjujYkkSxs7gFIfdasttbDC4+z0kYmcqzRk6yWVoQBL4dNLcCbdnJS+qvVDNdI9rHp2NwpQ0WAdla4Q==} + /@biomejs/cli-win32-arm64@1.8.1: + resolution: {integrity: sha512-6tEd1H/iFKpgpE3OIB7oNgW5XkjiVMzMRPL8zYoZ036YfuJ5nMYm9eB9H/y81+8Z76vL48fiYzMPotJwukGPqQ==} engines: {node: '>=14.21.3'} cpu: [arm64] os: [win32] @@ -666,8 +676,8 @@ packages: dev: true optional: true - /@biomejs/cli-win32-x64@1.7.3: - resolution: {integrity: sha512-ZmByhbrnmz/UUFYB622CECwhKIPjJLLPr5zr3edhu04LzbfcOrz16VYeNq5dpO1ADG70FORhAJkaIGdaVBG00w==} + /@biomejs/cli-win32-x64@1.8.1: + resolution: {integrity: sha512-g2H31jJzYmS4jkvl6TiyEjEX+Nv79a5km/xn+5DARTp5MBFzC9gwceusSSB2AkJKqZzY131AiACAWjKrVt5Ijw==} engines: {node: '>=14.21.3'} cpu: [x64] os: [win32] @@ -979,7 +989,7 @@ packages: resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.6 + '@babel/core': 7.24.7 '@jest/types': 29.6.3 '@jridgewell/trace-mapping': 0.3.25 babel-plugin-istanbul: 6.1.1 @@ -1507,8 +1517,8 @@ packages: /@types/babel__core@7.20.5: resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__generator': 7.6.8 '@types/babel__template': 7.4.4 '@types/babel__traverse': 7.20.6 @@ -1517,20 +1527,20 @@ packages: /@types/babel__generator@7.6.8: resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.7 dev: true /@types/babel__template@7.4.4: resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} dependencies: - '@babel/parser': 7.24.6 - '@babel/types': 7.24.6 + '@babel/parser': 7.24.7 + '@babel/types': 7.24.7 dev: true /@types/babel__traverse@7.20.6: resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} dependencies: - '@babel/types': 7.24.6 + '@babel/types': 7.24.7 dev: true /@types/body-parser@1.19.5: @@ -2009,17 +2019,17 @@ packages: /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - /babel-jest@29.7.0(@babel/core@7.24.6): + /babel-jest@29.7.0(@babel/core@7.24.7): resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.24.6 + '@babel/core': 7.24.7 '@jest/transform': 29.7.0 '@types/babel__core': 7.20.5 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.6) + babel-preset-jest: 29.6.3(@babel/core@7.24.7) chalk: 4.1.2 graceful-fs: 4.2.11 slash: 3.0.0 @@ -2031,7 +2041,7 @@ packages: resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} engines: {node: '>=8'} dependencies: - '@babel/helper-plugin-utils': 7.24.6 + '@babel/helper-plugin-utils': 7.24.7 '@istanbuljs/load-nyc-config': 1.1.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-instrument: 5.2.1 @@ -2044,58 +2054,58 @@ packages: resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.24.6 - '@babel/types': 7.24.6 + '@babel/template': 7.24.7 + '@babel/types': 7.24.7 '@types/babel__core': 7.20.5 '@types/babel__traverse': 7.20.6 dev: true - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.6): + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.6 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.6) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.6) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.6) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.6) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.6) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.6) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.6) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.24.6): + '@babel/core': 7.24.7 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) + dev: true + + /babel-preset-jest@29.6.3(@babel/core@7.24.7): resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.6 + '@babel/core': 7.24.7 babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) dev: true /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} - /bare-events@2.3.1: - resolution: {integrity: sha512-sJnSOTVESURZ61XgEleqmP255T6zTYwHPwE4r6SssIh0U9/uDvfpdoJYpVUerJJZH2fueO+CdT8ZT+OC/7aZDA==} + /bare-events@2.4.2: + resolution: {integrity: sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==} requiresBuild: true optional: true - /bare-fs@2.3.0: - resolution: {integrity: sha512-TNFqa1B4N99pds2a5NYHR15o0ZpdNKbAeKTE/+G6ED/UeOavv8RY3dr/Fu99HW3zU3pXpo2kDNO8Sjsm2esfOw==} + /bare-fs@2.3.1: + resolution: {integrity: sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==} requiresBuild: true dependencies: - bare-events: 2.3.1 + bare-events: 2.4.2 bare-path: 2.1.3 - bare-stream: 1.0.0 + bare-stream: 2.1.3 optional: true /bare-os@2.3.0: @@ -2110,8 +2120,8 @@ packages: bare-os: 2.3.0 optional: true - /bare-stream@1.0.0: - resolution: {integrity: sha512-KhNUoDL40iP4gFaLSsoGE479t0jHijfYdIcxRn/XtezA2BaUD0NRf/JGRpsMq6dMNM+SrCrB0YSSo/5wBY4rOQ==} + /bare-stream@2.1.3: + resolution: {integrity: sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==} requiresBuild: true dependencies: streamx: 2.18.0 @@ -2169,15 +2179,15 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: false - /browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + /browserslist@4.23.1: + resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} hasBin: true dependencies: - caniuse-lite: 1.0.30001625 - electron-to-chromium: 1.4.788 + caniuse-lite: 1.0.30001636 + electron-to-chromium: 1.4.803 node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.0) + update-browserslist-db: 1.0.16(browserslist@4.23.1) dev: true /bs-logger@0.2.6: @@ -2254,8 +2264,8 @@ packages: engines: {node: '>=10'} dev: true - /caniuse-lite@1.0.30001625: - resolution: {integrity: sha512-4KE9N2gcRH+HQhpeiRZXd+1niLB/XNLAhSy4z7fI8EzcbcPoAqjNInxVHTiTwWfTIV4w096XG8OtCOCQQKPv3w==} + /caniuse-lite@1.0.30001636: + resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} dev: true /chainsaw@0.1.0: @@ -2759,8 +2769,8 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.788: - resolution: {integrity: sha512-ubp5+Ev/VV8KuRoWnfP2QF2Bg+O2ZFdb49DiiNbz2VmgkIqrnyYaqIOqj8A6K/3p1xV0QcU5hBQ1+BmB6ot1OA==} + /electron-to-chromium@1.4.803: + resolution: {integrity: sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==} dev: true /emittery@0.13.1: @@ -3061,8 +3071,8 @@ packages: optional: true dev: false - /foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + /foreground-child@3.2.1: + resolution: {integrity: sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==} engines: {node: '>=14'} dependencies: cross-spawn: 7.0.3 @@ -3212,8 +3222,8 @@ packages: engines: {node: '>=16 || 14 >=14.18'} hasBin: true dependencies: - foreground-child: 3.1.1 - jackspeak: 3.1.2 + foreground-child: 3.2.1 + jackspeak: 3.4.0 minimatch: 9.0.4 minipass: 7.1.2 path-scurry: 1.11.1 @@ -3567,8 +3577,8 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.24.6 - '@babel/parser': 7.24.6 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 6.3.1 @@ -3580,8 +3590,8 @@ packages: resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} engines: {node: '>=10'} dependencies: - '@babel/core': 7.24.6 - '@babel/parser': 7.24.6 + '@babel/core': 7.24.7 + '@babel/parser': 7.24.7 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 semver: 7.6.2 @@ -3617,8 +3627,8 @@ packages: istanbul-lib-report: 3.0.1 dev: true - /jackspeak@3.1.2: - resolution: {integrity: sha512-kWmLKn2tRtfYMF/BakihVVRzBKOxz4gJMiL2Rj91WnAB5TPZumSH99R/Yf1qE1u4uRimvCSJfm6hnxohXeEXjQ==} + /jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} engines: {node: '>=14'} dependencies: '@isaacs/cliui': 8.0.2 @@ -3704,11 +3714,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.24.6 + '@babel/core': 7.24.7 '@jest/test-sequencer': 29.7.0 '@jest/types': 29.6.3 '@types/node': 18.19.33 - babel-jest: 29.7.0(@babel/core@7.24.6) + babel-jest: 29.7.0(@babel/core@7.24.7) chalk: 4.1.2 ci-info: 3.9.0 deepmerge: 4.3.1 @@ -3818,7 +3828,7 @@ packages: resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/code-frame': 7.24.6 + '@babel/code-frame': 7.24.7 '@jest/types': 29.6.3 '@types/stack-utils': 2.0.3 chalk: 4.1.2 @@ -3943,15 +3953,15 @@ packages: resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.24.6 - '@babel/generator': 7.24.6 - '@babel/plugin-syntax-jsx': 7.24.6(@babel/core@7.24.6) - '@babel/plugin-syntax-typescript': 7.24.6(@babel/core@7.24.6) - '@babel/types': 7.24.6 + '@babel/core': 7.24.7 + '@babel/generator': 7.24.7 + '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) + '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) + '@babel/types': 7.24.7 '@jest/expect-utils': 29.7.0 '@jest/transform': 29.7.0 '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.6) + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) chalk: 4.1.2 expect: 29.7.0 graceful-fs: 4.2.11 @@ -4763,7 +4773,7 @@ packages: resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} engines: {node: '>=8'} dependencies: - '@babel/code-frame': 7.24.6 + '@babel/code-frame': 7.24.7 error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -5455,7 +5465,7 @@ packages: queue-tick: 1.0.1 text-decoder: 1.1.0 optionalDependencies: - bare-events: 2.3.1 + bare-events: 2.4.2 /string-argv@0.3.2: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} @@ -5587,7 +5597,7 @@ packages: pump: 3.0.0 tar-stream: 3.1.7 optionalDependencies: - bare-fs: 2.3.0 + bare-fs: 2.3.1 bare-path: 2.1.3 /tar-stream@2.2.0: @@ -5730,8 +5740,8 @@ packages: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: false - /ts-jest@29.1.4(@babel/core@7.24.6)(jest@29.7.0)(typescript@5.4.5): - resolution: {integrity: sha512-YiHwDhSvCiItoAgsKtoLFCuakDzDsJ1DLDnSouTaTmdOcOwIkSzbLXduaQ6M5DRVhuZC/NYaaZ/mtHbWMv/S6Q==} + /ts-jest@29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.4.5): + resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} hasBin: true peerDependencies: @@ -5754,7 +5764,7 @@ packages: esbuild: optional: true dependencies: - '@babel/core': 7.24.6 + '@babel/core': 7.24.7 bs-logger: 0.2.6 fast-json-stable-stringify: 2.1.0 jest: 29.7.0 @@ -5908,13 +5918,13 @@ packages: setimmediate: 1.0.5 dev: false - /update-browserslist-db@1.0.16(browserslist@4.23.0): + /update-browserslist-db@1.0.16(browserslist@4.23.1): resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} hasBin: true peerDependencies: browserslist: '>= 4.21.0' dependencies: - browserslist: 4.23.0 + browserslist: 4.23.1 escalade: 3.1.2 picocolors: 1.0.1 dev: true From c2585362c6b8a2c81f6f26022a47facc24c0bb2e Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Mon, 17 Jun 2024 21:17:23 +0200 Subject: [PATCH 27/28] feat: make the lint and format tasks fix the code --- .moon/tasks.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.moon/tasks.yml b/.moon/tasks.yml index ae62a67d..600f0132 100644 --- a/.moon/tasks.yml +++ b/.moon/tasks.yml @@ -6,12 +6,12 @@ tasks: cleanup: command: rimraf lib format: - command: pnpm biome format + command: pnpm biome format --write options: affectedFiles: true affectedPassInputs: true lint: - command: pnpm biome lint + command: pnpm biome lint --write options: affectedFiles: true affectedPassInputs: true From 9fdd2749f749b7fef5192e4e08d53bbaf0914fc4 Mon Sep 17 00:00:00 2001 From: Bastien Gatellier Date: Wed, 19 Jun 2024 01:15:06 +0200 Subject: [PATCH 28/28] refactor: replace jest by vitest, and rework some existing tests --- .moon/tasks.yml | 4 +- modules/api/jest.config.mjs | 189 -- modules/api/tests/ApiModule.test.ts | 25 +- modules/cli/jest.config.mjs | 189 -- .../cli/tests/command/AnalysisCommand.test.ts | 9 +- .../cli/tests/command/ServerCommand.test.ts | 3 +- .../tests/module/ModuleOrchestrator.test.ts | 6 +- modules/common/jest.config.mjs | 189 -- modules/common/tests/timeout.test.ts | 6 +- .../analysis/AnalysisInputValidation.test.ts | 35 +- .../server/ServerInputValidation.test.ts | 39 +- modules/greenit/jest.config.mjs | 189 -- modules/greenit/tests/GreenITModule.test.ts | 13 +- modules/jest.config.mjs | 204 -- modules/lighthouse/jest.config.mjs | 189 -- .../lighthouse/src/api/__mocks__/Client.ts | 21 + .../lighthouse/tests/LighthouseModule.test.ts | 61 +- modules/lighthouse/tests/api/Client.test.ts | 50 +- modules/mysql/jest.config.mjs | 189 -- modules/observatory/jest.config.mjs | 189 -- .../tests/ObservatoryModule.test.ts | 30 +- modules/observatory/tests/api/Client.test.ts | 24 +- modules/slack/jest.config.mjs | 189 -- modules/ssllabs-server/jest.config.mjs | 189 -- package.json | 7 +- pnpm-lock.yaml | 2505 ++++++----------- 26 files changed, 1011 insertions(+), 3732 deletions(-) delete mode 100644 modules/api/jest.config.mjs delete mode 100644 modules/cli/jest.config.mjs delete mode 100644 modules/common/jest.config.mjs delete mode 100644 modules/greenit/jest.config.mjs delete mode 100644 modules/jest.config.mjs delete mode 100644 modules/lighthouse/jest.config.mjs create mode 100644 modules/lighthouse/src/api/__mocks__/Client.ts delete mode 100644 modules/mysql/jest.config.mjs delete mode 100644 modules/observatory/jest.config.mjs delete mode 100644 modules/slack/jest.config.mjs delete mode 100644 modules/ssllabs-server/jest.config.mjs diff --git a/.moon/tasks.yml b/.moon/tasks.yml index 600f0132..b0ffc68c 100644 --- a/.moon/tasks.yml +++ b/.moon/tasks.yml @@ -16,6 +16,4 @@ tasks: affectedFiles: true affectedPassInputs: true test: - command: jest - env: - NODE_OPTIONS: --experimental-vm-modules \ No newline at end of file + command: vitest run \ No newline at end of file diff --git a/modules/api/jest.config.mjs b/modules/api/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/api/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/api/tests/ApiModule.test.ts b/modules/api/tests/ApiModule.test.ts index 7dd7277c..18381520 100644 --- a/modules/api/tests/ApiModule.test.ts +++ b/modules/api/tests/ApiModule.test.ts @@ -1,9 +1,10 @@ +import { describe, it, expect } from "vitest"; import { createServer } from "./build/CreateServer.js"; import { analysisModules } from "./data/AnalysisModules.js"; import { listenerModules } from "./data/ListenerModules.js"; describe("Start an analysis with an invalid request", () => { - test("Get a 404 status code with an invalid verb and path", async () => { + it("Get a 404 status code with an invalid verb and path", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -16,7 +17,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(404); }); - test("Get a 404 status code with an invalid verb but a valid path", async () => { + it("Get a 404 status code with an invalid verb but a valid path", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -29,7 +30,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(404); }); - test("Get a 404 status code with a valid verb but an invalid path", async () => { + it("Get a 404 status code with a valid verb but an invalid path", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -42,7 +43,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(404); }); - test("Get a 400 status code on POST /observatory with an missing body", async () => { + it("Get a 400 status code on POST /observatory with an missing body", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -55,7 +56,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(400); }); - test("Get a 400 status code on POST /observatory with an invalid format on the except_listeners property", async () => { + it("Get a 400 status code on POST /observatory with an invalid format on the except_listeners property", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -71,7 +72,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(400); }); - test("Get a 400 status code on POST /greenit with a valid format but an incorrect value on the except_listeners property", async () => { + it("Get a 400 status code on POST /greenit with a valid format but an incorrect value on the except_listeners property", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -87,7 +88,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(400); }); - test("Get a 400 status code on POST /observatory with an invalid format on the only_listeners property", async () => { + it("Get a 400 status code on POST /observatory with an invalid format on the only_listeners property", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -103,7 +104,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(400); }); - test("Get a 400 status code on POST /greenit with a valid format but an incorrect value on the only_listeners property", async () => { + it("Get a 400 status code on POST /greenit with a valid format but an incorrect value on the only_listeners property", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -119,7 +120,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(400); }); - test("Get a 400 status code on POST /greenit with an invalid threshold format", async () => { + it("Get a 400 status code on POST /greenit with an invalid threshold format", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -136,7 +137,7 @@ describe("Start an analysis with an invalid request", () => { expect(response.statusCode).toBe(400); }); - test("Get a 400 status code on POST /greenit with a valid threshold format but an incorrect value", async () => { + it("Get a 400 status code on POST /greenit with a valid threshold format but an incorrect value", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -154,7 +155,7 @@ describe("Start an analysis with an invalid request", () => { }); describe("Start an analysis with a valid request", () => { - test("Get a 200 status code on POST /greenit with a valid body", async () => { + it("Get a 200 status code on POST /greenit with a valid body", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ @@ -172,7 +173,7 @@ describe("Start an analysis with a valid request", () => { expect(response.statusCode).toBe(200); }); - test("Get a 200 status code on POST /observatory with a valid body", async () => { + it("Get a 200 status code on POST /observatory with a valid body", async () => { const fastify = await createServer(analysisModules, listenerModules); const response = await fastify.inject({ diff --git a/modules/cli/jest.config.mjs b/modules/cli/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/cli/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/cli/tests/command/AnalysisCommand.test.ts b/modules/cli/tests/command/AnalysisCommand.test.ts index 10f6d7f9..5677095b 100644 --- a/modules/cli/tests/command/AnalysisCommand.test.ts +++ b/modules/cli/tests/command/AnalysisCommand.test.ts @@ -1,3 +1,4 @@ +import { it, expect, beforeEach } from "vitest"; import type { ModuleMetadata } from "@fabernovel/heart-common"; import { Command } from "commander"; import { createAnalysisSubcommand } from "../../src/command/analysis/AnalysisCommand.js"; @@ -55,7 +56,7 @@ beforeEach(() => { program.addCommand(analysisCommand); }); -test("Create an analysis command", () => { +it("Create an analysis command", () => { program.parse(["analysis", "--config", optionConfigInline], { from: "user" }); expect(program.commands).toHaveLength(1); @@ -69,7 +70,7 @@ test("Create an analysis command", () => { expect(options).toHaveProperty("verbose", false); }); -test("Create an analysis command with the listener option", () => { +it("Create an analysis command with the listener option", () => { program.parse( ["analysis", "--config", optionConfigInline, "--threshold", "83"], { @@ -89,7 +90,7 @@ test("Create an analysis command with the listener option", () => { expect(options).toHaveProperty("threshold", 83); }); -test("Create an analysis command with only 1 listener modules using the --except-listeners option", () => { +it("Create an analysis command with only 1 listener modules using the --except-listeners option", () => { program.parse( [ "analysis", @@ -115,7 +116,7 @@ test("Create an analysis command with only 1 listener modules using the --except expect(options).toHaveProperty("exceptListeners", ["listener1"]); }); -test("Create an analysis command with only 1 listener modules using the --only-listeners option", () => { +it("Create an analysis command with only 1 listener modules using the --only-listeners option", () => { program.parse( [ "analysis", diff --git a/modules/cli/tests/command/ServerCommand.test.ts b/modules/cli/tests/command/ServerCommand.test.ts index 3e7f8b8a..61db58f0 100644 --- a/modules/cli/tests/command/ServerCommand.test.ts +++ b/modules/cli/tests/command/ServerCommand.test.ts @@ -1,8 +1,9 @@ +import { it, expect } from "vitest"; import type { ModuleMetadata } from "@fabernovel/heart-common"; import { Command } from "commander"; import { createServerSubcommand } from "../../src/command/server/ServerCommand.js"; -test("Create a server command", () => { +it("Create a server command", () => { const moduleMetadata: ModuleMetadata = { id: "test-server", type: "server", diff --git a/modules/cli/tests/module/ModuleOrchestrator.test.ts b/modules/cli/tests/module/ModuleOrchestrator.test.ts index 4a8e89c0..897689f0 100644 --- a/modules/cli/tests/module/ModuleOrchestrator.test.ts +++ b/modules/cli/tests/module/ModuleOrchestrator.test.ts @@ -1,12 +1,12 @@ +import { it, expect, vi } from "vitest"; import { type Config, type ModuleAnalysisInterface, GreenITReport, } from "@fabernovel/heart-common"; -import { jest } from "@jest/globals"; import { startAnalysis } from "../../src/module/ModuleOrchestrator.js"; -test("Displays the results of an analysis", async () => { +it("Displays the results of an analysis", async () => { const report = new GreenITReport({ analyzedUrl: "https://heart.fabernovel.com", date: new Date(), @@ -32,7 +32,7 @@ test("Displays the results of an analysis", async () => { verbose: false, }; - const startAnalysisMock = jest.spyOn(module, "startAnalysis"); + const startAnalysisMock = vi.spyOn(module, "startAnalysis"); await startAnalysis(module, {}); diff --git a/modules/common/jest.config.mjs b/modules/common/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/common/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/common/tests/timeout.test.ts b/modules/common/tests/timeout.test.ts index d520031f..640a7103 100644 --- a/modules/common/tests/timeout.test.ts +++ b/modules/common/tests/timeout.test.ts @@ -1,8 +1,8 @@ -import { jest } from "@jest/globals"; +import { it, vi, expect } from "vitest"; import { timeout } from "../src/time/timeout.js"; -jest.useFakeTimers(); -jest.spyOn(global, "setTimeout"); +vi.useFakeTimers(); +vi.spyOn(global, "setTimeout"); it("should run a real timeout", () => { void timeout(30); diff --git a/modules/common/tests/validation/input/analysis/AnalysisInputValidation.test.ts b/modules/common/tests/validation/input/analysis/AnalysisInputValidation.test.ts index 1ef941e0..7a6b7c62 100644 --- a/modules/common/tests/validation/input/analysis/AnalysisInputValidation.test.ts +++ b/modules/common/tests/validation/input/analysis/AnalysisInputValidation.test.ts @@ -1,15 +1,16 @@ +import { describe, it, expect } from "vitest"; import { InputError } from "../../../../src/error/InputError.js"; import type { ModuleMetadata } from "../../../../src/index.js"; import { validateAnalysisInput } from "../../../../src/validation/input/analysis/AnalysisInputValidation.js"; describe("Invalid option combinations", () => { - test("Missing configuration", () => { + it("Missing configuration", () => { expect(() => { validateAnalysisInput({}); }).toThrow(InputError); }); - test("Both listener options", () => { + it("Both listener options", () => { expect(() => { validateAnalysisInput({ config: { inline: "configuration" }, @@ -21,13 +22,13 @@ describe("Invalid option combinations", () => { }); describe("Valid configuration value", () => { - test("JSON object with 1 property", () => { + it("JSON object with 1 property", () => { const { config } = validateAnalysisInput({ config: { url: "" } }); expect(config).toStrictEqual({ url: "" }); }); - test("JSON object with several properties", () => { + it("JSON object with several properties", () => { const { config } = validateAnalysisInput({ config: { url: "https://heart.fabernovel.com/", @@ -57,25 +58,25 @@ describe("Valid configuration value", () => { }); describe("Invalid configuration value", () => { - test("Array", () => { + it("Array", () => { expect(() => { validateAnalysisInput({ config: [] }); }).toThrow(InputError); }); - test("Empty JSON object", () => { + it("Empty JSON object", () => { expect(() => { validateAnalysisInput({ config: {} }); }).toThrow(InputError); }); - test("Number", () => { + it("Number", () => { expect(() => { validateAnalysisInput({ config: 2 }); }).toThrow(InputError); }); - test("String", () => { + it("String", () => { expect(() => { validateAnalysisInput({ config: "" }); }).toThrow(InputError); @@ -83,7 +84,7 @@ describe("Invalid configuration value", () => { }); describe("Invalid threshold value", () => { - test("Array", () => { + it("Array", () => { expect(() => { validateAnalysisInput({ config: { inline: "configuration" }, @@ -92,7 +93,7 @@ describe("Invalid threshold value", () => { }).toThrow(InputError); }); - test("JSON object", () => { + it("JSON object", () => { expect(() => { validateAnalysisInput({ config: { inline: "configuration" }, @@ -101,7 +102,7 @@ describe("Invalid threshold value", () => { }).toThrow(InputError); }); - test("Number < 0", () => { + it("Number < 0", () => { expect(() => { validateAnalysisInput({ config: { inline: "configuration" }, @@ -110,7 +111,7 @@ describe("Invalid threshold value", () => { }).toThrow(InputError); }); - test("Number > 100", () => { + it("Number > 100", () => { expect(() => { validateAnalysisInput({ config: { inline: "configuration" }, @@ -119,7 +120,7 @@ describe("Invalid threshold value", () => { }).toThrow(InputError); }); - test("String", () => { + it("String", () => { expect(() => { validateAnalysisInput({ config: { inline: "configuration" }, @@ -146,7 +147,7 @@ describe("Invalid listener options value", () => { ]; const modulesIds = modulesMetadata.map((moduleMetadata) => moduleMetadata.id); - test("Exclude 1 module with an invalid id", () => { + it("Exclude 1 module with an invalid id", () => { expect(() => { validateAnalysisInput( { @@ -158,7 +159,7 @@ describe("Invalid listener options value", () => { }).toThrow(InputError); }); - test("Exclude 2 modules but set an invalid id for one of them", () => { + it("Exclude 2 modules but set an invalid id for one of them", () => { expect(() => { validateAnalysisInput( { @@ -170,7 +171,7 @@ describe("Invalid listener options value", () => { }).toThrow(InputError); }); - test("Keep only 1 module with an invalid id", () => { + it("Keep only 1 module with an invalid id", () => { expect(() => { validateAnalysisInput( { @@ -182,7 +183,7 @@ describe("Invalid listener options value", () => { }).toThrow(InputError); }); - test("Keep 2 modules but set an invalid id for one of them", () => { + it("Keep 2 modules but set an invalid id for one of them", () => { expect(() => { validateAnalysisInput( { diff --git a/modules/common/tests/validation/input/server/ServerInputValidation.test.ts b/modules/common/tests/validation/input/server/ServerInputValidation.test.ts index c6015a0c..497fe824 100644 --- a/modules/common/tests/validation/input/server/ServerInputValidation.test.ts +++ b/modules/common/tests/validation/input/server/ServerInputValidation.test.ts @@ -1,22 +1,23 @@ +import { describe, it, expect } from "vitest"; import { InputError } from "../../../../src/error/InputError.js"; import { validateServerInput } from "../../../../src/validation/input/server/ServerInputValidation.js"; describe("Valid cors value", () => { - test("origin property with a string value", () => { + it("origin property with a string value", () => { const options = { cors: { origin: "http://127.0..0.1:8080/" } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("origin property with a boolean value", () => { + it("origin property with a boolean value", () => { const options = { cors: { origin: true } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("origin property with an string[] value", () => { + it("origin property with an string[] value", () => { const options = { cors: { origin: ["http://127.0..0.1:8080/", "http://127.0..0.1:8888/"] }, }; @@ -25,14 +26,14 @@ describe("Valid cors value", () => { expect(validatedData).toBe(options); }); - test("credentials property with a boolean value", () => { + it("credentials property with a boolean value", () => { const options = { cors: { credentials: true } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("exposedHeaders property with a string value", () => { + it("exposedHeaders property with a string value", () => { const options = { cors: { exposedHeaders: "Content-Range,X-Content-Range" }, }; @@ -41,7 +42,7 @@ describe("Valid cors value", () => { expect(validatedData).toBe(options); }); - test("exposedHeaders property with an string[] value", () => { + it("exposedHeaders property with an string[] value", () => { const options = { cors: { exposedHeaders: ["Content-Range", "X-Content-Range"] }, }; @@ -50,14 +51,14 @@ describe("Valid cors value", () => { expect(validatedData).toBe(options); }); - test("allowedHeaders property with a string value", () => { + it("allowedHeaders property with a string value", () => { const options = { cors: { allowedHeaders: "Content-Type,Authorization" } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("allowedHeaders property with an string[] value", () => { + it("allowedHeaders property with an string[] value", () => { const options = { cors: { allowedHeaders: ["Content-Type", "Authorization"] }, }; @@ -66,42 +67,42 @@ describe("Valid cors value", () => { expect(validatedData).toBe(options); }); - test("methods property with a string value", () => { + it("methods property with a string value", () => { const options = { cors: { methods: "GET,PUT,POST" } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("methods property with an string[] value", () => { + it("methods property with an string[] value", () => { const options = { cors: { methods: ["GET", "PUT", "POST"] } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("preflightContinue property with a boolean value", () => { + it("preflightContinue property with a boolean value", () => { const options = { cors: { preflightContinue: true } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("preflight property with a boolean value", () => { + it("preflight property with a boolean value", () => { const options = { cors: { preflight: true } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("strictPreflight property with a boolean value", () => { + it("strictPreflight property with a boolean value", () => { const options = { cors: { strictPreflight: true } }; const validatedData = validateServerInput(options); expect(validatedData).toBe(options); }); - test("hideOptionsRoute property with a boolean value", () => { + it("hideOptionsRoute property with a boolean value", () => { const options = { cors: { hideOptionsRoute: true } }; const validatedData = validateServerInput(options); @@ -110,7 +111,7 @@ describe("Valid cors value", () => { }); describe("Invalid port value", () => { - test("Array", () => { + it("Array", () => { expect(() => { validateServerInput({ port: [], @@ -118,7 +119,7 @@ describe("Invalid port value", () => { }).toThrow(InputError); }); - test("JSON object", () => { + it("JSON object", () => { expect(() => { validateServerInput({ port: {}, @@ -126,7 +127,7 @@ describe("Invalid port value", () => { }).toThrow(InputError); }); - test("Number < 0", () => { + it("Number < 0", () => { expect(() => { validateServerInput({ port: -1, @@ -134,7 +135,7 @@ describe("Invalid port value", () => { }).toThrow(InputError); }); - test("Number > 65535", () => { + it("Number > 65535", () => { expect(() => { validateServerInput({ port: 65536, @@ -142,7 +143,7 @@ describe("Invalid port value", () => { }).toThrow(InputError); }); - test("String", () => { + it("String", () => { expect(() => { validateServerInput({ port: "", diff --git a/modules/greenit/jest.config.mjs b/modules/greenit/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/greenit/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/greenit/tests/GreenITModule.test.ts b/modules/greenit/tests/GreenITModule.test.ts index a220a75a..66880f49 100644 --- a/modules/greenit/tests/GreenITModule.test.ts +++ b/modules/greenit/tests/GreenITModule.test.ts @@ -1,15 +1,12 @@ import type { ModuleMetadata } from "@fabernovel/heart-common"; -import { jest } from "@jest/globals"; +import { createJsonReports } from "greenit-cli/cli-core/analysis.js"; +import { describe, expect, it, vi } from "vitest"; +import { GreenITModule } from "../src/GreenITModule.js"; import { Conf } from "./data/Conf.js"; import SuccessResult from "./data/SuccessResult.json" with { type: "json" }; -jest.unstable_mockModule("greenit-cli/cli-core/analysis.js", () => ({ - createJsonReports: jest.fn(), -})); -const { createJsonReports } = await import("greenit-cli/cli-core/analysis.js"); -const mockedCreateJsonReports = jest.mocked(createJsonReports); - -const { GreenITModule } = await import("../src/GreenITModule.js"); +vi.mock("greenit-cli/cli-core/analysis.js"); +const mockedCreateJsonReports = vi.mocked(createJsonReports); describe("Run GreenIT analysis", () => { it("should be able to launch a successful analysis without thresholds", async () => { diff --git a/modules/jest.config.mjs b/modules/jest.config.mjs deleted file mode 100644 index 0062ff01..00000000 --- a/modules/jest.config.mjs +++ /dev/null @@ -1,204 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - * https://kulshekhar.github.io/ts-jest/docs/guides/esm-support - */ - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: true, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: false, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: ["src/**/*.ts"], - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: "v8", - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: ["clover"], - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - // moduleDirectories: [ - // "node_modules" - // ], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: [".ts"], - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: { - "^(\\.{1,2}/.*)\\.js$": "$1", - }, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: "ts-jest/presets/default-esm", - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - // rootDir: undefined, - - // A list of paths to directories that Jest should use to search for files in - // roots: [ - // "" - // ], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: { - // '^.+\\.[tj]sx?$' to process js/ts with `ts-jest` - // '^.+\\.m?[tj]sx?$' to process js/ts/mjs/mts with `ts-jest` - "^.+\\.tsx?$": [ - "ts-jest", - { - useESM: true, - }, - ], - }, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/lighthouse/jest.config.mjs b/modules/lighthouse/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/lighthouse/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/lighthouse/src/api/__mocks__/Client.ts b/modules/lighthouse/src/api/__mocks__/Client.ts new file mode 100644 index 00000000..29b2aec1 --- /dev/null +++ b/modules/lighthouse/src/api/__mocks__/Client.ts @@ -0,0 +1,21 @@ +import type { + LighthouseConfig, + LighthouseReport, +} from "@fabernovel/heart-common"; + +export async function requestResult( + conf: LighthouseConfig, + __: boolean, +): Promise { + return { + categories: { + category1: { score: 0.95 }, + category2: { score: 0.9 }, + category3: { score: 0.95 }, + category4: { score: 0.9 }, + category5: { score: 0.8 }, + }, + requestedUrl: conf.url, + fetchTime: 1584540399, + } as unknown as LighthouseReport["result"]; +} diff --git a/modules/lighthouse/tests/LighthouseModule.test.ts b/modules/lighthouse/tests/LighthouseModule.test.ts index 9141450a..7387700e 100644 --- a/modules/lighthouse/tests/LighthouseModule.test.ts +++ b/modules/lighthouse/tests/LighthouseModule.test.ts @@ -1,28 +1,24 @@ -import type { LighthouseReport } from "@fabernovel/heart-common"; -import { jest } from "@jest/globals"; -import { Conf } from "./data/Conf.js"; - -const RESULT = { - categories: { - category1: { score: 0.95 }, - category2: { score: 0.9 }, - category3: { score: 0.95 }, - category4: { score: 0.9 }, - category5: { score: 0.8 }, +import { vi, expect, it, describe } from "vitest"; +import { LighthouseModule } from "../src/LighthouseModule.js"; +import type { LighthouseConfig } from "@fabernovel/heart-common"; + +vi.mock("../src/api/Client.js"); +vi.mock("lighthouse"); + +const CONF: LighthouseConfig = { + url: "https://heart.fabernovel.com", + config: { + extends: "lighthouse:default", + settings: { + onlyAudits: [ + "first-meaningful-paint", + "speed-index", + "first-cpu-idle", + "interactive", + ], + }, }, - requestedUrl: Conf.url, - fetchTime: 1584540399, -} as unknown as LighthouseReport["result"]; // avoid the declaration of a huuuuuge object - -jest.unstable_mockModule("../src/api/Client.js", () => ({ - requestResult: jest - .fn<() => Promise>() - .mockResolvedValue(RESULT), -})); -const { requestResult } = await import("../src/api/Client.js"); -const mockedRequestResult = jest.mocked(requestResult); - -const { LighthouseModule } = await import("../src/LighthouseModule.js"); +}; describe("Starts an analysis", () => { const module = new LighthouseModule( @@ -38,21 +34,19 @@ describe("Starts an analysis", () => { ); it("should starts an analysis with a valid configuration", async () => { - // mock the analysis stuff - mockedRequestResult.mockResolvedValue(RESULT); + const report = await module.startAnalysis(CONF); - const report = await module.startAnalysis(Conf); - - expect(report.analyzedUrl).toStrictEqual(Conf.url); + expect(report.analyzedUrl).toStrictEqual(CONF.url); expect(report).toHaveProperty("date"); expect(report).toHaveProperty("grade"); expect(report).toHaveProperty("normalizedGrade"); }); it("should starts an analysis with an invalid configuration", async () => { - Conf.url = ""; + const INVALID_CONF = { ...CONF, url: "" } as LighthouseConfig; + try { - await module.startAnalysis(Conf); + await module.startAnalysis(INVALID_CONF); } catch (e) { expect(e).toHaveProperty("error"); } @@ -61,10 +55,7 @@ describe("Starts an analysis", () => { it("Should return true status when results match thresholds objectives", async () => { const THRESHOLD = 80; - //mock the analysis stuff - mockedRequestResult.mockResolvedValue(RESULT); - - const report = await module.startAnalysis(Conf, THRESHOLD); + const report = await module.startAnalysis(CONF, THRESHOLD); expect(report.isThresholdReached()).toStrictEqual(true); }); diff --git a/modules/lighthouse/tests/api/Client.test.ts b/modules/lighthouse/tests/api/Client.test.ts index 67ac27c8..5c7bfca1 100644 --- a/modules/lighthouse/tests/api/Client.test.ts +++ b/modules/lighthouse/tests/api/Client.test.ts @@ -1,31 +1,37 @@ -import { jest } from "@jest/globals"; -import type { RunnerResult } from "lighthouse"; import { Conf } from "../data/Conf.js"; +import { vi, describe, it, expect } from "vitest"; +import { requestResult } from "../../src/api/Client.js"; -const RUNNER_RESULT = { - lhr: { - categories: { - category1: { score: 67 }, - category2: { score: 74 }, - category3: { score: 95 }, - category4: { score: 88 }, - category5: { score: 53 }, - }, - }, -} as unknown as RunnerResult; // avoid the declaration of a huuuuuge object +vi.mock("lighthouse", async (importOriginal) => { + const mod = await importOriginal(); -jest.unstable_mockModule("lighthouse", () => ({ - default: jest - .fn() - .mockImplementationOnce(() => Promise.resolve(RUNNER_RESULT)), -})); -await import("lighthouse"); - -const { requestResult } = await import("../../src/api/Client.js"); + return { + ...mod, + default: vi.fn().mockResolvedValue({ + lhr: { + categories: { + category1: { score: 67 }, + category2: { score: 74 }, + category3: { score: 95 }, + category4: { score: 88 }, + category5: { score: 53 }, + }, + }, + }), + }; +}); describe("Run an analysis", () => { it("should runs an analysis with a valid configuration", async () => { const results = await requestResult(Conf, false); - expect(results).toStrictEqual(RUNNER_RESULT.lhr); + expect(results).toStrictEqual({ + categories: { + category1: { score: 67 }, + category2: { score: 74 }, + category3: { score: 95 }, + category4: { score: 88 }, + category5: { score: 53 }, + }, + }); }); }); diff --git a/modules/mysql/jest.config.mjs b/modules/mysql/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/mysql/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/observatory/jest.config.mjs b/modules/observatory/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/observatory/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/observatory/tests/ObservatoryModule.test.ts b/modules/observatory/tests/ObservatoryModule.test.ts index 854a236f..399e9ade 100644 --- a/modules/observatory/tests/ObservatoryModule.test.ts +++ b/modules/observatory/tests/ObservatoryModule.test.ts @@ -2,26 +2,26 @@ import { type ObservatoryConfig, ObservatoryReport, } from "@fabernovel/heart-common"; -import { jest } from "@jest/globals"; +import { describe, expect, it, vi } from "vitest"; import { RESULT } from "./data/Result.js"; +import { ObservatoryModule } from "../src/ObservatoryModule.js"; +import { Client } from "../src/api/Client.js"; const ANALYZE_URL = "www.observatory.mozilla-test/results/"; const CONF: ObservatoryConfig = { host: "heart.fabernovel.com" }; -jest.unstable_mockModule("../src/api/Client.js", () => { - return { - Client: jest.fn().mockImplementation(() => { - return { - getAnalyzeUrl: () => ANALYZE_URL + CONF.host, - requestScan: () => Promise.resolve(RESULT.scan), - requestTests: () => Promise.resolve(RESULT.tests), - triggerAnalysis: () => Promise.resolve(RESULT.scan), - }; - }), - }; -}); -await import("../src/api/Client.js"); -const { ObservatoryModule } = await import("../src/ObservatoryModule.js"); +vi.spyOn(Client.prototype, "getAnalyzeUrl").mockImplementation( + () => ANALYZE_URL + CONF.host, +); +vi.spyOn(Client.prototype, "requestScan").mockImplementation(() => + Promise.resolve(RESULT.scan), +); +vi.spyOn(Client.prototype, "requestTests").mockImplementation(() => + Promise.resolve(RESULT.tests), +); +vi.spyOn(Client.prototype, "triggerAnalysis").mockImplementation(() => + Promise.resolve(RESULT.scan), +); describe("Starts an analysis", () => { const module = new ObservatoryModule( diff --git a/modules/observatory/tests/api/Client.test.ts b/modules/observatory/tests/api/Client.test.ts index 7d266306..c2144c94 100644 --- a/modules/observatory/tests/api/Client.test.ts +++ b/modules/observatory/tests/api/Client.test.ts @@ -1,25 +1,21 @@ +import { env } from "node:process"; import type { ObservatoryConfig } from "@fabernovel/heart-common"; -import { jest } from "@jest/globals"; +import { Request } from "@fabernovel/heart-common"; +import { describe, expect, it, vi } from "vitest"; +import { Client } from "../../src/api/Client.js"; import { RESULT } from "../data/Result.js"; const ANALYZE_URL = "www.observatory.mozilla/results"; const API_URL = "www.observatory.mozilla/api"; -jest.unstable_mockModule("@fabernovel/heart-common", () => ({ - ObservatoryReport: {}, - Request: { - get: jest.fn(() => Promise.resolve(RESULT)), - post: jest.fn(() => Promise.resolve(RESULT)), - }, -})); -await import("@fabernovel/heart-common"); -const { Client } = await import("../../src/api/Client.js"); +vi.spyOn(Request, "get").mockImplementation(() => Promise.resolve(RESULT)); +vi.spyOn(Request, "post").mockImplementation(() => Promise.resolve(RESULT)); describe("Client", () => { - process.env.HEART_OBSERVATORY_ANALYZE_URL = ANALYZE_URL; - process.env.HEART_OBSERVATORY_API_URL = API_URL; + env.HEART_OBSERVATORY_ANALYZE_URL = ANALYZE_URL; + env.HEART_OBSERVATORY_API_URL = API_URL; - test("Analyze with valid configuration", async () => { + it("Analyze with valid configuration", async () => { const CONF = { host: "www.website.test" }; const client = new Client(); @@ -30,7 +26,7 @@ describe("Client", () => { expect(client.getAnalyzeUrl()).toBe(ANALYZE_URL + CONF.host); }); - test("Analyze with invalid configuration", async () => { + it("Analyze with invalid configuration", async () => { const CONF = {} as ObservatoryConfig; const client = new Client(); diff --git a/modules/slack/jest.config.mjs b/modules/slack/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/slack/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/modules/ssllabs-server/jest.config.mjs b/modules/ssllabs-server/jest.config.mjs deleted file mode 100644 index ef43770c..00000000 --- a/modules/ssllabs-server/jest.config.mjs +++ /dev/null @@ -1,189 +0,0 @@ -/* - * For a detailed explanation regarding each configuration property, visit: - * https://jestjs.io/docs/configuration - */ -import defaultConfig from "../jest.config.mjs" - -export default { - // All imported modules in your tests should be mocked automatically - // automock: false, - - // Stop running tests after `n` failures - // bail: 0, - - // The directory where Jest should store its cached dependency information - // cacheDirectory: "/tmp/jest_rs", - - // Automatically clear mock calls, instances, contexts and results before every test - clearMocks: defaultConfig.clearMocks, - - // Indicates whether the coverage information should be collected while executing the test - collectCoverage: defaultConfig.collectCoverage, - - // An array of glob patterns indicating a set of files for which coverage information should be collected - collectCoverageFrom: defaultConfig.collectCoverageFrom, - - // The directory where Jest should output its coverage files - // coverageDirectory: undefined, - - // An array of regexp pattern strings used to skip coverage collection - // coveragePathIgnorePatterns: [ - // "/node_modules/" - // ], - - // Indicates which provider should be used to instrument code for coverage - coverageProvider: defaultConfig.coverageProvider, - - // A list of reporter names that Jest uses when writing coverage reports - coverageReporters: defaultConfig.coverageReporters, - - // An object that configures minimum threshold enforcement for coverage results - // coverageThreshold: undefined, - - // A path to a custom dependency extractor - // dependencyExtractor: undefined, - - // Make calling deprecated APIs throw helpful error messages - // errorOnDeprecated: false, - - // The default configuration for fake timers - // fakeTimers: { - // "enableGlobally": false - // }, - - // Force coverage collection from ignored files using an array of glob patterns - // forceCoverageMatch: [], - - // A path to a module which exports an async function that is triggered once before all test suites - // globalSetup: undefined, - - // A path to a module which exports an async function that is triggered once after all test suites - // globalTeardown: undefined, - - // A set of global variables that need to be available in all test environments - // globals: {}, - - // The maximum amount of workers used to run your tests. Can be specified as % or a number. E.g. maxWorkers: 10% will use 10% of your CPU amount + 1 as the maximum worker number. maxWorkers: 2 will use a maximum of 2 workers. - // maxWorkers: "50%", - - // An array of directory names to be searched recursively up from the requiring module's location - moduleDirectories: ["/src", "node_modules"], - - // An array of file extensions your modules use - // moduleFileExtensions: [ - // "js", - // "mjs", - // "cjs", - // "jsx", - // "ts", - // "tsx", - // "json", - // "node" - // ], - - extensionsToTreatAsEsm: defaultConfig.extensionsToTreatAsEsm, - - // A map from regular expressions to module names or to arrays of module names that allow to stub out resources with a single module - moduleNameMapper: defaultConfig.moduleNameMapper, - - // An array of regexp pattern strings, matched against all module paths before considered 'visible' to the module loader - // modulePathIgnorePatterns: [], - - // Activates notifications for test results - // notify: false, - - // An enum that specifies notification mode. Requires { notify: true } - // notifyMode: "failure-change", - - // A preset that is used as a base for Jest's configuration - preset: defaultConfig.preset, - - // Run tests from one or more projects - // projects: undefined, - - // Use this configuration option to add custom reporters to Jest - // reporters: undefined, - - // Automatically reset mock state before every test - // resetMocks: false, - - // Reset the module registry before running each individual test - // resetModules: false, - - // A path to a custom resolver - // resolver: undefined, - - // Automatically restore mock state and implementation before every test - // restoreMocks: false, - - // The root directory that Jest should scan for tests and modules within - rootDir: "./", - - // A list of paths to directories that Jest should use to search for files in - roots: ["/src/", "/tests/"], - - // Allows you to use a custom runner instead of Jest's default test runner - // runner: "jest-runner", - - // The paths to modules that run some code to configure or set up the testing environment before each test - // setupFiles: [], - - // A list of paths to modules that run some code to configure or set up the testing framework before each test - // setupFilesAfterEnv: [], - - // The number of seconds after which a test is considered as slow and reported as such in the results. - // slowTestThreshold: 5, - - // A list of paths to snapshot serializer modules Jest should use for snapshot testing - // snapshotSerializers: [], - - // The test environment that will be used for testing - // testEnvironment: "jest-environment-node", - - // Options that will be passed to the testEnvironment - // testEnvironmentOptions: {}, - - // Adds a location field to test results - // testLocationInResults: false, - - // The glob patterns Jest uses to detect test files - // testMatch: [ - // "**/__tests__/**/*.[jt]s?(x)", - // "**/?(*.)+(spec|test).[tj]s?(x)" - // ], - - // An array of regexp pattern strings that are matched against all test paths, matched tests are skipped - // testPathIgnorePatterns: [ - // "/node_modules/" - // ], - - // The regexp pattern or array of patterns that Jest uses to detect test files - // testRegex: [], - - // This option allows the use of a custom results processor - // testResultsProcessor: undefined, - - // This option allows use of a custom test runner - // testRunner: "jest-circus/runner", - - // A map from regular expressions to paths to transformers - transform: defaultConfig.transform, - - // An array of regexp pattern strings that are matched against all source file paths, matched files will skip transformation - // transformIgnorePatterns: [ - // "/node_modules/", - // "\\.pnp\\.[^\\/]+$" - // ], - - // An array of regexp pattern strings that are matched against all modules before the module loader will automatically return a mock for them - // unmockedModulePathPatterns: undefined, - - // Indicates whether each individual test should be reported during the run - // verbose: undefined, - - // An array of regexp patterns that are matched against all source file paths before re-running tests in watch mode - // watchPathIgnorePatterns: [], - - // Whether to use watchman for file crawling - // watchman: true, -} diff --git a/package.json b/package.json index 61ea99ca..10e64f5e 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,10 @@ { "devDependencies": { "@biomejs/biome": "^1.8.1", - "@jest/globals": "^29.7.0", - "@types/jest": "^29.5.12", - "jest": "^29.7.0", "rimraf": "^5.0.7", - "ts-jest": "^29.1.5", "tsconfig-moon": "^1.3.0", - "typescript": "^5.4.5" + "typescript": "^5.4.5", + "vitest": "^1.6.0" }, "engines": { "node": "~18" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8ba82fbc..5fff74e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -11,27 +11,18 @@ importers: '@biomejs/biome': specifier: ^1.8.1 version: 1.8.1 - '@jest/globals': - specifier: ^29.7.0 - version: 29.7.0 - '@types/jest': - specifier: ^29.5.12 - version: 29.5.12 - jest: - specifier: ^29.7.0 - version: 29.7.0 rimraf: specifier: ^5.0.7 version: 5.0.7 - ts-jest: - specifier: ^29.1.5 - version: 29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.4.5) tsconfig-moon: specifier: ^1.3.0 version: 1.3.0 typescript: specifier: ^5.4.5 version: 5.4.5 + vitest: + specifier: ^1.6.0 + version: 1.6.0 modules/api: dependencies: @@ -248,449 +239,337 @@ importers: packages: - /@ampproject/remapping@2.3.0: - resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@babel/code-frame@7.24.7: resolution: {integrity: sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==} engines: {node: '>=6.9.0'} dependencies: '@babel/highlight': 7.24.7 picocolors: 1.0.1 + dev: false - /@babel/compat-data@7.24.7: - resolution: {integrity: sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==} - engines: {node: '>=6.9.0'} - dev: true - - /@babel/core@7.24.7: - resolution: {integrity: sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==} - engines: {node: '>=6.9.0'} - dependencies: - '@ampproject/remapping': 2.3.0 - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-compilation-targets': 7.24.7 - '@babel/helper-module-transforms': 7.24.7(@babel/core@7.24.7) - '@babel/helpers': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/template': 7.24.7 - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - convert-source-map: 2.0.0 - debug: 4.3.5 - gensync: 1.0.0-beta.2 - json5: 2.2.3 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/generator@7.24.7: - resolution: {integrity: sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - '@jridgewell/gen-mapping': 0.3.5 - '@jridgewell/trace-mapping': 0.3.25 - jsesc: 2.5.2 - dev: true - - /@babel/helper-compilation-targets@7.24.7: - resolution: {integrity: sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/compat-data': 7.24.7 - '@babel/helper-validator-option': 7.24.7 - browserslist: 4.23.1 - lru-cache: 5.1.1 - semver: 6.3.1 - dev: true - - /@babel/helper-environment-visitor@7.24.7: - resolution: {integrity: sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - dev: true - - /@babel/helper-function-name@7.24.7: - resolution: {integrity: sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - dev: true - - /@babel/helper-hoist-variables@7.24.7: - resolution: {integrity: sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 - dev: true - - /@babel/helper-module-imports@7.24.7: - resolution: {integrity: sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==} + /@babel/helper-validator-identifier@7.24.7: + resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} engines: {node: '>=6.9.0'} - dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - transitivePeerDependencies: - - supports-color - dev: true + dev: false - /@babel/helper-module-transforms@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==} + /@babel/highlight@7.24.7: + resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-module-imports': 7.24.7 - '@babel/helper-simple-access': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 '@babel/helper-validator-identifier': 7.24.7 - transitivePeerDependencies: - - supports-color - dev: true - - /@babel/helper-plugin-utils@7.24.7: - resolution: {integrity: sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==} - engines: {node: '>=6.9.0'} - dev: true + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.1 + dev: false - /@babel/helper-simple-access@7.24.7: - resolution: {integrity: sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==} + /@babel/runtime@7.24.6: + resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/traverse': 7.24.7 - '@babel/types': 7.24.7 - transitivePeerDependencies: - - supports-color - dev: true + regenerator-runtime: 0.14.1 + dev: false - /@babel/helper-split-export-declaration@7.24.7: - resolution: {integrity: sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/types': 7.24.7 + /@biomejs/biome@1.8.1: + resolution: {integrity: sha512-fQXGfvq6DIXem12dGQCM2tNF+vsNHH1qs3C7WeOu75Pd0trduoTmoO7G4ntLJ2qDs5wuw981H+cxQhi1uHnAtA==} + engines: {node: '>=14.21.3'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@biomejs/cli-darwin-arm64': 1.8.1 + '@biomejs/cli-darwin-x64': 1.8.1 + '@biomejs/cli-linux-arm64': 1.8.1 + '@biomejs/cli-linux-arm64-musl': 1.8.1 + '@biomejs/cli-linux-x64': 1.8.1 + '@biomejs/cli-linux-x64-musl': 1.8.1 + '@biomejs/cli-win32-arm64': 1.8.1 + '@biomejs/cli-win32-x64': 1.8.1 dev: true - /@babel/helper-string-parser@7.24.7: - resolution: {integrity: sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==} - engines: {node: '>=6.9.0'} + /@biomejs/cli-darwin-arm64@1.8.1: + resolution: {integrity: sha512-XLiB7Uu6GALIOBWzQ2aMD0ru4Ly5/qSeQF7kk3AabzJ/kwsEWSe33iVySBP/SS2qv25cgqNiLksjGcw2bHT3mw==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@babel/helper-validator-identifier@7.24.7: - resolution: {integrity: sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==} - engines: {node: '>=6.9.0'} - - /@babel/helper-validator-option@7.24.7: - resolution: {integrity: sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==} - engines: {node: '>=6.9.0'} + /@biomejs/cli-darwin-x64@1.8.1: + resolution: {integrity: sha512-uMTSxVLMfqkBVqyc25hSn83jBbp+wtWjzM/pHFlKXt3htJuw7FErVGW0nmQ9Sxa9vJ7GcqoltLMl28VQRIMYzg==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@babel/helpers@7.24.7: - resolution: {integrity: sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 + /@biomejs/cli-linux-arm64-musl@1.8.1: + resolution: {integrity: sha512-UQ8Wc01J0wQL+5AYOc7qkJn20B4PZmQL1KrmDZh7ot0DvD6aX4+8mmfd/dG5b6Zjo/44QvCKcvkFGCMRYuhWZA==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/highlight@7.24.7: - resolution: {integrity: sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-validator-identifier': 7.24.7 - chalk: 2.4.2 - js-tokens: 4.0.0 - picocolors: 1.0.1 - - /@babel/parser@7.24.7: - resolution: {integrity: sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==} - engines: {node: '>=6.0.0'} - hasBin: true - dependencies: - '@babel/types': 7.24.7 + /@biomejs/cli-linux-arm64@1.8.1: + resolution: {integrity: sha512-3SzZRuC/9Oi2P2IBNPsEj0KXxSXUEYRR2kfRF/Ve8QAfGgrt4qnwuWd6QQKKN5R+oYH691qjm+cXBKEcrP1v/Q==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.24.7): - resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@biomejs/cli-linux-x64-musl@1.8.1: + resolution: {integrity: sha512-fYbP/kNu/rtZ4kKzWVocIdqZOtBSUEg9qUhZaao3dy3CRzafR6u6KDtBeSCnt47O+iLnks1eOR1TUxzr5+QuqA==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@biomejs/cli-linux-x64@1.8.1: + resolution: {integrity: sha512-AeBycVdNrTzsyYKEOtR2R0Ph0hCD0sCshcp2aOnfGP0hCZbtFg09D0SdKLbyzKntisY41HxKVrydYiaApp+2uw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.24.7): - resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@biomejs/cli-win32-arm64@1.8.1: + resolution: {integrity: sha512-6tEd1H/iFKpgpE3OIB7oNgW5XkjiVMzMRPL8zYoZ036YfuJ5nMYm9eB9H/y81+8Z76vL48fiYzMPotJwukGPqQ==} + engines: {node: '>=14.21.3'} + cpu: [arm64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.24.7): - resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@biomejs/cli-win32-x64@1.8.1: + resolution: {integrity: sha512-g2H31jJzYmS4jkvl6TiyEjEX+Nv79a5km/xn+5DARTp5MBFzC9gwceusSSB2AkJKqZzY131AiACAWjKrVt5Ijw==} + engines: {node: '>=14.21.3'} + cpu: [x64] + os: [win32] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} - peerDependencies: - '@babel/core': ^7.0.0-0 + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + '@jridgewell/trace-mapping': 0.3.9 dev: true - /@babel/plugin-syntax-jsx@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-6ddciUPe/mpMnOKv/U+RSd2vvVy+Yw/JfBB0ZHYjEZt9NLHmCUylNYlsbqCCS1Bffjlb0fCwC9Vqz+sBz6PsiQ==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/aix-ppc64@0.21.5: + resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.24.7): - resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/android-arm64@0.21.5: + resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/android-arm@0.21.5: + resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.24.7): - resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/android-x64@0.21.5: + resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/darwin-arm64@0.21.5: + resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/darwin-x64@0.21.5: + resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.24.7): - resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/freebsd-arm64@0.21.5: + resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.24.7): - resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/freebsd-x64@0.21.5: + resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true dev: true + optional: true - /@babel/plugin-syntax-typescript@7.24.7(@babel/core@7.24.7): - resolution: {integrity: sha512-c/+fVeJBB0FeKsFvwytYiUD+LBvhHjGSI0g446PRGdSVGZLRNArBUno2PETbAly3tpiNAQR5XaZ+JslxkotsbA==} - engines: {node: '>=6.9.0'} - peerDependencies: - '@babel/core': ^7.0.0-0 - dependencies: - '@babel/core': 7.24.7 - '@babel/helper-plugin-utils': 7.24.7 + /@esbuild/linux-arm64@0.21.5: + resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/runtime@7.24.6: - resolution: {integrity: sha512-Ja18XcETdEl5mzzACGd+DKgaGJzPTCow7EglgwTmHdwokzDFYh/MHua6lU6DV/hjF2IaOJ4oX2nqnjG7RElKOw==} - engines: {node: '>=6.9.0'} - dependencies: - regenerator-runtime: 0.14.1 - dev: false - - /@babel/template@7.24.7: - resolution: {integrity: sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 + /@esbuild/linux-arm@0.21.5: + resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/traverse@7.24.7: - resolution: {integrity: sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/code-frame': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/helper-environment-visitor': 7.24.7 - '@babel/helper-function-name': 7.24.7 - '@babel/helper-hoist-variables': 7.24.7 - '@babel/helper-split-export-declaration': 7.24.7 - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - debug: 4.3.5 - globals: 11.12.0 - transitivePeerDependencies: - - supports-color + /@esbuild/linux-ia32@0.21.5: + resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true dev: true + optional: true - /@babel/types@7.24.7: - resolution: {integrity: sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==} - engines: {node: '>=6.9.0'} - dependencies: - '@babel/helper-string-parser': 7.24.7 - '@babel/helper-validator-identifier': 7.24.7 - to-fast-properties: 2.0.0 + /@esbuild/linux-loong64@0.21.5: + resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true dev: true + optional: true - /@bcoe/v8-coverage@0.2.3: - resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + /@esbuild/linux-mips64el@0.21.5: + resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true dev: true + optional: true - /@biomejs/biome@1.8.1: - resolution: {integrity: sha512-fQXGfvq6DIXem12dGQCM2tNF+vsNHH1qs3C7WeOu75Pd0trduoTmoO7G4ntLJ2qDs5wuw981H+cxQhi1uHnAtA==} - engines: {node: '>=14.21.3'} - hasBin: true + /@esbuild/linux-ppc64@0.21.5: + resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] requiresBuild: true - optionalDependencies: - '@biomejs/cli-darwin-arm64': 1.8.1 - '@biomejs/cli-darwin-x64': 1.8.1 - '@biomejs/cli-linux-arm64': 1.8.1 - '@biomejs/cli-linux-arm64-musl': 1.8.1 - '@biomejs/cli-linux-x64': 1.8.1 - '@biomejs/cli-linux-x64-musl': 1.8.1 - '@biomejs/cli-win32-arm64': 1.8.1 - '@biomejs/cli-win32-x64': 1.8.1 dev: true + optional: true - /@biomejs/cli-darwin-arm64@1.8.1: - resolution: {integrity: sha512-XLiB7Uu6GALIOBWzQ2aMD0ru4Ly5/qSeQF7kk3AabzJ/kwsEWSe33iVySBP/SS2qv25cgqNiLksjGcw2bHT3mw==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [darwin] + /@esbuild/linux-riscv64@0.21.5: + resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-darwin-x64@1.8.1: - resolution: {integrity: sha512-uMTSxVLMfqkBVqyc25hSn83jBbp+wtWjzM/pHFlKXt3htJuw7FErVGW0nmQ9Sxa9vJ7GcqoltLMl28VQRIMYzg==} - engines: {node: '>=14.21.3'} - cpu: [x64] - os: [darwin] + /@esbuild/linux-s390x@0.21.5: + resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-arm64-musl@1.8.1: - resolution: {integrity: sha512-UQ8Wc01J0wQL+5AYOc7qkJn20B4PZmQL1KrmDZh7ot0DvD6aX4+8mmfd/dG5b6Zjo/44QvCKcvkFGCMRYuhWZA==} - engines: {node: '>=14.21.3'} - cpu: [arm64] + /@esbuild/linux-x64@0.21.5: + resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} + engines: {node: '>=12'} + cpu: [x64] os: [linux] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-arm64@1.8.1: - resolution: {integrity: sha512-3SzZRuC/9Oi2P2IBNPsEj0KXxSXUEYRR2kfRF/Ve8QAfGgrt4qnwuWd6QQKKN5R+oYH691qjm+cXBKEcrP1v/Q==} - engines: {node: '>=14.21.3'} - cpu: [arm64] - os: [linux] + /@esbuild/netbsd-x64@0.21.5: + resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-x64-musl@1.8.1: - resolution: {integrity: sha512-fYbP/kNu/rtZ4kKzWVocIdqZOtBSUEg9qUhZaao3dy3CRzafR6u6KDtBeSCnt47O+iLnks1eOR1TUxzr5+QuqA==} - engines: {node: '>=14.21.3'} + /@esbuild/openbsd-x64@0.21.5: + resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} + engines: {node: '>=12'} cpu: [x64] - os: [linux] + os: [openbsd] requiresBuild: true dev: true optional: true - /@biomejs/cli-linux-x64@1.8.1: - resolution: {integrity: sha512-AeBycVdNrTzsyYKEOtR2R0Ph0hCD0sCshcp2aOnfGP0hCZbtFg09D0SdKLbyzKntisY41HxKVrydYiaApp+2uw==} - engines: {node: '>=14.21.3'} + /@esbuild/sunos-x64@0.21.5: + resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} + engines: {node: '>=12'} cpu: [x64] - os: [linux] + os: [sunos] requiresBuild: true dev: true optional: true - /@biomejs/cli-win32-arm64@1.8.1: - resolution: {integrity: sha512-6tEd1H/iFKpgpE3OIB7oNgW5XkjiVMzMRPL8zYoZ036YfuJ5nMYm9eB9H/y81+8Z76vL48fiYzMPotJwukGPqQ==} - engines: {node: '>=14.21.3'} + /@esbuild/win32-arm64@0.21.5: + resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} + engines: {node: '>=12'} cpu: [arm64] os: [win32] requiresBuild: true dev: true optional: true - /@biomejs/cli-win32-x64@1.8.1: - resolution: {integrity: sha512-g2H31jJzYmS4jkvl6TiyEjEX+Nv79a5km/xn+5DARTp5MBFzC9gwceusSSB2AkJKqZzY131AiACAWjKrVt5Ijw==} - engines: {node: '>=14.21.3'} - cpu: [x64] + /@esbuild/win32-ia32@0.21.5: + resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} + engines: {node: '>=12'} + cpu: [ia32] os: [win32] requiresBuild: true dev: true optional: true - /@cspotcode/source-map-support@0.8.1: - resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + /@esbuild/win32-x64@0.21.5: + resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} engines: {node: '>=12'} - dependencies: - '@jridgewell/trace-mapping': 0.3.9 + cpu: [x64] + os: [win32] + requiresBuild: true dev: true + optional: true /@fast-csv/format@4.3.5: resolution: {integrity: sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==} @@ -782,22 +661,6 @@ packages: wrap-ansi-cjs: /wrap-ansi@7.0.0 dev: true - /@istanbuljs/load-nyc-config@1.1.0: - resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} - engines: {node: '>=8'} - dependencies: - camelcase: 5.3.1 - find-up: 4.1.0 - get-package-type: 0.1.0 - js-yaml: 3.14.1 - resolve-from: 5.0.0 - dev: true - - /@istanbuljs/schema@0.1.3: - resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} - engines: {node: '>=8'} - dev: true - /@jercle/yargonaut@1.1.5: resolution: {integrity: sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==} dependencies: @@ -806,149 +669,6 @@ packages: parent-require: 1.0.0 dev: true - /@jest/console@29.7.0: - resolution: {integrity: sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - chalk: 4.1.2 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - dev: true - - /@jest/core@29.7.0: - resolution: {integrity: sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/console': 29.7.0 - '@jest/reporters': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - ci-info: 3.9.0 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-changed-files: 29.7.0 - jest-config: 29.7.0(@types/node@18.19.33) - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-resolve-dependencies: 29.7.0 - jest-runner: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - jest-watcher: 29.7.0 - micromatch: 4.0.7 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-ansi: 6.0.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /@jest/environment@29.7.0: - resolution: {integrity: sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - jest-mock: 29.7.0 - dev: true - - /@jest/expect-utils@29.7.0: - resolution: {integrity: sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - dev: true - - /@jest/expect@29.7.0: - resolution: {integrity: sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - expect: 29.7.0 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/fake-timers@29.7.0: - resolution: {integrity: sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@sinonjs/fake-timers': 10.3.0 - '@types/node': 18.19.33 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /@jest/globals@29.7.0: - resolution: {integrity: sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/types': 29.6.3 - jest-mock: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/reporters@29.7.0: - resolution: {integrity: sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@bcoe/v8-coverage': 0.2.3 - '@jest/console': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - '@types/node': 18.19.33 - chalk: 4.1.2 - collect-v8-coverage: 1.0.2 - exit: 0.1.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - istanbul-lib-coverage: 3.2.2 - istanbul-lib-instrument: 6.0.2 - istanbul-lib-report: 3.0.1 - istanbul-lib-source-maps: 4.0.1 - istanbul-reports: 3.1.7 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - jest-worker: 29.7.0 - slash: 3.0.0 - string-length: 4.0.2 - strip-ansi: 6.0.1 - v8-to-istanbul: 9.2.0 - transitivePeerDependencies: - - supports-color - dev: true - /@jest/schemas@29.6.3: resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -956,100 +676,15 @@ packages: '@sinclair/typebox': 0.27.8 dev: true - /@jest/source-map@29.6.3: - resolution: {integrity: sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - callsites: 3.1.0 - graceful-fs: 4.2.11 - dev: true - - /@jest/test-result@29.7.0: - resolution: {integrity: sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/types': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - collect-v8-coverage: 1.0.2 - dev: true - - /@jest/test-sequencer@29.7.0: - resolution: {integrity: sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - slash: 3.0.0 - dev: true - - /@jest/transform@29.7.0: - resolution: {integrity: sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.24.7 - '@jest/types': 29.6.3 - '@jridgewell/trace-mapping': 0.3.25 - babel-plugin-istanbul: 6.1.1 - chalk: 4.1.2 - convert-source-map: 2.0.0 - fast-json-stable-stringify: 2.1.0 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - micromatch: 4.0.7 - pirates: 4.0.6 - slash: 3.0.0 - write-file-atomic: 4.0.2 - transitivePeerDependencies: - - supports-color - dev: true - - /@jest/types@29.6.3: - resolution: {integrity: sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/schemas': 29.6.3 - '@types/istanbul-lib-coverage': 2.0.6 - '@types/istanbul-reports': 3.0.4 - '@types/node': 18.19.33 - '@types/yargs': 17.0.32 - chalk: 4.1.2 - dev: true - - /@jridgewell/gen-mapping@0.3.5: - resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} - engines: {node: '>=6.0.0'} - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.25 - dev: true - /@jridgewell/resolve-uri@3.1.2: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} dev: true - /@jridgewell/set-array@1.2.1: - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - dev: true - /@jridgewell/sourcemap-codec@1.4.15: resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} dev: true - /@jridgewell/trace-mapping@0.3.25: - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - dev: true - /@jridgewell/trace-mapping@0.3.9: resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} dependencies: @@ -1295,37 +930,165 @@ packages: dev: true optional: true - /@puppeteer/browsers@1.9.1: - resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} - engines: {node: '>=16.3.0'} - hasBin: true - dependencies: - debug: 4.3.4 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.3.1 - tar-fs: 3.0.4 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color - dev: false + /@puppeteer/browsers@1.9.1: + resolution: {integrity: sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==} + engines: {node: '>=16.3.0'} + hasBin: true + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.3.1 + tar-fs: 3.0.4 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + dev: false + + /@puppeteer/browsers@2.2.3: + resolution: {integrity: sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==} + engines: {node: '>=18'} + hasBin: true + dependencies: + debug: 4.3.4 + extract-zip: 2.0.1 + progress: 2.0.3 + proxy-agent: 6.4.0 + semver: 7.6.0 + tar-fs: 3.0.5 + unbzip2-stream: 1.4.3 + yargs: 17.7.2 + transitivePeerDependencies: + - supports-color + + /@rollup/rollup-android-arm-eabi@4.18.0: + resolution: {integrity: sha512-Tya6xypR10giZV1XzxmH5wr25VcZSncG0pZIjfePT0OVBvqNEurzValetGNarVrGiq66EBVAFn15iYX4w6FKgQ==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-android-arm64@4.18.0: + resolution: {integrity: sha512-avCea0RAP03lTsDhEyfy+hpfr85KfyTctMADqHVhLAF3MlIkq83CP8UfAHUssgXTYd+6er6PaAhx/QGv4L1EiA==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-arm64@4.18.0: + resolution: {integrity: sha512-IWfdwU7KDSm07Ty0PuA/W2JYoZ4iTj3TUQjkVsO/6U+4I1jN5lcR71ZEvRh52sDOERdnNhhHU57UITXz5jC1/w==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-darwin-x64@4.18.0: + resolution: {integrity: sha512-n2LMsUz7Ynu7DoQrSQkBf8iNrjOGyPLrdSg802vk6XT3FtsgX6JbE8IHRvposskFm9SNxzkLYGSq9QdpLYpRNA==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.18.0: + resolution: {integrity: sha512-C/zbRYRXFjWvz9Z4haRxcTdnkPt1BtCkz+7RtBSuNmKzMzp3ZxdM28Mpccn6pt28/UWUCTXa+b0Mx1k3g6NOMA==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm-musleabihf@4.18.0: + resolution: {integrity: sha512-l3m9ewPgjQSXrUMHg93vt0hYCGnrMOcUpTz6FLtbwljo2HluS4zTXFy2571YQbisTnfTKPZ01u/ukJdQTLGh9A==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.18.0: + resolution: {integrity: sha512-rJ5D47d8WD7J+7STKdCUAgmQk49xuFrRi9pZkWoRD1UeSMakbcepWXPF8ycChBoAqs1pb2wzvbY6Q33WmN2ftw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-arm64-musl@4.18.0: + resolution: {integrity: sha512-be6Yx37b24ZwxQ+wOQXXLZqpq4jTckJhtGlWGZs68TgdKXJgw54lUUoFYrg6Zs/kjzAQwEwYbp8JxZVzZLRepQ==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-powerpc64le-gnu@4.18.0: + resolution: {integrity: sha512-hNVMQK+qrA9Todu9+wqrXOHxFiD5YmdEi3paj6vP02Kx1hjd2LLYR2eaN7DsEshg09+9uzWi2W18MJDlG0cxJA==} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.18.0: + resolution: {integrity: sha512-ROCM7i+m1NfdrsmvwSzoxp9HFtmKGHEqu5NNDiZWQtXLA8S5HBCkVvKAxJ8U+CVctHwV2Gb5VUaK7UAkzhDjlg==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-s390x-gnu@4.18.0: + resolution: {integrity: sha512-0UyyRHyDN42QL+NbqevXIIUnKA47A+45WyasO+y2bGJ1mhQrfrtXUpTxCOrfxCR4esV3/RLYyucGVPiUsO8xjg==} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-gnu@4.18.0: + resolution: {integrity: sha512-xuglR2rBVHA5UsI8h8UbX4VJ470PtGCf5Vpswh7p2ukaqBGFTnsfzxUBetoWBWymHMxbIG0Cmx7Y9qDZzr648w==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-linux-x64-musl@4.18.0: + resolution: {integrity: sha512-LKaqQL9osY/ir2geuLVvRRs+utWUNilzdE90TpyoX0eNqPzWjRm14oMEE+YLve4k/NAqCdPkGYDaDF5Sw+xBfg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.18.0: + resolution: {integrity: sha512-7J6TkZQFGo9qBKH0pk2cEVSRhJbL6MtfWxth7Y5YmZs57Pi+4x6c2dStAUvaQkHQLnEQv1jzBUW43GvZW8OFqA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: true + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.18.0: + resolution: {integrity: sha512-Txjh+IxBPbkUB9+SXZMpv+b/vnTEtFyfWZgJ6iyCmt2tdx0OF5WhFowLmnh8ENGNpfUlUZkdI//4IEmhwPieNg==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: true + optional: true - /@puppeteer/browsers@2.2.3: - resolution: {integrity: sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==} - engines: {node: '>=18'} - hasBin: true - dependencies: - debug: 4.3.4 - extract-zip: 2.0.1 - progress: 2.0.3 - proxy-agent: 6.4.0 - semver: 7.6.0 - tar-fs: 3.0.5 - unbzip2-stream: 1.4.3 - yargs: 17.7.2 - transitivePeerDependencies: - - supports-color + /@rollup/rollup-win32-x64-msvc@4.18.0: + resolution: {integrity: sha512-UOo5FdvOL0+eIVTgS4tIdbW+TtnBLWg1YBCcU2KWM7nuNwRz9bksDX1bekJJCpu25N1DVWaCwnT39dVQxzqS8g==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: true + optional: true /@rushstack/node-core-library@5.4.1(@types/node@18.19.33): resolution: {integrity: sha512-WNnwdS8r9NZ/2K3u29tNoSRldscFa7SxU0RT+82B6Dy2I4Hl2MeCSKm4EXLXPKeNzLGvJ1cqbUhTLviSF8E6iA==} @@ -1428,18 +1191,6 @@ packages: engines: {node: '>=10'} dev: false - /@sinonjs/commons@3.0.1: - resolution: {integrity: sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==} - dependencies: - type-detect: 4.0.8 - dev: true - - /@sinonjs/fake-timers@10.3.0: - resolution: {integrity: sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==} - dependencies: - '@sinonjs/commons': 3.0.1 - dev: true - /@slack/logger@3.0.0: resolution: {integrity: sha512-DTuBFbqu4gGfajREEMrkq5jBhcnskinhr4+AnfJEk48zhVeEv3XnUKGIX98B74kxhYsIMfApGGySTn7V3b5yBA==} engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} @@ -1514,35 +1265,6 @@ packages: /@types/argparse@1.0.38: resolution: {integrity: sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==} - /@types/babel__core@7.20.5: - resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} - dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - '@types/babel__generator': 7.6.8 - '@types/babel__template': 7.4.4 - '@types/babel__traverse': 7.20.6 - dev: true - - /@types/babel__generator@7.6.8: - resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==} - dependencies: - '@babel/types': 7.24.7 - dev: true - - /@types/babel__template@7.4.4: - resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==} - dependencies: - '@babel/parser': 7.24.7 - '@babel/types': 7.24.7 - dev: true - - /@types/babel__traverse@7.20.6: - resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==} - dependencies: - '@babel/types': 7.24.7 - dev: true - /@types/body-parser@1.19.5: resolution: {integrity: sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==} dependencies: @@ -1565,6 +1287,10 @@ packages: '@types/node': 18.19.33 dev: true + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: true + /@types/express-serve-static-core@4.19.3: resolution: {integrity: sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==} dependencies: @@ -1583,12 +1309,6 @@ packages: '@types/serve-static': 1.15.7 dev: true - /@types/graceful-fs@4.1.9: - resolution: {integrity: sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==} - dependencies: - '@types/node': 18.19.33 - dev: true - /@types/har-format@1.2.15: resolution: {integrity: sha512-RpQH4rXLuvTXKR0zqHq3go0RVXYv/YVqv4TnPH95VbwUxZdQlK1EtcMvQvMpDngHbt13Csh9Z4qT9AbkiQH5BA==} dev: true @@ -1607,29 +1327,6 @@ packages: '@types/node': 18.19.33 dev: false - /@types/istanbul-lib-coverage@2.0.6: - resolution: {integrity: sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==} - dev: true - - /@types/istanbul-lib-report@3.0.3: - resolution: {integrity: sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==} - dependencies: - '@types/istanbul-lib-coverage': 2.0.6 - dev: true - - /@types/istanbul-reports@3.0.4: - resolution: {integrity: sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==} - dependencies: - '@types/istanbul-lib-report': 3.0.3 - dev: true - - /@types/jest@29.5.12: - resolution: {integrity: sha512-eDC8bTvT/QhYdxJAulQikueigY5AsdBRH2yDKW3yveW7svY3+DzN84/2NUgkw10RTiJbWqZrTtoGVdYlvFJdLw==} - dependencies: - expect: 29.7.0 - pretty-format: 29.7.0 - dev: true - /@types/keyv@3.1.4: resolution: {integrity: sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==} dependencies: @@ -1682,20 +1379,6 @@ packages: '@types/send': 0.17.4 dev: true - /@types/stack-utils@2.0.3: - resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} - dev: true - - /@types/yargs-parser@21.0.3: - resolution: {integrity: sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==} - dev: true - - /@types/yargs@17.0.32: - resolution: {integrity: sha512-xQ67Yc/laOG5uMfX/093MRlGGCIBzZMarVa+gfNKJxWAIgykYpVGkBdbqEzGDDfCrVUj6Hiff4mTZ5BA6TmAog==} - dependencies: - '@types/yargs-parser': 21.0.3 - dev: true - /@types/yauzl@2.10.3: resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} requiresBuild: true @@ -1718,6 +1401,45 @@ packages: engines: {node: '>=10'} dev: false + /@vitest/expect@1.6.0: + resolution: {integrity: sha512-ixEvFVQjycy/oNgHjqsL6AZCDduC+tflRluaHIzKIsdbzkLn2U/iBnVeJwB6HsIjQBdfMR8Z0tRxKUsvFJEeWQ==} + dependencies: + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + chai: 4.4.1 + dev: true + + /@vitest/runner@1.6.0: + resolution: {integrity: sha512-P4xgwPjwesuBiHisAVz/LSSZtDjOTPYZVmNAnpHHSR6ONrf8eCJOFRvUwdHn30F5M1fxhqtl7QZQUk2dprIXAg==} + dependencies: + '@vitest/utils': 1.6.0 + p-limit: 5.0.0 + pathe: 1.1.2 + dev: true + + /@vitest/snapshot@1.6.0: + resolution: {integrity: sha512-+Hx43f8Chus+DCmygqqfetcAZrDJwvTj0ymqjQq4CvmpKFSTVteEOBzCusu1x2tt4OJcvBflyHUE0DZSLgEMtQ==} + dependencies: + magic-string: 0.30.10 + pathe: 1.1.2 + pretty-format: 29.7.0 + dev: true + + /@vitest/spy@1.6.0: + resolution: {integrity: sha512-leUTap6B/cqi/bQkXUu6bQV5TZPx7pmMBKBQiI0rJA8c3pB56ZsaTbREnF7CJfmvAS4V2cXIBAh/3rVwrrCYgw==} + dependencies: + tinyspy: 2.2.1 + dev: true + + /@vitest/utils@1.6.0: + resolution: {integrity: sha512-21cPiuGMoMZwiOHa2i4LXkMkMkCGzA+MVFV70jRwHo95dL4x/ts5GZhML1QWuy7yfp3WzK3lRvZi3JnXTYqrBw==} + dependencies: + diff-sequences: 29.6.3 + estree-walker: 3.0.3 + loupe: 2.3.7 + pretty-format: 29.7.0 + dev: true + /abab@2.0.6: resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} deprecated: Use your platform's native atob() and btoa() methods instead @@ -1859,13 +1581,6 @@ packages: resolution: {integrity: sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==} engines: {node: '>=6'} - /ansi-escapes@4.3.2: - resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} - engines: {node: '>=8'} - dependencies: - type-fest: 0.21.3 - dev: true - /ansi-regex@5.0.1: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} @@ -1879,6 +1594,7 @@ packages: engines: {node: '>=4'} dependencies: color-convert: 1.9.3 + dev: false /ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} @@ -1896,14 +1612,6 @@ packages: engines: {node: '>=12'} dev: true - /anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - dev: true - /archiver-utils@2.1.0: resolution: {integrity: sha512-bEL/yUb/fNNiNTuUz979Z0Yg5L+LzLxGJz8x79lYmR54fmTIb6ob/hNQgkQnIUDWIFjZVQwl9Xs356I6BAMHfw==} engines: {node: '>= 6'} @@ -1966,6 +1674,10 @@ packages: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} + /assertion-error@1.1.0: + resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==} + dev: true + /ast-types@0.13.4: resolution: {integrity: sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==} engines: {node: '>=4'} @@ -2019,78 +1731,6 @@ packages: /b4a@1.6.6: resolution: {integrity: sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==} - /babel-jest@29.7.0(@babel/core@7.24.7): - resolution: {integrity: sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.8.0 - dependencies: - '@babel/core': 7.24.7 - '@jest/transform': 29.7.0 - '@types/babel__core': 7.20.5 - babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.6.3(@babel/core@7.24.7) - chalk: 4.1.2 - graceful-fs: 4.2.11 - slash: 3.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-istanbul@6.1.1: - resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} - engines: {node: '>=8'} - dependencies: - '@babel/helper-plugin-utils': 7.24.7 - '@istanbuljs/load-nyc-config': 1.1.0 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-instrument: 5.2.1 - test-exclude: 6.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /babel-plugin-jest-hoist@29.6.3: - resolution: {integrity: sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/template': 7.24.7 - '@babel/types': 7.24.7 - '@types/babel__core': 7.20.5 - '@types/babel__traverse': 7.20.6 - dev: true - - /babel-preset-current-node-syntax@1.0.1(@babel/core@7.24.7): - resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.7 - '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.24.7) - '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.24.7) - '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.24.7) - '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.24.7) - '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.24.7) - dev: true - - /babel-preset-jest@29.6.3(@babel/core@7.24.7): - resolution: {integrity: sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@babel/core': ^7.0.0 - dependencies: - '@babel/core': 7.24.7 - babel-plugin-jest-hoist: 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) - dev: true - /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -2163,6 +1803,7 @@ packages: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 + dev: false /brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -2179,37 +1820,9 @@ packages: resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} dev: false - /browserslist@4.23.1: - resolution: {integrity: sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - dependencies: - caniuse-lite: 1.0.30001636 - electron-to-chromium: 1.4.803 - node-releases: 2.0.14 - update-browserslist-db: 1.0.16(browserslist@4.23.1) - dev: true - - /bs-logger@0.2.6: - resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} - engines: {node: '>= 6'} - dependencies: - fast-json-stable-stringify: 2.1.0 - dev: true - - /bser@2.1.1: - resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} - dependencies: - node-int64: 0.4.0 - dev: true - /buffer-crc32@0.2.13: resolution: {integrity: sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==} - /buffer-from@1.1.2: - resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - dev: true - /buffer-indexof-polyfill@1.0.2: resolution: {integrity: sha512-I7wzHwA3t1/lwXQh+A5PbNvJxgfo5r3xulgpYDB5zckTu/Z9oUK9biouBKQUjEqzaz3HnAT6TYoovmE+GqSf7A==} engines: {node: '>=0.10'} @@ -2232,6 +1845,11 @@ packages: engines: {node: '>=0.2.0'} dev: false + /cac@6.7.14: + resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} + engines: {node: '>=8'} + dev: true + /cacheable-lookup@5.0.4: resolution: {integrity: sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==} engines: {node: '>=10.6.0'} @@ -2253,19 +1871,19 @@ packages: /callsites@3.1.0: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} + dev: false - /camelcase@5.3.1: - resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} - engines: {node: '>=6'} - dev: true - - /camelcase@6.3.0: - resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} - engines: {node: '>=10'} - dev: true - - /caniuse-lite@1.0.30001636: - resolution: {integrity: sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==} + /chai@4.4.1: + resolution: {integrity: sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==} + engines: {node: '>=4'} + dependencies: + assertion-error: 1.1.0 + check-error: 1.0.3 + deep-eql: 4.1.4 + get-func-name: 2.0.2 + loupe: 2.3.7 + pathval: 1.1.1 + type-detect: 4.0.8 dev: true /chainsaw@0.1.0: @@ -2281,6 +1899,7 @@ packages: ansi-styles: 3.2.1 escape-string-regexp: 1.0.5 supports-color: 5.5.0 + dev: false /chalk@4.1.2: resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} @@ -2295,9 +1914,10 @@ packages: engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} dev: false - /char-regex@1.0.2: - resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} - engines: {node: '>=10'} + /check-error@1.0.3: + resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==} + dependencies: + get-func-name: 2.0.2 dev: true /chownr@1.1.4: @@ -2347,15 +1967,6 @@ packages: urlpattern-polyfill: 10.0.0 dev: false - /ci-info@3.9.0: - resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} - engines: {node: '>=8'} - dev: true - - /cjs-module-lexer@1.3.1: - resolution: {integrity: sha512-a3KdPAANPbNE4ZUv9h6LckSl9zLsYOP4MBmhIPkRaeyybt+r4UghLvq+xw/YwUcC1gqylCkL4rdVs3Lwupjm4Q==} - dev: true - /cli-cursor@4.0.0: resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2390,23 +2001,15 @@ packages: mimic-response: 1.0.1 dev: false - /co@4.6.0: - resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} - engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} - dev: true - /code-block-writer@12.0.0: resolution: {integrity: sha512-q4dMFMlXtKR3XNBHyMHt/3pwYNA69EDk00lloMOaaUMKPUXBw6lpXtbu3MMVG6/uOihGnRDOlkyqsONEUj60+w==} dev: false - /collect-v8-coverage@1.0.2: - resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: color-name: 1.1.3 + dev: false /color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} @@ -2416,6 +2019,7 @@ packages: /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} @@ -2461,6 +2065,11 @@ packages: /concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + dev: false + + /confbox@0.1.7: + resolution: {integrity: sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==} + dev: true /configstore@5.0.1: resolution: {integrity: sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==} @@ -2473,10 +2082,6 @@ packages: write-file-atomic: 3.0.3 xdg-basedir: 4.0.0 - /convert-source-map@2.0.0: - resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} - dev: true - /cookie@0.4.2: resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} engines: {node: '>= 0.6'} @@ -2519,25 +2124,6 @@ packages: readable-stream: 3.6.2 dev: false - /create-jest@29.7.0: - resolution: {integrity: sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@18.19.33) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - /create-require@1.1.1: resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} dev: true @@ -2661,18 +2247,11 @@ packages: mimic-response: 3.1.0 dev: false - /dedent@1.5.3: - resolution: {integrity: sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==} - peerDependencies: - babel-plugin-macros: ^3.1.0 - peerDependenciesMeta: - babel-plugin-macros: - optional: true - dev: true - - /deepmerge@4.3.1: - resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} - engines: {node: '>=0.10.0'} + /deep-eql@4.1.4: + resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==} + engines: {node: '>=6'} + dependencies: + type-detect: 4.0.8 dev: true /defer-to-connect@2.0.1: @@ -2701,11 +2280,6 @@ packages: resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==} engines: {node: '>=0.10'} - /detect-newline@3.1.0: - resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} - engines: {node: '>=8'} - dev: true - /devtools-protocol@0.0.1232444: resolution: {integrity: sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==} @@ -2769,10 +2343,6 @@ packages: resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} dev: true - /electron-to-chromium@1.4.803: - resolution: {integrity: sha512-61H9mLzGOCLLVsnLiRzCbc63uldP0AniRYPV3hbGVtONA1pI7qSGILdbofR7A8TMbOypDocEAjH/e+9k1QIe3g==} - dev: true - /emittery@0.13.1: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} @@ -2809,6 +2379,38 @@ packages: resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} dependencies: is-arrayish: 0.2.1 + dev: false + + /esbuild@0.21.5: + resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.21.5 + '@esbuild/android-arm': 0.21.5 + '@esbuild/android-arm64': 0.21.5 + '@esbuild/android-x64': 0.21.5 + '@esbuild/darwin-arm64': 0.21.5 + '@esbuild/darwin-x64': 0.21.5 + '@esbuild/freebsd-arm64': 0.21.5 + '@esbuild/freebsd-x64': 0.21.5 + '@esbuild/linux-arm': 0.21.5 + '@esbuild/linux-arm64': 0.21.5 + '@esbuild/linux-ia32': 0.21.5 + '@esbuild/linux-loong64': 0.21.5 + '@esbuild/linux-mips64el': 0.21.5 + '@esbuild/linux-ppc64': 0.21.5 + '@esbuild/linux-riscv64': 0.21.5 + '@esbuild/linux-s390x': 0.21.5 + '@esbuild/linux-x64': 0.21.5 + '@esbuild/netbsd-x64': 0.21.5 + '@esbuild/openbsd-x64': 0.21.5 + '@esbuild/sunos-x64': 0.21.5 + '@esbuild/win32-arm64': 0.21.5 + '@esbuild/win32-ia32': 0.21.5 + '@esbuild/win32-x64': 0.21.5 + dev: true /escalade@3.1.2: resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} @@ -2817,11 +2419,7 @@ packages: /escape-string-regexp@1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} - - /escape-string-regexp@2.0.0: - resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} - engines: {node: '>=8'} - dev: true + dev: false /escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} @@ -2851,6 +2449,12 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: true + /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} @@ -2886,35 +2490,19 @@ packages: uuid: 8.3.2 dev: false - /execa@5.1.1: - resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} - engines: {node: '>=10'} + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} dependencies: cross-spawn: 7.0.3 - get-stream: 6.0.1 - human-signals: 2.1.0 - is-stream: 2.0.1 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 merge-stream: 2.0.0 - npm-run-path: 4.0.1 - onetime: 5.1.2 - signal-exit: 3.0.7 - strip-final-newline: 2.0.0 - dev: true - - /exit@0.1.2: - resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} - engines: {node: '>= 0.8.0'} - dev: true - - /expect@29.7.0: - resolution: {integrity: sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/expect-utils': 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 + npm-run-path: 5.3.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 dev: true /extract-zip@2.0.1: @@ -2964,10 +2552,6 @@ packages: merge2: 1.4.1 micromatch: 4.0.7 - /fast-json-stable-stringify@2.1.0: - resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} - dev: true - /fast-json-stringify@5.16.0: resolution: {integrity: sha512-A4bg6E15QrkuVO3f0SwIASgzMzR6XC4qTyTqhf3hYXy0iazbAdZKwkE+ox4WgzKyzM6ygvbdq3r134UjOaaAnA==} dependencies: @@ -3023,12 +2607,6 @@ packages: dependencies: reusify: 1.0.4 - /fb-watchman@2.0.2: - resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} - dependencies: - bser: 2.1.1 - dev: true - /fd-slicer@1.1.0: resolution: {integrity: sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==} dependencies: @@ -3060,6 +2638,7 @@ packages: dependencies: locate-path: 5.0.0 path-exists: 4.0.0 + dev: false /follow-redirects@1.15.6: resolution: {integrity: sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==} @@ -3168,11 +2747,6 @@ packages: dependencies: is-property: 1.0.2 - /gensync@1.0.0-beta.2: - resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} - engines: {node: '>=6.9.0'} - dev: true - /get-caller-file@2.0.5: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} @@ -3182,6 +2756,10 @@ packages: engines: {node: '>=18'} dev: false + /get-func-name@2.0.2: + resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} + dev: true + /get-package-type@0.1.0: resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} engines: {node: '>=8.0.0'} @@ -3192,9 +2770,9 @@ packages: dependencies: pump: 3.0.0 - /get-stream@6.0.1: - resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} - engines: {node: '>=10'} + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} dev: true /get-uri@6.0.3: @@ -3239,6 +2817,7 @@ packages: minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 + dev: false /glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} @@ -3251,11 +2830,6 @@ packages: minimatch: 5.1.6 once: 1.4.0 - /globals@11.12.0: - resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} - engines: {node: '>=4'} - dev: true - /globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -3290,6 +2864,7 @@ packages: /has-flag@3.0.0: resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} engines: {node: '>=4'} + dev: false /has-flag@4.0.0: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} @@ -3310,11 +2885,7 @@ packages: engines: {node: '>=10'} dependencies: whatwg-encoding: 1.0.5 - dev: false - - /html-escaper@2.0.2: - resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} - dev: true + dev: false /http-cache-semantics@4.1.1: resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} @@ -3380,9 +2951,9 @@ packages: transitivePeerDependencies: - supports-color - /human-signals@2.1.0: - resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} - engines: {node: '>=10.17.0'} + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} dev: true /iconv-lite@0.4.24: @@ -3424,15 +2995,6 @@ packages: resolution: {integrity: sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==} engines: {node: '>=8'} - /import-local@3.1.0: - resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} - engines: {node: '>=8'} - hasBin: true - dependencies: - pkg-dir: 4.2.0 - resolve-cwd: 3.0.0 - dev: true - /imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -3472,6 +3034,7 @@ packages: /is-arrayish@0.2.1: resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + dev: false /is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -3495,11 +3058,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - /is-generator-fn@2.1.0: - resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} - engines: {node: '>=6'} - dev: true - /is-glob@4.0.3: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} @@ -3536,9 +3094,9 @@ packages: engines: {node: '>=0.10.0'} dev: false - /is-stream@2.0.1: - resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} - engines: {node: '>=8'} + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dev: true /is-typedarray@1.0.0: @@ -3568,482 +3126,13 @@ packages: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} dev: true - /istanbul-lib-coverage@3.2.2: - resolution: {integrity: sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==} - engines: {node: '>=8'} - dev: true - - /istanbul-lib-instrument@5.2.1: - resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} - engines: {node: '>=8'} - dependencies: - '@babel/core': 7.24.7 - '@babel/parser': 7.24.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 6.3.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-instrument@6.0.2: - resolution: {integrity: sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==} - engines: {node: '>=10'} - dependencies: - '@babel/core': 7.24.7 - '@babel/parser': 7.24.7 - '@istanbuljs/schema': 0.1.3 - istanbul-lib-coverage: 3.2.2 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-lib-report@3.0.1: - resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} - engines: {node: '>=10'} - dependencies: - istanbul-lib-coverage: 3.2.2 - make-dir: 4.0.0 - supports-color: 7.2.0 - dev: true - - /istanbul-lib-source-maps@4.0.1: - resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} - engines: {node: '>=10'} - dependencies: - debug: 4.3.5 - istanbul-lib-coverage: 3.2.2 - source-map: 0.6.1 - transitivePeerDependencies: - - supports-color - dev: true - - /istanbul-reports@3.1.7: - resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==} - engines: {node: '>=8'} - dependencies: - html-escaper: 2.0.2 - istanbul-lib-report: 3.0.1 - dev: true - - /jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - dev: true - - /jest-changed-files@29.7.0: - resolution: {integrity: sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - execa: 5.1.1 - jest-util: 29.7.0 - p-limit: 3.1.0 - dev: true - - /jest-circus@29.7.0: - resolution: {integrity: sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/expect': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - chalk: 4.1.2 - co: 4.6.0 - dedent: 1.5.3 - is-generator-fn: 2.1.0 - jest-each: 29.7.0 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-runtime: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - p-limit: 3.1.0 - pretty-format: 29.7.0 - pure-rand: 6.1.0 - slash: 3.0.0 - stack-utils: 2.0.6 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-cli@29.7.0: - resolution: {integrity: sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true - dependencies: - '@jest/core': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0 - exit: 0.1.2 - import-local: 3.1.0 - jest-config: 29.7.0(@types/node@18.19.33) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - dev: true - - /jest-config@29.7.0(@types/node@18.19.33): - resolution: {integrity: sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - peerDependencies: - '@types/node': '*' - ts-node: '>=9.0.0' - peerDependenciesMeta: - '@types/node': - optional: true - ts-node: - optional: true - dependencies: - '@babel/core': 7.24.7 - '@jest/test-sequencer': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - babel-jest: 29.7.0(@babel/core@7.24.7) - chalk: 4.1.2 - ci-info: 3.9.0 - deepmerge: 4.3.1 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-circus: 29.7.0 - jest-environment-node: 29.7.0 - jest-get-type: 29.6.3 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-runner: 29.7.0 - jest-util: 29.7.0 - jest-validate: 29.7.0 - micromatch: 4.0.7 - parse-json: 5.2.0 - pretty-format: 29.7.0 - slash: 3.0.0 - strip-json-comments: 3.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - dev: true - - /jest-diff@29.7.0: - resolution: {integrity: sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - diff-sequences: 29.6.3 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-docblock@29.7.0: - resolution: {integrity: sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - detect-newline: 3.1.0 - dev: true - - /jest-each@29.7.0: - resolution: {integrity: sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - jest-get-type: 29.6.3 - jest-util: 29.7.0 - pretty-format: 29.7.0 - dev: true - - /jest-environment-node@29.7.0: - resolution: {integrity: sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - jest-mock: 29.7.0 - jest-util: 29.7.0 - dev: true - - /jest-get-type@29.6.3: - resolution: {integrity: sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-haste-map@29.7.0: - resolution: {integrity: sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/graceful-fs': 4.1.9 - '@types/node': 18.19.33 - anymatch: 3.1.3 - fb-watchman: 2.0.2 - graceful-fs: 4.2.11 - jest-regex-util: 29.6.3 - jest-util: 29.7.0 - jest-worker: 29.7.0 - micromatch: 4.0.7 - walker: 1.0.8 - optionalDependencies: - fsevents: 2.3.3 - dev: true - - /jest-leak-detector@29.7.0: - resolution: {integrity: sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-matcher-utils@29.7.0: - resolution: {integrity: sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - pretty-format: 29.7.0 - dev: true - - /jest-message-util@29.7.0: - resolution: {integrity: sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/code-frame': 7.24.7 - '@jest/types': 29.6.3 - '@types/stack-utils': 2.0.3 - chalk: 4.1.2 - graceful-fs: 4.2.11 - micromatch: 4.0.7 - pretty-format: 29.7.0 - slash: 3.0.0 - stack-utils: 2.0.6 - dev: true - - /jest-mock@29.7.0: - resolution: {integrity: sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - jest-util: 29.7.0 - dev: true - - /jest-pnp-resolver@1.2.3(jest-resolve@29.7.0): - resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} - engines: {node: '>=6'} - peerDependencies: - jest-resolve: '*' - peerDependenciesMeta: - jest-resolve: - optional: true - dependencies: - jest-resolve: 29.7.0 - dev: true - - /jest-regex-util@29.6.3: - resolution: {integrity: sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dev: true - - /jest-resolve-dependencies@29.7.0: - resolution: {integrity: sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - jest-regex-util: 29.6.3 - jest-snapshot: 29.7.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-resolve@29.7.0: - resolution: {integrity: sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - chalk: 4.1.2 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-pnp-resolver: 1.2.3(jest-resolve@29.7.0) - jest-util: 29.7.0 - jest-validate: 29.7.0 - resolve: 1.22.8 - resolve.exports: 2.0.2 - slash: 3.0.0 - dev: true - - /jest-runner@29.7.0: - resolution: {integrity: sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/console': 29.7.0 - '@jest/environment': 29.7.0 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - chalk: 4.1.2 - emittery: 0.13.1 - graceful-fs: 4.2.11 - jest-docblock: 29.7.0 - jest-environment-node: 29.7.0 - jest-haste-map: 29.7.0 - jest-leak-detector: 29.7.0 - jest-message-util: 29.7.0 - jest-resolve: 29.7.0 - jest-runtime: 29.7.0 - jest-util: 29.7.0 - jest-watcher: 29.7.0 - jest-worker: 29.7.0 - p-limit: 3.1.0 - source-map-support: 0.5.13 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-runtime@29.7.0: - resolution: {integrity: sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/environment': 29.7.0 - '@jest/fake-timers': 29.7.0 - '@jest/globals': 29.7.0 - '@jest/source-map': 29.6.3 - '@jest/test-result': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - chalk: 4.1.2 - cjs-module-lexer: 1.3.1 - collect-v8-coverage: 1.0.2 - glob: 7.2.3 - graceful-fs: 4.2.11 - jest-haste-map: 29.7.0 - jest-message-util: 29.7.0 - jest-mock: 29.7.0 - jest-regex-util: 29.6.3 - jest-resolve: 29.7.0 - jest-snapshot: 29.7.0 - jest-util: 29.7.0 - slash: 3.0.0 - strip-bom: 4.0.0 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-snapshot@29.7.0: - resolution: {integrity: sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@babel/core': 7.24.7 - '@babel/generator': 7.24.7 - '@babel/plugin-syntax-jsx': 7.24.7(@babel/core@7.24.7) - '@babel/plugin-syntax-typescript': 7.24.7(@babel/core@7.24.7) - '@babel/types': 7.24.7 - '@jest/expect-utils': 29.7.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-preset-current-node-syntax: 1.0.1(@babel/core@7.24.7) - chalk: 4.1.2 - expect: 29.7.0 - graceful-fs: 4.2.11 - jest-diff: 29.7.0 - jest-get-type: 29.6.3 - jest-matcher-utils: 29.7.0 - jest-message-util: 29.7.0 - jest-util: 29.7.0 - natural-compare: 1.4.0 - pretty-format: 29.7.0 - semver: 7.6.2 - transitivePeerDependencies: - - supports-color - dev: true - - /jest-util@29.7.0: - resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - chalk: 4.1.2 - ci-info: 3.9.0 - graceful-fs: 4.2.11 - picomatch: 2.3.1 - dev: true - - /jest-validate@29.7.0: - resolution: {integrity: sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/types': 29.6.3 - camelcase: 6.3.0 - chalk: 4.1.2 - jest-get-type: 29.6.3 - leven: 3.1.0 - pretty-format: 29.7.0 - dev: true - - /jest-watcher@29.7.0: - resolution: {integrity: sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - '@types/node': 18.19.33 - ansi-escapes: 4.3.2 - chalk: 4.1.2 - emittery: 0.13.1 - jest-util: 29.7.0 - string-length: 4.0.2 - dev: true - - /jest-worker@29.7.0: - resolution: {integrity: sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - dependencies: - '@types/node': 18.19.33 - jest-util: 29.7.0 - merge-stream: 2.0.0 - supports-color: 8.1.1 - dev: true - - /jest@29.7.0: - resolution: {integrity: sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - hasBin: true - peerDependencies: - node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 - peerDependenciesMeta: - node-notifier: - optional: true + /jackspeak@3.4.0: + resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} + engines: {node: '>=14'} dependencies: - '@jest/core': 29.7.0 - '@jest/types': 29.6.3 - import-local: 3.1.0 - jest-cli: 29.7.0 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 dev: true /jju@1.4.0: @@ -4063,13 +3152,10 @@ packages: /js-tokens@4.0.0: resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false - /js-yaml@3.14.1: - resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} - hasBin: true - dependencies: - argparse: 1.0.10 - esprima: 4.0.1 + /js-tokens@9.0.0: + resolution: {integrity: sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==} dev: true /js-yaml@4.1.0: @@ -4124,18 +3210,13 @@ packages: - utf-8-validate dev: false - /jsesc@2.5.2: - resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} - engines: {node: '>=4'} - hasBin: true - dev: true - /json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} dev: false /json-parse-even-better-errors@2.3.1: resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + dev: false /json-schema-ref-resolver@1.0.1: resolution: {integrity: sha512-EJAj1pgHc1hxF6vo2Z3s69fMjO1INq6eGHXZ8Z6wCQeldCuwxGK9Sxf4/cScGn3FZubCVUehfWtcDM/PLteCQw==} @@ -4178,11 +3259,6 @@ packages: json-buffer: 3.0.1 dev: false - /kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - dev: true - /knex@2.5.1(mysql2@3.6.2): resolution: {integrity: sha512-z78DgGKUr4SE/6cm7ku+jHvFT0X97aERh/f0MUKAKgFnwCYBEW4TFBqtHWFYiJFid7fMrtpZ/gxJthvz5mEByA==} engines: {node: '>=12'} @@ -4236,11 +3312,6 @@ packages: readable-stream: 2.3.8 dev: false - /leven@3.1.0: - resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} - engines: {node: '>=6'} - dev: true - /lie@3.3.0: resolution: {integrity: sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==} dependencies: @@ -4306,16 +3377,26 @@ packages: /lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false /listenercount@1.0.1: resolution: {integrity: sha512-3mk/Zag0+IJxeDrxSgaDPy4zZ3w05PRZeJNnlWhzFz5OkX49J4krc+A8X2d2M69vGMBEX0uyl8M+W+8gH+kBqQ==} dev: false + /local-pkg@0.5.0: + resolution: {integrity: sha512-ok6z3qlYyCDS4ZEU27HaU6x/xZa9Whf8jD4ptH5UZTQYZVYeb9bnZ3ojVhiJNLiXK1Hfc0GNbLXcmZ5plLDDBg==} + engines: {node: '>=14'} + dependencies: + mlly: 1.7.1 + pkg-types: 1.1.1 + dev: true + /locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} dependencies: p-locate: 4.1.0 + dev: false /lodash.defaults@4.2.0: resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} @@ -4361,10 +3442,6 @@ packages: resolution: {integrity: sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==} dev: false - /lodash.memoize@4.1.2: - resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} - dev: true - /lodash.union@4.6.0: resolution: {integrity: sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==} dev: false @@ -4390,6 +3467,12 @@ packages: /lookup-closest-locale@6.2.0: resolution: {integrity: sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==} + /loupe@2.3.7: + resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==} + dependencies: + get-func-name: 2.0.2 + dev: true + /lowercase-keys@2.0.0: resolution: {integrity: sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==} engines: {node: '>=8'} @@ -4400,12 +3483,6 @@ packages: engines: {node: 14 || >=16.14} dev: true - /lru-cache@5.1.1: - resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} - dependencies: - yallist: 3.1.1 - dev: true - /lru-cache@6.0.0: resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} engines: {node: '>=10'} @@ -4423,29 +3500,22 @@ packages: /lru_map@0.3.3: resolution: {integrity: sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==} + /magic-string@0.30.10: + resolution: {integrity: sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} dependencies: semver: 6.3.1 - /make-dir@4.0.0: - resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} - engines: {node: '>=10'} - dependencies: - semver: 7.6.2 - dev: true - /make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} dev: true - /makeerror@1.0.12: - resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} - dependencies: - tmpl: 1.0.5 - dev: true - /marky@1.2.5: resolution: {integrity: sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==} @@ -4486,6 +3556,12 @@ packages: /mimic-fn@2.1.0: resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} engines: {node: '>=6'} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: true /mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} @@ -4501,6 +3577,7 @@ packages: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} dependencies: brace-expansion: 1.1.11 + dev: false /minimatch@5.1.6: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} @@ -4550,6 +3627,15 @@ packages: hasBin: true dev: false + /mlly@1.7.1: + resolution: {integrity: sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==} + dependencies: + acorn: 8.11.3 + pathe: 1.1.2 + pkg-types: 1.1.1 + ufo: 1.5.3 + dev: true + /mnemonist@0.39.6: resolution: {integrity: sha512-A/0v5Z59y63US00cRSLiloEIw3t5G+MiKz4BhX21FI+YBJXBOGW0ohFxTxO08dsOYlzxo87T7vGfZKYp2bcAWA==} dependencies: @@ -4584,8 +3670,10 @@ packages: dependencies: lru-cache: 7.18.3 - /natural-compare@1.4.0: - resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true dev: true /netmask@2.0.2: @@ -4604,28 +3692,21 @@ packages: whatwg-url: 5.0.0 dev: false - /node-int64@0.4.0: - resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} - dev: true - - /node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - dev: true - /normalize-path@3.0.0: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} + dev: false /normalize-url@6.1.0: resolution: {integrity: sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==} engines: {node: '>=10'} dev: false - /npm-run-path@4.0.1: - resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} - engines: {node: '>=8'} + /npm-run-path@5.3.0: + resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} dependencies: - path-key: 3.1.1 + path-key: 4.0.0 dev: true /nwsapi@2.2.10: @@ -4649,6 +3730,14 @@ packages: engines: {node: '>=6'} dependencies: mimic-fn: 2.1.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: true /open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} @@ -4688,18 +3777,28 @@ packages: engines: {node: '>=6'} dependencies: p-try: 2.2.0 + dev: false /p-limit@3.1.0: resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} engines: {node: '>=10'} dependencies: yocto-queue: 0.1.0 + dev: false + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: true /p-locate@4.1.0: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} dependencies: p-limit: 2.3.0 + dev: false /p-queue@6.6.2: resolution: {integrity: sha512-RwFpb72c/BhQLEXIZ5K2e+AhgNVmIejGlTgiB9MzZ0e93GRvqZ7uSi0dvRF7/XIXDeNkra2fNHBxTyPDGySpjQ==} @@ -4727,6 +3826,7 @@ packages: /p-try@2.2.0: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + dev: false /pac-proxy-agent@7.0.1: resolution: {integrity: sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==} @@ -4777,6 +3877,7 @@ packages: error-ex: 1.3.2 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 + dev: false /parse5@6.0.1: resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} @@ -4789,16 +3890,23 @@ packages: /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + dev: false /path-is-absolute@1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} + dev: false /path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} dev: true + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: true + /path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -4814,6 +3922,14 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} + /pathe@1.1.2: + resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + dev: true + + /pathval@1.1.1: + resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==} + dev: true + /pend@1.2.0: resolution: {integrity: sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==} @@ -4893,21 +4009,34 @@ packages: sonic-boom: 4.0.1 thread-stream: 3.0.2 - /pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - dev: true - /pkg-dir@4.2.0: resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} engines: {node: '>=8'} dependencies: find-up: 4.1.0 + dev: false + + /pkg-types@1.1.1: + resolution: {integrity: sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==} + dependencies: + confbox: 0.1.7 + mlly: 1.7.1 + pathe: 1.1.2 + dev: true /pony-cause@2.1.11: resolution: {integrity: sha512-M7LhCsdNbNgiLYiP4WjsfLUuFmCfnjdF6jKe2R9NKl4WFN+HZPGHJZ9lnLP7f9ZnKe3U9nuWD0szirmj+migUg==} engines: {node: '>=12.0.0'} + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.1 + source-map-js: 1.2.0 + dev: true + /pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -4932,14 +4061,6 @@ packages: resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} engines: {node: '>=0.4.0'} - /prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - dev: true - /proxy-addr@2.0.7: resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} engines: {node: '>= 0.10'} @@ -5085,10 +4206,6 @@ packages: - utf-8-validate dev: false - /pure-rand@6.1.0: - resolution: {integrity: sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==} - dev: true - /querystringify@2.2.0: resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} dev: false @@ -5181,13 +4298,6 @@ packages: resolution: {integrity: sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==} dev: false - /resolve-cwd@3.0.0: - resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} - engines: {node: '>=8'} - dependencies: - resolve-from: 5.0.0 - dev: true - /resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -5197,11 +4307,6 @@ packages: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - /resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - dev: true - /resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -5268,6 +4373,32 @@ packages: resolution: {integrity: sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==} engines: {node: '>=10.0.0'} + /rollup@4.18.0: + resolution: {integrity: sha512-QmJz14PX3rzbJCN1SG4Xe/bAAX2a6NpCP8ab2vfu2GiUr8AQcr2nCV/oEO3yneFarB67zk8ShlIyWb2LGTb3Sg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.18.0 + '@rollup/rollup-android-arm64': 4.18.0 + '@rollup/rollup-darwin-arm64': 4.18.0 + '@rollup/rollup-darwin-x64': 4.18.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.18.0 + '@rollup/rollup-linux-arm-musleabihf': 4.18.0 + '@rollup/rollup-linux-arm64-gnu': 4.18.0 + '@rollup/rollup-linux-arm64-musl': 4.18.0 + '@rollup/rollup-linux-powerpc64le-gnu': 4.18.0 + '@rollup/rollup-linux-riscv64-gnu': 4.18.0 + '@rollup/rollup-linux-s390x-gnu': 4.18.0 + '@rollup/rollup-linux-x64-gnu': 4.18.0 + '@rollup/rollup-linux-x64-musl': 4.18.0 + '@rollup/rollup-win32-arm64-msvc': 4.18.0 + '@rollup/rollup-win32-ia32-msvc': 4.18.0 + '@rollup/rollup-win32-x64-msvc': 4.18.0 + fsevents: 2.3.3 + dev: true + /run-parallel@1.2.0: resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} dependencies: @@ -5355,6 +4486,10 @@ packages: engines: {node: '>=8'} dev: true + /siginfo@2.0.0: + resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} + dev: true + /signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} @@ -5363,10 +4498,6 @@ packages: engines: {node: '>=14'} dev: true - /sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - dev: true - /sitemapper@3.2.8: resolution: {integrity: sha512-xs1W76bRtJYn6WLQePX1QQaBBjhZgaimu1LbskJ9/8nv71Y+YSM3XRMdLYSiLeObCKuUh45zk+AOUUMKbVMbmg==} engines: {node: '>= 10.0.0'} @@ -5413,16 +4544,16 @@ packages: dependencies: atomic-sleep: 1.0.0 - /source-map-support@0.5.13: - resolution: {integrity: sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==} - dependencies: - buffer-from: 1.1.2 - source-map: 0.6.1 + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} dev: true /source-map@0.6.1: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} + requiresBuild: true + optional: true /speedline-core@1.4.3: resolution: {integrity: sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==} @@ -5446,11 +4577,12 @@ packages: resolution: {integrity: sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==} engines: {node: '>= 0.6'} - /stack-utils@2.0.6: - resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} - engines: {node: '>=10'} - dependencies: - escape-string-regexp: 2.0.0 + /stackback@0.0.2: + resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + dev: true + + /std-env@3.7.0: + resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} dev: true /stdin-discarder@0.2.2: @@ -5471,14 +4603,6 @@ packages: resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} engines: {node: '>=0.6.19'} - /string-length@4.0.2: - resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} - engines: {node: '>=10'} - dependencies: - char-regex: 1.0.2 - strip-ansi: 6.0.1 - dev: true - /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} @@ -5533,25 +4657,28 @@ packages: engines: {node: '>=4'} dev: true - /strip-bom@4.0.0: - resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} - engines: {node: '>=8'} - dev: true - - /strip-final-newline@2.0.0: - resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} - engines: {node: '>=6'} + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} dev: true /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} + dev: false + + /strip-literal@2.1.0: + resolution: {integrity: sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==} + dependencies: + js-tokens: 9.0.0 + dev: true /supports-color@5.5.0: resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} engines: {node: '>=4'} dependencies: has-flag: 3.0.0 + dev: false /supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} @@ -5622,15 +4749,6 @@ packages: resolution: {integrity: sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ==} engines: {node: '>=8.0.0'} - /test-exclude@6.0.0: - resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} - engines: {node: '>=8'} - dependencies: - '@istanbuljs/schema': 0.1.3 - glob: 7.2.3 - minimatch: 3.1.2 - dev: true - /text-decoder@1.1.0: resolution: {integrity: sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==} dependencies: @@ -5674,6 +4792,20 @@ packages: resolution: {integrity: sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==} engines: {node: '>=8'} + /tinybench@2.8.0: + resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + dev: true + + /tinypool@0.8.4: + resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==} + engines: {node: '>=14.0.0'} + dev: true + + /tinyspy@2.2.1: + resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==} + engines: {node: '>=14.0.0'} + dev: true + /tldts-core@6.1.23: resolution: {integrity: sha512-NoYYa06h5WN9BU4wjpVK/bKg3fw2BlhZSB1omr+CkEygSzhe5Ojp8mTFae93eVV2mv7d/ootxPqVhW1GoCeogw==} @@ -5687,15 +4819,6 @@ packages: engines: {node: '>=14.14'} dev: false - /tmpl@1.0.5: - resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} - dev: true - - /to-fast-properties@2.0.0: - resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} - engines: {node: '>=4'} - dev: true - /to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -5740,43 +4863,6 @@ packages: resolution: {integrity: sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ==} dev: false - /ts-jest@29.1.5(@babel/core@7.24.7)(jest@29.7.0)(typescript@5.4.5): - resolution: {integrity: sha512-UuClSYxM7byvvYfyWdFI+/2UxMmwNyJb0NPkZPQE2hew3RurV7l7zURgOHAd/1I1ZdPpe3GUsXNXAcN8TFKSIg==} - engines: {node: ^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@babel/core': '>=7.0.0-beta.0 <8' - '@jest/transform': ^29.0.0 - '@jest/types': ^29.0.0 - babel-jest: ^29.0.0 - esbuild: '*' - jest: ^29.0.0 - typescript: '>=4.3 <6' - peerDependenciesMeta: - '@babel/core': - optional: true - '@jest/transform': - optional: true - '@jest/types': - optional: true - babel-jest: - optional: true - esbuild: - optional: true - dependencies: - '@babel/core': 7.24.7 - bs-logger: 0.2.6 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0 - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.2 - typescript: 5.4.5 - yargs-parser: 21.1.1 - dev: true - /ts-morph@20.0.0: resolution: {integrity: sha512-JVmEJy2Wow5n/84I3igthL9sudQ8qzjh/6i4tmYCm6IqYyKFlNbJZi7oBdjyqcWSWYRu3CtL0xbT6fS03ESZIg==} dependencies: @@ -5839,11 +4925,6 @@ packages: engines: {node: '>=4'} dev: true - /type-fest@0.21.3: - resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} - engines: {node: '>=10'} - dev: true - /type-fest@3.13.1: resolution: {integrity: sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==} engines: {node: '>=14.16'} @@ -5863,6 +4944,10 @@ packages: engines: {node: '>=14.17'} hasBin: true + /ufo@1.5.3: + resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + dev: true + /umzug@3.3.1(@types/node@18.19.33): resolution: {integrity: sha512-jG3C35jti1YnCuH/k3fJEfHbnIG9c3Q9ITZ0B9eWwnXngh/AUd0mRHv8OdpE2Q9VoK7tB6xL990JrMCr0LtfNA==} engines: {node: '>=12'} @@ -5918,17 +5003,6 @@ packages: setimmediate: 1.0.5 dev: false - /update-browserslist-db@1.0.16(browserslist@4.23.1): - resolution: {integrity: sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - dependencies: - browserslist: 4.23.1 - escalade: 3.1.2 - picocolors: 1.0.1 - dev: true - /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: @@ -5962,13 +5036,115 @@ packages: resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} dev: true - /v8-to-istanbul@9.2.0: - resolution: {integrity: sha512-/EH/sDgxU2eGxajKdwLCDmQ4FWq+kpi3uCmBGpw1xJtnAxEjlD8j8PEiGWpCIMIs3ciNAgH0d3TTJiUkYzyZjA==} - engines: {node: '>=10.12.0'} + /vite-node@1.6.0: + resolution: {integrity: sha512-de6HJgzC+TFzOu0NTC4RAIsyf/DY/ibWDYQUcuEA84EMHhcefTUGkjFHKKEJhQN4A+6I0u++kr3l36ZF2d7XRw==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + dependencies: + cac: 6.7.14 + debug: 4.3.5 + pathe: 1.1.2 + picocolors: 1.0.1 + vite: 5.3.1 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + dev: true + + /vite@5.3.1: + resolution: {integrity: sha512-XBmSKRLXLxiaPYamLv3/hnP/KXDai1NDexN0FpkTaZXTfycHvkRHoenpgl/fvuK/kPbB6xAgoyiryAhQNxYmAQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + esbuild: 0.21.5 + postcss: 8.4.38 + rollup: 4.18.0 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /vitest@1.6.0: + resolution: {integrity: sha512-H5r/dN06swuFnzNFhq/dnz37bPXnq8xB2xB5JOVk8K09rUtoeNN+LHWkoQ0A/i3hvbUKKcCei9KpbxqHMLhLLA==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@edge-runtime/vm': '*' + '@types/node': ^18.0.0 || >=20.0.0 + '@vitest/browser': 1.6.0 + '@vitest/ui': 1.6.0 + happy-dom: '*' + jsdom: '*' + peerDependenciesMeta: + '@edge-runtime/vm': + optional: true + '@types/node': + optional: true + '@vitest/browser': + optional: true + '@vitest/ui': + optional: true + happy-dom: + optional: true + jsdom: + optional: true dependencies: - '@jridgewell/trace-mapping': 0.3.25 - '@types/istanbul-lib-coverage': 2.0.6 - convert-source-map: 2.0.0 + '@vitest/expect': 1.6.0 + '@vitest/runner': 1.6.0 + '@vitest/snapshot': 1.6.0 + '@vitest/spy': 1.6.0 + '@vitest/utils': 1.6.0 + acorn-walk: 8.3.2 + chai: 4.4.1 + debug: 4.3.5 + execa: 8.0.1 + local-pkg: 0.5.0 + magic-string: 0.30.10 + pathe: 1.1.2 + picocolors: 1.0.1 + std-env: 3.7.0 + strip-literal: 2.1.0 + tinybench: 2.8.0 + tinypool: 0.8.4 + vite: 5.3.1 + vite-node: 1.6.0 + why-is-node-running: 2.2.2 + transitivePeerDependencies: + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser dev: true /w3c-hr-time@1.0.2: @@ -5985,12 +5161,6 @@ packages: xml-name-validator: 3.0.0 dev: false - /walker@1.0.8: - resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} - dependencies: - makeerror: 1.0.12 - dev: true - /webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} dev: false @@ -6039,6 +5209,15 @@ packages: isexe: 2.0.0 dev: true + /why-is-node-running@2.2.2: + resolution: {integrity: sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==} + engines: {node: '>=8'} + hasBin: true + dependencies: + siginfo: 2.0.0 + stackback: 0.0.2 + dev: true + /wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -6067,14 +5246,6 @@ packages: signal-exit: 3.0.7 typedarray-to-buffer: 3.1.5 - /write-file-atomic@4.0.2: - resolution: {integrity: sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - dependencies: - imurmurhash: 0.1.4 - signal-exit: 3.0.7 - dev: true - /ws@7.5.9: resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} engines: {node: '>=8.3.0'} @@ -6141,10 +5312,6 @@ packages: resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} engines: {node: '>=10'} - /yallist@3.1.1: - resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} - dev: true - /yallist@4.0.0: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} @@ -6201,6 +5368,12 @@ packages: /yocto-queue@0.1.0: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + dev: false + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true /zip-stream@4.1.1: resolution: {integrity: sha512-9qv4rlDiopXg4E69k+vMHjNN63YFMe9sZMrdlvKnCjlCRWeCBswPPMPUfx+ipsAWq1LXHe70RcbaHdJJpS6hyQ==}